2014-02-14 36 views
1

我有一個從單個CPU線程調用時可以正常工作的cuda內核。但是,當從多個CPU線程(〜100)調用相同的內核時,大多數內核似乎根本不會被執行,因爲結果全部爲零。請某人請指導我如何解決此問題?如何從多個CPU線程管理相同的CUDA內核調用?

在當前版本的內核中,我在內核調用結束時使用了cudadevicesynchronize()。在這種情況下,在cudaMalloc()和內核調用之前是否會添加一個同步命令?

還有一件事需要澄清。即,如果兩個CPU線程執行相同的cudaMalloc()命令,後者是否會在GPU內存中覆蓋前者或者是否會創建自己的內存?

在此先感謝您的幫助

+0

相同的內核 - >相同的數組--->可能相同的元素--->未定義的行爲。嘗試使用不同名稱和不同緩衝區的相同內核。 –

+0

你是否建議爲每個線程創建不同名稱的內核拷貝? – Genutek

+0

如果您可以從最初的.cu文件編程創建一個新的.cu文件,那麼您應該嘗試。編譯時間可以增加。我曾經爲我的raytracer遞歸函數(假遞歸) –

回答

4

通常一個CPU線程可用於調用CUDA內核。但是,自CUDA 4.0以來,多個CPU線程可以共享上下文。您可以使用cuCtxSetCurrent將內核的上下文與當前線程綁定。有關此API函數的更多信息可以參見here

對此的另一個解決方法是創建一個GPU工作線程來保存上下文並將任何CUDA請求傳遞給該線程。

關於你的其他問題,沒有設置正確的線程的上下文,我記得cudaMalloc甚至不會執行(我與JCUD工作,所以行爲可能會有點不同)。但是如果上下文當前被設置爲調用內核,那麼內存不會被覆蓋。

+0

非常感謝您的回覆。我將在我未來的任務中明確地使用它,但對於我目前的情況,正如[TripleS](http://stackoverflow.com/users/907166/triples)所建議的紋理內存將只有一個實例。我認爲主要問題是紋理內存。如果時間允許,我會嘗試用全局內存替換紋理,以檢查問題是否仍然存在。 – Genutek