内存分配是 GPU 中最耗时的操作之一,因此我想通过cudaMalloc
使用以下代码调用一次来分配 2 个数组:
int numElements = 50000;
size_t size = numElements * sizeof(float);
//declarations-initializations
float *d_M = NULL;
err = cudaMalloc((void **)&d_M, 2*size);
//error checking
// Allocate the device input vector A
float *d_A = d_M;
// Allocate the device input vector B
float *d_B = d_M + size;
err = cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
//error checking
err = cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
//error checking
原始代码位于名为 vectorAdd.cu 的 cuda 工具包的示例文件夹中,因此您可以假设 h_A、h_B 已正确启动,并且代码无需我进行修改即可工作。
结果是第二个 cudaMemcpy 返回了一个带有 message invalid argument的错误。
似乎操作“d_M + size”没有返回人们期望的结果,因为设备内存的行为不同,但我不知道如何。
是否有可能使我的方法(一次调用 cudaMalloc 为两个数组分配内存)工作?也欢迎任何关于这是否是一种好方法的评论/答案。
更新
正如Robert和dreamcrash的回答所建议的那样,我必须将元素数(numElements)添加到指针 d_M 而不是字节数的大小。仅供参考,没有可观察到的加速。