我正在尝试以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上就可以了。
任何指针/想法都将不胜感激!
答案 0 :(得分:0)
答案是您需要进行复印。具有统一内存的异步副本不支持音调,因为统一内存不支持音调。您可以将设备上的预取统一缓冲区复制到特定内存区域中,也可以将主机中的统一缓冲区复制到特定内存区域中,然后进行异步复制。您不能同时满足所有三个条件(a,b和c)