【问题标题】:CUDAMemcpy Makes no sense to me... Why do I specify device memory in normal C++?CUDAMemcpy 对我来说毫无意义......为什么我要在普通 C++ 中指定设备内存?
【发布时间】:2014-04-21 00:51:51
【问题描述】:

编辑:我可能找到了更好的方法,使用 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 新手。

【问题讨论】:

    标签: c++ pointers memory cuda


    【解决方案1】:

    由于你没有初始化内存,你无法知道程序是否真的有效。而事实上,它并没有起作用,只是隐藏了失败,因为你没有检查你的CUDA调用和内核调用是否成功。

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

    【讨论】:

    • 谢谢!这是一个非常糟糕的例子,因为我只是在这里写它来问这个问题,所以请原谅无意义的副本:P 感谢您以易于理解的方式回答:)
    猜你喜欢
    • 2015-06-19
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多