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