c++ - cudaMemcpy 之后数组的值

标签 c++ c cuda

我想知道,当我调用 cudaMemcpy(...) 以获取 GPU 上的内存时,数组中的值是否也被复制。我会更好地解释:我将值从一个数组复制到另一个数组,然后调用 cudaMalloc 和 cudaMemcpy。

// Copying values of the arrays
for(int i = 0; i<16; i++){
    array_device_1[i] = array_host_1[i];
    array_device_2[i] = array_host_2[i];
}

// Memory allocation of array_device_1 and array_device_2
cudaMalloc((void**) &array_device_1, SIZE_INT*size);
cudaMalloc((void**) &array_device_2, SIZE_INT*size);

// Transfer array_device_1 and array_device_2
cudaMemcpy(array_device_1, array_host_1, SIZE_INT*size, cudaMemcpyHostToDevice);
cudaMemcpy(array_device_2, array_host_2, SIZE_INT*size, cudaMemcpyHostToDevice);

kernel<<<N, N>>>(array_device_1, array_device_2);

cudaMemcpy(array_host_1, array_device_1, SIZE_INT*size, cudaMemcpyDeviceToHost);
cudaMemcpy(array_host_2, array_device_2, SIZE_INT*size, cudaMemcpyDeviceToHost);

cudaFree(array_device_1);
cudaFree(array_device_2);

那么,当我执行所有这些指令并使用内核中的所有数组时,array_device_1 和 array_device_2 中的值是否存在?我试图在内核之后打印出来,我注意到所有数组都是空的!真的,我无法理解如何将值保存在其中,然后使用内核函数更改它们的值。

最佳答案

是的,他们有自己的值(value)观。但是你不能在主机上打印出来。为此,您需要使用

复制您的数据
cudaMemcpy((void *) array_host_2, (void *) array_device_2, SIZE_INT*size, cudaMemcpyDeviceToHost);

然后你可以打印array_host_2的值。

更多解释:您的 array_device_* 位于 GPU 上,而您无法通过 CPU(正在打印输出)直接访问此数据。所以你需要先把它复制回你的 CPU 内存,然后再打印出来。

关于c++ - cudaMemcpy 之后数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928812/

相关文章:

CUDA:如何使该代码并行?

c++ - 指针的部分特化,C++

c++ - 如何拦截我启动的 Internet Explorer 实例执行的 http 请求?

C++ - 我们如何在 Linux 中获得毫秒时间戳?

c - 如何使用按位 XOR 加密文本文件?

c - 结构指针数组的问题

c++ - OpenCV 功能 FAST 未在源代码中实现

c++ - add_library 没有使用 c 源代码创建 .lib

performance - 当奇数/偶数线程在 CUDA 中执行不同操作时优化代码性能

c - 如何使用编译器内部 __fmul_?