用cudaMemPrefetchAsync替换cudaMemcpy2D

时间:2019-05-29 13:54:26

标签: c++ cuda unified-memory

我正在尝试以cudaMemcpy2DAsync()提供的相同方式,对统一内存中驻留的数据进行异步内存传输(主机到设备),也就是说,将 pitch值用于目标(设备)内存。

不过,据我了解:

  • 我无法使用cudaMemcpy2DAsync(),因为它需要固定的内存,并且使用cudaMallocManaged()分配的统一内存块默认情况下不固定,也不能手动固定。

  • 我不能使用cudaMemPrefetchAsync(),因为它只复制连续的内存块,而cudaMemcpy2DAsync()包含其他选项,可以根据给定的音调值来缓冲我的数据行。

我的问题:

我如何以(b) 异步方式传输(a) 驻留在统一内存中的数据 从主机到设备,同时确保以正确的音调值将(c) 复制数据

我目前使用cudaMemcpy2D()进行的转帐看起来像这样:

cudaMemcpy2D( 
    dest_ptr, dest_pitch,         // dst address & pitch
    src_ptr, dim_x*sizeof(float)  // src address & pitch
    dim_x*sizeof(float), dim_y,   // transfer width & height
    cudaMemcpyHostToDevice ) );

(如您所见,源端的音高实际上为零,而目标端的音高为dest_pitch,也许有帮助吗?)

另一个麻烦事是,我没有分配自己需要传输的数据,因此如果不创建数据的其他副本,就无法手动应用音调(这是有问题的)。

我的一个想法是简单地按行复制数据。但是,这将意味着大量非常小的数据传输,听起来有些可怕。在我的示例中,将是3,040,000个传输,每个传输304个字节。.但是,如果传输跨多个流异步分布,那么在Pascal上就可以了。

任何指针/想法都将不胜感激!

1 个答案:

答案 0 :(得分:0)

答案是您需要进行复印。具有统一内存的异步副本不支持音调,因为统一内存不支持音调。您可以将设备上的预取统一缓冲区复制到特定内存区域中,也可以将主机中的统一缓冲区复制到特定内存区域中,然后进行异步复制。您不能同时满足所有三个条件(a,b和c)