【问题标题】:Copying value of single variable from Host to Device variable将单个变量的值从主机复制到设备变量
【发布时间】:2019-08-30 10:20:19
【问题描述】:

我想知道如何正确地将主机变量的值直接复制到设备变量

我尝试使用 cudaMemcpy 但没有任何特殊结果。我得到的只是垃圾或什么都没有。

Pixel_GPU* Device_Array{};
//__device__ size_t size{};
size_t size{};
cudaMalloc((void**)& Device_Array, global_size * sizeof(Pixel_GPU));
cudaMalloc((void**) size, sizeof(size_t));
cudaMemset(&size, 0, sizeof(size_t));

cudaMemcpy(Device_Array, Host_Array, global_size * sizeof(Pixel_GPU), HostToDevice);
cudaMemcpy(&size, &global_size, sizeof(size_t), HostToDevice);
_STD cout << global_size << NEW_LINE;
Show_Device_Variables <<<2, 1>>>(&size);

cudaFree(&size);
cudaFree(Device_Array);

free(Host_Array);

例如: global_size 的大小可能为 1 000 000 。 size_t 可以接受,但是“size”的大小(设备数组大小)还没有初始化

【问题讨论】:

  • 你初始化主机阵列了吗?您必须在调用 Memcpy 之前执行此操作...
  • 传递标量的明智方法是通过值,根本不使用cudaMalloc。您可能想学习一个基本的 CUDA 示例代码,例如 vectorAdd
  • 感谢大家的建议。我对这件事很陌生,但我每天都在学习它,并尝试编写一个好的 cuda 代码。再次感谢
  • 是的,我之前初始化了 HostArray,这只是我整个代码中的一个 sn-p

标签: c++ c variables cuda copying


【解决方案1】:

您将 size 的(不确定)值重新解释为指向 cudaMalloc 的指针。
这不是一个好主意; CUDA 可能会将其新分配的设备内存的地址写入任意位置。
如果你幸运,它会崩溃,但如果你不走运,它可能看起来就像什么都没发生。

所有cudaMalloc 调用都遵循相同的模式:

T* p;  // This is going to be a device pointer.
cudaMalloc((void**) &p, ... // Pass the address of the pointer.

所以你应该有

size_t* size{};
cudaMalloc((void**) &size, sizeof(size_t));
cudaMemset(size, 0, sizeof(size_t));
// ...
cudaMemcpy(size, &global_size, sizeof(size_t), HostToDevice);
Show_Device_Variables <<<2, 1>>>(size);

cudaFree(size);

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2014-12-07
    • 2019-08-19
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多