我正在尝试理解CUDA流,并且我已经使用流创建了我的第一个程序,但它比通常的内核函数慢...
为什么这段代码更慢
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...
比:
cudaMemcpy(pole_dev, pole, size, cudaMemcpyHostToDevice);
addKernel<<<count/100, 100>>>(pole_dev);
cudaMemcpy(pole, pole_dev, size, cudaMemcpyDeviceToHost);
我认为应该跑得更快......变数的值是6 500 000(最大值)...... 第一个源代码需要14毫秒,第二个源代码需要11毫秒。
有人可以向我解释一下吗?
答案 0 :(得分:2)
在这个片段中,您只想处理一个流(stream_1
),但实际上,当您没有明确地操纵流时,CUDA会自动为您做什么。
要利用流和异步内存传输,您需要使用多个流,并通过每个流分割数据和计算。