2011-11-16 59 views
2

我正在重新實現一些使用pthreads的多線程C++圖像處理庫。我希望能夠在每個線程中調用CUDA內核,並且信任設備本身來處理內核調度,但是我知道比指望這種行爲更好。有沒有人有這種類型的問題的經驗?從多線程C++應用程序調用GPU內核?

+0

只有一個鏈接到GPU,所以我相信在同一時間發送多個東西可能更多的問題與操作系統可能比與CPU。唯一簡單的方法就是使用不同的流程。 – Dani

回答

2

CUDA 4.0使得從多個線程驅動單個CUDA上下文簡單得多 - 只需調用cudaSetDevice()來指定希望線程提交命令的CUDA設備。

請注意,這可能比從單個線程驅動CUDA上下文效率更低 - 除非CPU線程有其他工作來保證它們在內核啓動之間被佔用,否則它們可能會被CUDA使用的互斥量序列化在內部保持其數據結構的一致性。

2

也許Cuda流是解決您的問題。嘗試從每個線程中的不同流中調用內核。但是,我不明白這將如何幫助,因爲我認爲即使它們是並行調用的,你的內核執行也會被序列化。事實上,即使在同一個流上的Cuda內核調用本質上也是異步的,所以您可以從同一個線程進行任意數量的調用。我真的不明白你想達到什麼目的。

+1

在單個流上,就主機而言,調用是異步的,但與GPU同步(一切按順序執行,一個操作必須在下一個開始之前完成)。這適用於內存操作以及內核啓動。在單個流中,您不能將計算中的內存操作重疊/交錯。多個流可以重疊,這是潛在優勢的來源。有關更多信息,請參閱此處(有關Streams和Async API的部分):http://mc.stanford.edu/cgi-bin/images/0/0a/M02_4.pdf –