3

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

我的误解在哪里?

4

5 回答 5

8

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

于 2012-12-13T06:56:45.637 回答
5

cudaMalloc() 仅在 GPU 内存上为您提供一块具有未定义初始值的内存。您必须从主机或设备上的某处复制您想要的内存内容。

于 2012-12-13T06:47:52.340 回答
1

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

于 2013-05-30T15:10:32.407 回答
0

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

于 2012-12-13T16:55:16.540 回答
0

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

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

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

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

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

于 2012-12-17T12:21:06.497 回答