CUDAMemcpy 对我来说毫无意义......为啥我要在普通 C++ 中指定设备内存?

Posted

技术标签:

【中文标题】CUDAMemcpy 对我来说毫无意义......为啥我要在普通 C++ 中指定设备内存?【英文标题】: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 新手。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢!这是一个非常糟糕的例子,因为我只是在这里写它来问这个问题,所以请原谅无意义的副本:P 感谢您以易于理解的方式回答:)

以上是关于CUDAMemcpy 对我来说毫无意义......为啥我要在普通 C++ 中指定设备内存?的主要内容,如果未能解决你的问题,请参考以下文章

NSMutableString appendString 生成一个 SIGABRT

这些东西对我来说已经没有多大意义了,但对初学者来说,可能是宝藏

这些东西对我来说已经没有多大意义了,但对初学者来说,可能是宝藏

无明显原因的分段错误

Scala点语法(或缺少)

JsLint'超出范围'错误