CUDA memcpy async不会立即返回

时间:2013-12-26 16:26:20

标签: optimization cuda parallel-processing gpu data-transfer

以下是我的代码,它试图实现非阻塞cuda内存复制主机到设备。

for (i = 0; i < ldu; ++i)
{
     cudaMemcpyAsync(dA+i*num_row, &A+i*LDA,
         num_row*sizeof(double), cudaMemcpyHostToDevice,streams[0]) ; 

}

每次此类通话的平均时间约为10微秒。我试过阻止版本需要30微秒。 10微秒,对于非阻塞呼叫似乎很多。 A使用cudaHostalloc分配。我在装有1个Tesla C2050的机器上运行我的代码,并使用cuda 5.5版来编译代码。我已经读过gpu PCI传输延迟(与非阻塞调用有点无关,但是为了了解时间顺序)大约是5us。因此,非阻塞呼叫的返回时间为10 us有点偏高。我能做些什么来加速它?

我尝试过的一些事情是,使用一个openmp pragma(导致速度变慢),使用不同的流发送数据(平均时间大致相同)

2 个答案:

答案 0 :(得分:3)

  

我能做些什么来加快速度?

我相信你可以用以下代码替换你的复制循环:

cudaMemcpy2DAsync(dA, num_row*sizeof(double), &A, LDA*sizeof(double), num_row*sizeof(double), ldu, cudaMemcpyHostToDevice, streams[0]);

应该显着提高速度(至少从呼叫开销的角度来看)。

您可能需要稍微使用您的参数,因为您的名字对我来说有点混乱(可能您使用的是列主存储)。 cudaMemcpy2DAsync函数记录在案here

答案 1 :(得分:0)

Fermi gpus每个方向只有一个复制引擎。因此,同一方向的所有复制命令都是序列化的,无论它们是否异步。

相关问题