Optimization CUDA memcpy async不会立即返回

Optimization CUDA memcpy async不会立即返回,optimization,cuda,parallel-processing,gpu,data-transfer,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]) ; } (i=0;i

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

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

}
(i=0;i { cudaMemcpyAsync(dA+i*num_行和A+i*LDA, num_row*sizeof(double),cudaMemcpyHostToDevice,streams[0]); } 每次通话的平均时间约为10微秒。我试过用30微秒的时间来屏蔽这个版本。10微秒,对于一个非阻塞调用来说似乎太多了。A使用cudaHostalloc分配。我在配备1台特斯拉C2050的机器上运行代码,并使用cuda 5.5版编译代码。我已经读到gpu PCI传输延迟(与非阻塞调用有点无关,但给出一个时间顺序的概念)大约为5us。因此,非阻塞调用的返回时间为10us有点偏高。我能做些什么来加速它

我尝试过的两件事是,使用openmp pragma(这会导致速度减慢),使用不同的流发送数据(平均时间大致相同)

我能做些什么来加速它

我相信您可以用以下内容替换复制循环:

cudaMemcpy2DAsync(dA, num_row*sizeof(double), &A, LDA*sizeof(double), num_row*sizeof(double), ldu, cudaMemcpyHostToDevice, streams[0]);
这将大大加快速度(至少从呼叫开销的角度来看)

您可能需要稍微处理一下参数,因为您的名字让我有些困惑(可能您使用的是列主存储)。
cudaMemcpy2DAsync
功能已记录在案

我能做些什么来加速它

我相信您可以用以下内容替换复制循环:

cudaMemcpy2DAsync(dA, num_row*sizeof(double), &A, LDA*sizeof(double), num_row*sizeof(double), ldu, cudaMemcpyHostToDevice, streams[0]);
这将大大加快速度(至少从呼叫开销的角度来看)

您可能需要稍微处理一下参数,因为您的名字让我有些困惑(可能您使用的是列主存储)。
cudaMemcpy2DAsync
功能已记录在案

我能做些什么来加速它

我相信您可以用以下内容替换复制循环:

cudaMemcpy2DAsync(dA, num_row*sizeof(double), &A, LDA*sizeof(double), num_row*sizeof(double), ldu, cudaMemcpyHostToDevice, streams[0]);
这将大大加快速度(至少从呼叫开销的角度来看)

您可能需要稍微处理一下参数,因为您的名字让我有些困惑(可能您使用的是列主存储)。
cudaMemcpy2DAsync
功能已记录在案

我能做些什么来加速它

我相信您可以用以下内容替换复制循环:

cudaMemcpy2DAsync(dA, num_row*sizeof(double), &A, LDA*sizeof(double), num_row*sizeof(double), ldu, cudaMemcpyHostToDevice, streams[0]);
这将大大加快速度(至少从呼叫开销的角度来看)



您可能需要稍微处理一下参数,因为您的名字让我有些困惑(可能您使用的是列主存储)。cudaMemcpy2DAsync功能已记录在案。

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

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

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

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

这是在windows还是linux中?如果只发出一个调用而不是一系列调用,您会在什么时候进行度量?在linux中是这样的。我会在一次呼叫后的第二部分给您回复,即,如果我更改ldu=1,则返回时间大约为3.5秒,因为似乎有许多异步副本可以排队到单个流中,超过这些副本,排队性能将大大降低。这个数字似乎在1000-10000之间。所以我猜,对于您的测试,
ldu
在这个范围内。这是。在1000个排队拷贝以下,平均开销小于3us。超过10000份,平均开销超过20us。但是,我相信您可以通过调用
cudaMemcpy2DAsync
来替换复制循环。这是在windows还是linux中?如果只发出一个调用而不是一系列调用,您会在什么时候进行度量?在linux中是这样的。我会在一次呼叫后的第二部分给您回复,即,如果我更改ldu=1,则返回时间大约为3.5秒,因为似乎有许多异步副本可以排队到单个流中,超过这些副本,排队性能将大大降低。这个数字似乎在1000-10000之间。所以我猜,对于您的测试,
ldu
在这个范围内。这是。在1000个排队拷贝以下,平均开销小于3us。超过10000份,平均开销超过20us。但是,我相信您可以通过调用
cudaMemcpy2DAsync
来替换复制循环。这是在windows还是linux中?如果只发出一个调用而不是一系列调用,您会在什么时候进行度量?在linux中是这样的。我会在一次呼叫后的第二部分给您回复,即,如果我更改ldu=1,则返回时间大约为3.5秒,因为似乎有许多异步副本可以排队到单个流中,超过这些副本,排队性能将大大降低。这个数字似乎在1000-10000之间。所以我猜,对于您的测试,
ldu
在这个范围内。这是。在1000个排队拷贝以下,平均开销小于3us。超过10000份,平均开销超过20us。但是,我相信您可以通过调用
cudaMemcpy2DAsync
来替换复制循环。这是在windows还是linux中?如果只发出一个调用而不是一系列调用,您会在什么时候进行度量?在linux中是这样的。我会在一次呼叫后的第二部分给您回复,即,如果我更改ldu=1,则返回时间大约为3.5秒,因为似乎有许多异步副本可以排队到单个流中,超过这些副本,排队性能将大大降低。这个麻木的