我在多個GPU上實現我的程序... 我的電腦中有兩個GPU,並且想要生成兩個獨立的流來處理這兩個設備。我已經產生兩個流:使用獨立流在多個GPU上同時調用相同的cuda功能
cudaStream_t *streams;
streams = (cudaStream_t*) malloc(nstreams * sizeof(cudaStream_t));
for(int j = 0; j < nstreams; j++){
cudaStreamCreate(&(streams[j]));
}
然後我打電話與設備ID內核作爲一個參數,按照SDK中的例子。 根據設備ID,cudaDevice設置(cudaSetDevice(DEV_ID))和內核調用與各自的流通過:
kernel1<<< grid, block,0,streamNo >>>(tex, size);................
for (i = 0;i<gpuN;i++){
initialize(i);
printf("initialization done with stream %i on device %i\n", (int)streams[i], i);
runTest(i);
printf("running tests done with %i stream \n", i);
deini(i);
printf("deinitialization is done\n");
}
我的程序工作正常用兩種不同的數據流,但它運行順序。 我想使用兩個設備同時使用兩個獨立的流來運行功能。任何人都可以幫我解決這個問題嗎?
我與CUDA 4.2工作使用您創建的依賴於上下文您在創建他們二特斯拉2070
感謝您的快速回復..我仍然有同樣的問題。當我運行我的cuda函數runTest(i)(它包含許多內核)時,我將device_ID作爲設備ID傳遞給每個設備,但程序正在運行......但一個接一個地運行一個設備......它需要雙倍的時間作爲單個卡。我沒有太多關於流的想法,我只是遵循SDK示例創建2個不同的流來處理我的兩個GPU設備......基本上我需要我的程序在兩個設備上同時運行......期待您的建議。 – vishva 2012-07-17 16:45:05
什麼API函數在你的'runTest()'例程中使用? – talonmies 2012-07-17 18:12:18
@vishva在啓動內核之後(或在算法中的任何位置?),你是否需要cudaThreadSynchronize()或cuCtxSynchronize()?這將序列化您的程序(即一個設備在另一個之後)。 – 2012-07-17 19:51:12