【发布时间】:2012-08-28 08:25:25
【问题描述】:
CUDA 编程指南指出“可以使用运行时复制通过malloc() 分配的内存(即,通过从设备内存调用任何复制内存函数)”,但不知何故我无法重现此功能。代码:
#include <cstdio>
__device__ int* p;
__global__ void allocate_p() {
p = (int*) malloc(10);
printf("p = %p (seen by GPU)\n", p);
}
int main() {
cudaError_t err;
int* localp = (int*) malloc(10);
allocate_p<<<1,1>>>();
cudaDeviceSynchronize();
//Getting pointer to device-allocated memory
int* tmpp = NULL;
cudaMemcpyFromSymbol(&tmpp, p, 4);
printf("p = %p (seen by CPU)\n", tmpp);
//cudaMalloc((void**)&tmpp, 40);
err = cudaMemcpy(tmpp, localp, 40, cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
printf(" err:%i %s", (int)err, cudaGetErrorString(err));
delete localp;
return 0;
}
输出崩溃:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
我推测,主机在设备上看到了适当的地址,但不知何故不喜欢它来自malloc()。
如果我之前通过cudaMalloc((void**)&np, 40); 分配,然后将指针np 作为参数传递给内核allocate_p,它将被分配给p(而不是malloc()),那么代码运行良好。
我做错了什么/我们如何在主机端函数中使用 malloc() 分配的设备内存?
【问题讨论】:
-
您引用的部分来自“B.17.2 与主机内存 API 的互操作性”部分。 malloc() 是指主机 malloc() 而不是设备 malloc()。这绝对是令人困惑的,因为它遵循介绍设备 malloc() 的“B.17.1 堆内存分配”部分。
-
@GregSmith:我无法理解您是如何得出这种解释的。该部分是关于设备动态内存分配的(甚至还有显示内核 malloc 调用的代码示例),并且参考了第 3.2.2 节中描述的主机内存 API 函数,即。 cudaMemcpy。 host malloc 在哪里出现?我不会说它写得很混乱,我会说它完全是错误的(或者在运行时有一个巨大的错误作为替代方案)。
-
@talonmies 是的,该部分在旧手册中是错误的,并且被复制到不同的位置。该语句应从下一版本的编程指南中删除。
标签: pointers memory-management cuda