-2

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

但是,据我了解:

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

  • 我不能使用cudaMemPrefetchAsync(),因为它只复制一个连续的内存块,而cudaMemcpy2DAsync()包括额外的选项来根据给定的音高值缓冲我的数据行。

我的问题:

如何以异步方式将(a) 驻留在统一内存中的数据(b) 从主机传输到设备,同时确保以正确的间距复制数据(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 上可能没问题..?

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

4

1 回答 1

0

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

于 2019-06-04T02:13:40.863 回答