Performance CUDA流比普通内核慢
我试图理解CUDA streams,我已经用streams编写了我的第一个程序,但它比通常的内核函数慢 为什么这段代码比较慢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,
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和驱动程序的一系列执行队列。如果您想要重叠传输和内核执行,您需要设计和实现能够实现这一点的设计模式。溪流不会神奇地为你这样做。