如果cudaMalloc()分配全局内存,那么为什么我需要cudaMemcpy()?

时间:2012-12-13 06:45:11

标签: cuda parallel-processing

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

我的误解在哪里?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

之后,将来自主机的存储器传送到设备(Memcpy)进行计算/处理。

然后,在内核中调用内核进行计算。

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