CUDAMemcpy对我来说毫无意义…为什么要在普通c++中指定设备内存?

CUDAMemcpy Makes no sense to me... Why do I specify device memory in normal C++?

本文关键字:内存 c++ 毫无意义 对我来说 为什么 CUDAMemcpy      更新时间:2023-10-16

编辑:我可能已经找到了一个更好的方法,使用CUDAMalloc();我想这是一个糟糕的问题,但我会尝试Malloc,如果这似乎更合乎逻辑,那么我将关闭这个。

所以我能够在CUDA C/c++中写一点,但我正在看CUDAMemcpy语法,我看到它复制到指定的设备。但是为什么我在函数调用中指定主机上的两块内存,就像这个写得很糟糕的例子(我知道它没有初始化值…),我告诉它将h_array1/h_array2复制到各自的设备数组。为什么有必要在主机内存中创建d_Array ?

代码如下:

#include <cuda.h>
#include <iostream>
using std::cout;
unsigned long int arraysize = 20;
__global__ void CUDAAddArray(float* arrayfloat, float* arrayfloat2){
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    arrayfloat[idx] += arrayfloat2[idx];
    //end cuda kernel __global__ void CUDAAddArray();
}
int main() {
    float* h_array1 = new float[arraysize];
    float* h_array2 = new float[arraysize];
    float* d_array1 = new float[arraysize];
    float* d_array2 = new float[arraysize];
    cudaMemcpy(d_array1, h_array1, sizeof(float)*arraysize, cudaMemcpyHostToDevice);
    cudaMemcpy(d_array2, h_array2, sizeof(float)*arraysize, cudaMemcpyHostToDevice);
    CUDAAddArray<<<(arraysize%256)+1, 100>>> (d_array1, d_array2);
    cudaMemcpy(h_array1, d_array1, sizeof(float)*arraysize, cudaMemcpyDeviceToHost);
    cudaMemcpy(h_array2, d_array2, sizeof(float)*arraysize, cudaMemcpyDeviceToHost);
    for(int i = 0; i < arraysize; i++){
        cout << h_array1[i];
        cout << "n";
    }
    cout << std::endl;
    return NULL;
}

谢谢,CUDA新手。

由于没有初始化内存,因此无法知道程序是否实际工作。事实上,它不工作,但失败是隐藏的,因为你没有检查你的CUDA调用和内核调用是否成功。

正如您所猜测的,您的d_arrays应该使用cudaMalloc()从设备内存中分配。然后,事情就有意义了,因为cudaMemcpy()调用将从cpu复制缓冲区到设备内存进行处理,然后将结果复制回来。当然,d_array2不需要复制回来,因为它没有被内核修改。