【发布时间】:2011-07-19 17:34:58
【问题描述】:
我的意图是使用 n 个主机线程在 NVidia Tesla C2050 上同时创建 n 个流。内核是一个简单的向量乘法......我将数据平均分配给 n 个流,每个流将同时进行执行/数据传输。
数据是浮点数,有时 CPU/GPU 总和相等,有时它们相差很大...我想这可能是由于我的代码中丢失了同步结构,就我而言,但也我认为流之间不需要任何同步构造,因为我希望每个 CPU 都有一个唯一的流来控制,并且我不关心线程内的异步数据复制和内核执行。
以下是每个线程运行的代码:
//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;
}
并创建多个线程并调用上述函数:
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 示例中采用了这个策略。正如我之前所说,这段代码有时会起作用,而有时它会给出任性的结果。我需要帮助来修复此代码...
【问题讨论】:
标签: cuda