从每个主机线程启动CUDA流
我的意图是使用n个主机线程在NVidia Tesla C2050上并发创建n个流。内核是一个简单的向量乘法…我将数据平均分配到n个流中,每个流都将有并发执行/数据传输 数据是浮点型的,有时CPU/GPU和相等,有时相差很大……我想这可能是因为我的代码中丢失了同步结构,但我认为流之间没有任何同步结构是必要的,因为我希望每个CPU都有一个唯一的流来控制,我不关心线程内的异步数据复制和内核执行 以下是每个线程运行的代码:从每个主机线程启动CUDA流,cuda,Cuda,我的意图是使用n个主机线程在NVidia Tesla C2050上并发创建n个流。内核是一个简单的向量乘法…我将数据平均分配到n个流中,每个流都将有并发执行/数据传输 数据是浮点型的,有时CPU/GPU和相等,有时相差很大……我想这可能是因为我的代码中丢失了同步结构,但我认为流之间没有任何同步结构是必要的,因为我希望每个CPU都有一个唯一的流来控制,我不关心线程内的异步数据复制和内核执行 以下是每个线程运行的代码: //every thread would run this method in
//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);
(i=0;i
threadID[i]=cutStartThread((CUT_THREADROUTINE)solverThread,&plan[i]);
printf(“main():等待GPU结果…\n”);
cutWaitForThreads(threadID,nkernels);
我从一个CUDA代码SDK示例中获取了此策略。正如我之前所说的,这个代码有时会工作,有时会给出任性的结果。我需要帮助修复此代码 首先,凭我的经验,凭任何想象,我都不是专家 我不明白为什么这需要多个主机线程。看起来您正在管理一个设备并将其传递给多个流。我看到这一切的方式(伪代码)
{
创建一个句柄
分配与所需流数相等的流数组
首先,从我的经验来看,我不是任何想象的专家
我不明白为什么这需要多个主机线程。似乎您正在管理一个设备并将其传递给多个流。正如我看到的那样(伪代码)
{
创建一个句柄
分配与所需流数相等的流数组
对于(int n=0;n我打赌
块,螺纹
,不包括要传递的数组的确切大小。
请提供初始化流的代码以及这些缓冲区的大小
顺便说一句,流对于与内存传输重叠的计算很有用。在每次异步调用之后同步流根本没有用。我打赌是这样的
块,螺纹
,不包括要传递的数组的确切大小。
请提供初始化流的代码以及这些缓冲区的大小
作为旁注,流对于重叠计算和内存传输非常有用。在每次异步调用后同步流根本没有用。我目前正在测试各种在GPU上编程的方法,多个CPU线程(每个线程控制一个流)是测试用例之一。这只是一项研究,以了解其行为。我只有cre在上面的例子中,一个GPU上有4个流。顺便说一句,我有一个测试用例,其中一个主机线程控制一个GPU上的4个流(正如您所建议的),这对一定数量的数据来说很好。我目前正在测试各种在GPU上编程的方法,多个CPU线程(每个线程控制一个流)是测试用例之一。这只是一项研究,以了解其行为。对于上面的示例,我只在一个GPU上创建了4个流。顺便说一句,我有一个测试用例,其中一个主机AD是在GPU上控制4个流(正如你所建议的),并且对于一定数量的数据来说是很好的。谢谢你指着那个方向!我的块线程尺寸是32×512,并且每个线程都在创建一个流,考虑在上面的代码> SoultStult函数中,第一行是代码> CUSTASRAMAMCREATE(和计划->流)<代码>谢谢你指着那个方向!我的块线程尺寸是32×512,每个线程都在创建一个流,考虑上面的代码> SoultStult函数。第一行是代码> CUSTASRAMAMCREATE(和计划->流)< /代码>
{
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]);
}
}