[英]Launching a CUDA stream from each host thread, will each stream run concurrently?
[英]Launching a CUDA stream from each host thread
我的意圖是使用 n 個主機線程在 NVidia Tesla C2050 上同時創建 n 個流。 kernel 是一個簡單的向量乘法...我將數據平均分配到 n 個流中,每個 stream 將同時進行執行/數據傳輸。
數據是浮點數,我有時會得到 CPU/GPU 的總和相等,有時它們相距甚遠......我想這可能是由於我的代碼丟失了同步結構,就我而言,但我也沒有不認為流之間的任何同步構造都是必要的,因為我希望每個 CPU 都有一個唯一的 stream 來控制,而且我不關心異步數據復制和線程內的 kernel 執行。
以下是每個線程運行的代碼:
//every thread would run this method in conjunction
static CUT_THREADPROC solverThread(TGPUplan *plan)
{
//Allocate memory
cutilSafeCall( cudaMalloc((void**)&plan->d_Data, plan->dataN * sizeof(float)) );
//Copy input data from CPU
cutilSafeCall( cudaMemcpyAsync((void *)plan->d_Data, (void *)plan->h_Data, plan->dataN * sizeof(float), cudaMemcpyHostToDevice, plan->stream) );
//to make cudaMemcpyAsync blocking
cudaStreamSynchronize( plan->stream );
//launch
launch_simpleKernel( plan->d_Data, BLOCK_N, THREAD_N, plan->stream);
cutilCheckMsg("simpleKernel() execution failed.\n");
cudaStreamSynchronize(plan->stream);
//Read back GPU results
cutilSafeCall( cudaMemcpyAsync(plan->h_Data, plan->d_Data, plan->dataN * sizeof(float), cudaMemcpyDeviceToHost, plan->stream) );
//to make the cudaMemcpyAsync blocking...
cudaStreamSynchronize(plan->stream);
cutilSafeCall( cudaFree(plan->d_Data) );
CUT_THREADEND;
}
並創建多線程並調用上述function:
for(i = 0; i < nkernels; i++)
threadID[i] = cutStartThread((CUT_THREADROUTINE)solverThread, &plan[i]);
printf("main(): waiting for GPU results...\n");
cutWaitForThreads(threadID, nkernels);
我從 CUDA 代碼 SDK 樣本之一中采用了這個策略。 正如我之前所說,這段代碼有時會起作用,而有時它會給出任性的結果。 我需要幫助來修復此代碼...
首先,從我的經驗來看,我不是任何想象的專家。
我不明白為什么這需要多個主機線程。 似乎您正在管理一台設備並為其傳遞多個流。 我看到的方式(偽代碼)
{
create a handle
allocate an array of streams equal to the number of streams you want
for(int n=0;n<NUM_STREAMS;n++)
{
cudaStreamCreate(&streamArray[n]);
}
}
從那里您可以將數組中的流傳遞給各種異步調用(cudaMemcpyAsync()、kernel 流等),然后設備管理 rest。 我在多個流中遇到了奇怪的可擴展性問題(不要嘗試制作 10k 流,我在 GTX460 上遇到了 4-8 左右的問題),所以如果你遇到這些問題不要感到驚訝。 祝你好運,
約翰
我敢打賭
塊_N,線程_N
,不要涵蓋您傳遞的數組的確切大小。 請提供初始化流的代碼和這些緩沖區的大小。
附帶說明一下,流對於使用 memory 傳輸進行重疊計算很有用。 在每次異步調用之后同步 stream 根本沒有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.