2011-10-03 42 views
1

我想使用OpenMP和CUDA來實現重疊的內核執行。所有內核調用都是異步的,但我在啓動之間只有很少的代碼,因此各個OpenMP線程在嘗試啓動另一個內核時會阻塞,或者執行一個內存拷貝(在調用之後我並不總是有內存拷貝)異步內存複製不一定是解決方案)。我想要一種方式向OpenMP schedular發信號以切換到另一個OpenMP線程。這在OpenMP中可能嗎?OpenMP中其他線程/任務的收益

例子:

int main() { 
    #pragma omp parallel for 
    for(int i=0;i<10;i++) { 
     for(int j=0;j<10;j++) { 
      //call kernel here 

      // ----> Would like to signal to continue with other 
      //   threads as next call will block 

      //copy data from kernel 
     } 
    } 
} 

回答

0

如果一個線程塊,該操作系統的程序會自動切換到另一個運行的線程(如果有的話),所以你不需要做任何事情。然而,如果你所有的OpenMP程序都在調用CUDA內核,那麼很可能GPU是瓶頸,所以你無論如何都不會從CPU上使用線程獲得太多好處。根本不值得使用OpenMP。

但是,如果您繼續使用OpenMP,那麼您應該添加一個collapse(2)omp parallel for

+0

感謝您的建議。然而,所提供的代碼是我正在做的這類工作的一個非常人爲的例子。實際的代碼不僅僅是爲了循環而堆疊的。你可否詳細說明切換?這僅僅在線程級別上(因此只限於OpenMP線程數),還是更像是「工作」級別。不確定是否讓我自己清楚:我對OpenMP的實現並不瞭解很多 – flipchart

+0

我在操作系統線程級別討論,因爲您詢問了切換到另一個OpenMP線程和OpenMP線程(大概)是否對應本地操作系統線程。如果你現在說你有比線程更多的OpenMP任務,請看看OMP的'taskyield'和'taskwait'指令。然而,這種方法並不是最優的:收益可能會「迴歸」太快,並且您仍然在等待內核完成時浪費CPU時間,或者它可能需要很長時間,並且由於不快速提交新內核而浪費GPU時間足夠。 – Wyzard

+0

太棒了!正是我在找的東西。我會試一試。謝謝你的努力! – flipchart