以下是我的代码,它试图实现非阻塞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(导致速度变慢),使用不同的流发送数据(平均时间大致相同)
答案 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每个方向只有一个复制引擎。因此,同一方向的所有复制命令都是序列化的,无论它们是否异步。