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

sad*_*605 3 parallel-processing cuda

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

我的误会在哪里?

Rob*_*lla 7

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


sma*_*ato 5

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