Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance CUDA流比普通内核慢_Performance_Asynchronous_Cuda_Cuda Streams - Fatal编程技术网

Performance CUDA流比普通内核慢

Performance CUDA流比普通内核慢,performance,asynchronous,cuda,cuda-streams,Performance,Asynchronous,Cuda,Cuda Streams,我试图理解CUDA streams,我已经用streams编写了我的第一个程序,但它比通常的内核函数慢 为什么这段代码比较慢 cudaMemcpyAsync(pole_dev, pole, size, cudaMemcpyHostToDevice, stream_1); addKernel<<<count/100, 100, 0, stream_1>>>(pole_dev); cudaMemcpyAsync(pole, pole_dev, size,

我试图理解CUDA streams,我已经用streams编写了我的第一个程序,但它比通常的内核函数慢

为什么这段代码比较慢

cudaMemcpyAsync(pole_dev, pole, size, cudaMemcpyHostToDevice, stream_1);    
addKernel<<<count/100, 100, 0, stream_1>>>(pole_dev);
cudaMemcpyAsync(pole, pole_dev, size, cudaMemcpyDeviceToHost, stream_1);
cudaThreadSynchronize();  // I don't know difference between cudaThreadSync and cudaDeviceSync
cudaDeviceSynchronize();  // it acts relatively same...
cudaMemcpyAsync(极点开发、极点、大小、cudamemcpyhostodevice、流1);
addKernel(pole_dev);
cudaMemcpyAsync(极点,极点开发,大小,cudaMemcpyDeviceToHost,流1);
cudaThreadSynchronize();//我不知道cudaThreadSync和cudaDeviceSync之间的区别
cudaDeviceSynchronize();//它的作用相对相同。。。
比:

cudaMemcpy(pole_dev, pole, size, cudaMemcpyHostToDevice);
addKernel<<<count/100, 100>>>(pole_dev);
cudaMemcpy(pole, pole_dev, size, cudaMemcpyDeviceToHost);
cudaMemcpy(极点开发、极点、大小、cudamemcpyhostodevice);
addKernel(pole_dev);
cudaMemcpy(杆、杆、尺寸、cudaMemcpyDeviceToHost);
我认为它应该跑得更快。。。变量计数的值为6 500 000(最大值)。。。 第一个源代码需要14毫秒,第二个源代码需要11毫秒


有人能给我解释一下吗?

在这段代码中,你喜欢只处理一个流(
stream\u 1
),但实际上,当你不明确地操作流时,CUDA会自动为你做这件事


要利用流和异步内存传输,您需要使用多个流,并通过每个流分割数据和计算。

是什么让您认为第一个流应该比第二个快?此外,对于流,您可能需要CudaStreamSynchronize(),但是在这种情况下,这不会影响性能。所以你的意思是,在第一个memcpy函数中,我应该使用stream_1,在内核中使用stream_2,在第二个memcpy函数中使用stream_3?@snukrabill:streams不能加速这个操作。复制和内核执行之间没有重叠的余地,您必须在内核运行之前完成第一个复制,并且在内核完成之前,您的第二个复制无法启动。我认为流可以将大数组分成小块,内核可以在这些小块上启动。。。正如您所说,现在我需要等待,直到memcpy完成,但我希望memcpy和内核同时运行。。。所以这不是正确的方法?您需要数据的第一部分的第一个同步mempcy,然后启动与此数据对应的第一个内核。内核调用是异步的,这允许您在第一个内核仍在运行时启动第二个memcpy,该memcpy将在第二个数据块上异步。然后可以启动相应的内核,等等…@snukrabill:No-streams只是GPU和驱动程序的一系列执行队列。如果您想要重叠传输和内核执行,您需要设计和实现能够实现这一点的设计模式。溪流不会神奇地为你这样做。