2012-12-13 37 views
3

我正在学习cuda,到目前为止我已经了解到cuda有为全局对象分配内存的函数cudaMalloc()。但是现在在一些矩阵乘法代码中,我已经看到他们正在使用称为cudaMemcpy()的另一个函数,它从主机到设备或其他方式复制一个对象。但我不明白为什么它需要?由于cudaMalloc()正在分配全局内存,所有设备内核都应该有权访问它,不是吗?如果cudaMalloc()分配全局内存,那么为什么我需要cudaMemcpy()?

我的误解在哪里?

+0

下一次,请在提交之前考虑证明您的问题。通过这样做,可以修复粗心的拼写错误,并且可以大大提高可读性。 – aLearner

回答

4

cudaMalloc()仅为您提供一块未定义初始值的GPU内存内存。您必须从主机或设备上的某个位置复制预期的内存内容。

5

查看this deck中的幻灯片10,11和12。他们说明了基本的处理流程。通常在内核调用之前出现的cudaMemcpy对应于幻灯片10中的活动。内核调用本身由幻灯片11表示。幻灯片12表示内核调用后发生的cudaMemcpy。 GPU cudaMalloc与CPU malloc类似 - 它只分配空间,但不填充任何数据。一旦使用cudaMalloc在GPU上分配了空间,就需要使用cudaMemcpy将数据复制到该空间。在这种情况下,“全局存储器”是指设备上的存储器,即在幻灯片10,11和12的右侧。设备内核只能与设备上的数据一起工作,即已移至幻灯片10,11和12右侧的DRAM上。

0

在CPU上运行的代码只能访问分配在其(主机)内存中的缓冲区,而GPU代码(CUDA内核)只能访问设备(GPU)内存中的内存。由于在矩阵乘法示例中初始化输入矩阵的代码在CPU上运行,因此它只能在主机内存中执行。然后它必须调用cudaMemcpy,以便将这些matricies复制到它在设备内存中分配的空间,因为它不能直接在那里写入它。然后启动CUDA内核,对设备内存中的设备进行处理,并将结果存储在设备内存的另一个缓冲区中。 cudaMemcpy然后在内核完成后将结果从设备内存复制到主机内存中再次使用,以便主机代码可以再次使用结果(例如,显示或存储结果)。

0

所有内存分配和复制只能从主机完成。

对于所有GPU活动,内存将被分配到设备(GPU)中,该设备应该从主机(CPU)启动。

之后,主机的内存将被传输到设备(Memcpy)进行计算/处理。

然后在此之后,内核被调用来进行计算。

然后在设备中计算的结果通过Memcpy传回主机。

+0

这不完全正确。内核内部的内存分配已经支持好几年了,因为它拥有零拷贝内存,允许gpu在主机上写入主机内存而不需要明确的memcpy调用。 – talonmies

+0

但是仍然需要通过在UnifiedVirtual地址空间中调用cudaHostGetDevicePointer()来使用设备类型指针。我们不能直接在GPU中使用主机内存,即使用malloc或主机中的new进行全部内存。 – Sijo

1

malloc()在主机上分配动态内存,即在CPU上。 在设备上分配全局内存需要调用cudaMalloc()。 要使用GPU对数据进行操作,需要在全局内存上传输洞数据。 cudaMalloc()只分配内存,它不会将数据复制到设备内存中。因此,要将数据从主机内存复制到设备内存,您需要调用cudaMemcpy()。