用 cudaMemPrefetchAsync 替换 cudaMemcpy2D

Replacing cudaMemcpy2D with cudaMemPrefetchAsync

我正在尝试以相同的方式对驻留在统一内存中的数据进行异步内存传输(主机到设备) cudaMemcpy2DAsync() 提供,即使用 音高值 作为目标(设备)内存。

但是,据我了解:

我的问题:

如何传输我的数据,(a) 驻留在统一内存(b) 从 Host 到 Device 的异步方式,同时确保数据被复制 (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 上可能没问题..?

任何 pointers/ideas 将不胜感激!

答案是您需要复印一份。统一内存的异步副本不支持pitches,因为统一内存不支持pitches。您可以将设备上预取的统一缓冲区复制到一个倾斜的内存区域,也可以将主机上的统一缓冲区复制到一个倾斜的内存区域,然后异步复制它。您不能同时满足所有三个条件(a、b、c)