【问题标题】:cudaMemcpy not actually copying anythingcudaMemcpy 实际上并没有复制任何东西
【发布时间】:2014-05-10 10:36:52
【问题描述】:

我正在尝试将一组无符号整数(msgs)复制到 GPU 上以对其进行处理,但以下代码并未复制任何内容。我在 cudaMemcpy 调用周围添加了一些 cuda 错误检查代码,我得到以下信息:invalid argument

...
unsigned int *device_msgs;
size_t size_msgs = (size_t)(16*num_msgs);
cudaMalloc((void **) &device_msgs, size_msgs);

cudaMemcpy(device_msgs, msgs,
                   sizeof(unsigned int)*16*num_msgs,
                   cudaMemcpyHostToDevice);
...

我将cudaMalloc 包装在相同的错误检查代码中,那里似乎没有任何问题。实际的内核调用导致相同的invalid argument cuda 错误,但这可能与memCpys 有关,因为我正在传递设备指针。有人知道这里发生了什么吗?

编辑:需要明确的是,msgs 事先已正确 malloc'd。

【问题讨论】:

    标签: c cuda


    【解决方案1】:

    您似乎为 device_msgs 分配了 16*num_msgs 字节,然后由于 sizeof(unsigned int) 乘数而尝试复制比这更多的字节。尝试将其更改为:

    unsigned int *device_msgs;
    size_t size_msgs = sizeof(unsigned int)*16*num_msgs;
    cudaMalloc((void **) &device_msgs, size_msgs);
    
    cudaMemcpy(device_msgs, msgs, size_msgs, cudaMemcpyHostToDevice);
    

    【讨论】:

    • 检查 msgs 也...如果 OP 误解了如何为 device_msgs 指定大小,可能也对 msgs 做了同样的问题。
    • 这似乎是问题所在,非常感谢。我肯定 malloc 的大小正确,我之前检查了三次,但感谢您的建议。
    猜你喜欢
    • 2014-11-29
    • 2018-10-26
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多