我有一個多線程CPU,我希望CPU的每個線程能夠啓動一個單獨的CUDA流。單獨的CPU線程將在不同的時間做不同的事情,所以有可能它們不會重疊,但如果它們同時啓動CUDA內核,我希望它能夠繼續同時運行。在每個主機線程上創建一個cuda流(多線程CPU)
我很確定這是可能的,因爲在CUDA工具包文檔部分3.2.5.5。它說:「甲流命令(可能由不同的主機線程發佈)的序列......」
所以,如果我想實現這一點,我會做類似
void main(int CPU_ThreadID) {
cudaStream_t *stream;
cudaStreamCreate(&stream);
int *d_a;
int *a;
cudaMalloc((void**)&d_a, 100*sizeof(int));
cudaMallocHost((void**)&a, 100*8*sizeof(int));
cudaMemcpyAsync(d_a, a[100*CPU_ThreadID], 100*size(int), cudaMemcpyHostToDevice, stream);
sum<<<100,32,0,stream>>>(d_a);
cudaStreamDestroy(stream);
}
這只是一個簡單的例。如果我知道只有8個CPU線程,那麼我知道至多8個流將被創建。這是做這件事的正確方法嗎?如果兩個或更多不同的主機線程在同一時間到達此代碼,這是否會同時運行?謝謝你的幫助!
編輯:
我糾正一些語法問題中的代碼塊,並放在cudaMemcpyAsync作爲sgar91建議。
您不必'malloc''stream'指針。另外,如果你想讓流重疊,你可以考慮使用'cudaMemcpyAsync'。 – sgarizvi
@ sgar91:流將處於不同的上下文中,因此它們將永遠不會重疊。 – talonmies
@ sgar91謝謝!我已經在上面進行了這些修改。對於talonmies:那麼沒有辦法讓單獨的CPU線程同時訪問GPU設備嗎?如何強制線程使用與Robert Crovella建議的相同的上下文? – Miggy