簡體   English   中英

從每個主機線程啟動 CUDA stream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM