【问题标题】:cudaMemcpy not copying any datacudaMemcpy 没有复制任何数据
【发布时间】:2015-10-02 04:10:49
【问题描述】:

我使用 cuda-gdb 检查 dcost 的值,发现 cudaMemcpy 没有进行复制,即使它返回 cudaSuccess

这是我的代码:

#include<stdint.h>

int main(){
int64_t nvtx_scale = ((int64_t)1)<<14;

uint64_t* cost = (uint64_t*)malloc(sizeof(uint64_t)*nvtx_scale);

for(int64_t i=0; i < nvtx_scale; i++)
    cost[i] = uint64_t(-1);

uint64_t* dcost;
cudaMalloc(&dcost, nvtx_scale*sizeof(uint64_t));

cudaError_t err;

err = cudaMemcpy(dcost, cost, sizeof(uint64_t)*nvtx_scale, cudaMemcpyHostToDevice);
return 0;
}

这和我设置的事实有什么关系吗? CUDA_DEBUGGER_SOFTWARE_PREEMPTION=1 按照 cuda-gdb 文档中的建议允许在不停止显示管理器的情况下使用相同的 gpu 进行调试?

【问题讨论】:

  • 除非你能展示一个简短、完整的代码来重现问题,否则我不相信任何人能告诉你可能出了什么问题
  • @talonmies done : 我没有做任何其他事情,我觉得不需要添加完整的代码
  • 您说您发布的代码没有复制任何数据。但是你怎么知道呢?我在该代码中看不到任何东西可以确认副本是否有效
  • 这里也可能存在使用错误。我不认为 cuda-gdb 中的 print 命令可用于在单步执行主机代码时显示设备变量的内容。我认为有必要在设备(内核)代码中停止,然后才能使用打印命令在设备上显示数据内容。大概您正在使用 print 命令(cuda-gdb 会话输出对您的问题很有帮助)来显示变量。由于您发布的代码没有设备内核,因此您不可能在设备代码中。
  • 尝试创建一个简单的内核,将其添加到您的代码中,在内核中设置断点,然后尝试检查设备内存。您可能还想查看this question and the upvoted answer

标签: cuda


【解决方案1】:

您的代码的以下稍微修改的版本:

#include<stdint.h>
#include<iostream>

int main(){
    int64_t nvtx_scale = ((int64_t)1)<<14;

    uint64_t* cost = (uint64_t*)malloc(sizeof(uint64_t)*nvtx_scale);

    for(int64_t i=0; i < nvtx_scale; i++)
        cost[i] = uint64_t(123456789);

    uint64_t* dcost;
    cudaMalloc(&dcost, nvtx_scale*sizeof(uint64_t));
    cudaMemcpy(dcost, cost, sizeof(uint64_t)*nvtx_scale, cudaMemcpyHostToDevice);

    memset(cost, 0, sizeof(uint64_t)*nvtx_scale);
    cudaMemcpy(cost, dcost, sizeof(uint64_t)*nvtx_scale, cudaMemcpyDeviceToHost);

    for(int i=0; i<10; i++) {
        std::cout << i << " " << cost[i] << std::endl;
    }

    return 0;
}

像这样为我编译和运行:

C:\Users\talonmies>nvcc cudacopy.cu
cudacopy.cu
   Creating library a.lib and object a.exp

C:\Users\talonmies>cuda-memcheck a.exe
========= CUDA-MEMCHECK
0 123456789
1 123456789
2 123456789
3 123456789
4 123456789
5 123456789
6 123456789
7 123456789
8 123456789
9 123456789
========= ERROR SUMMARY: 0 errors

如果您无法重现此问题,则说明您的 CUDA 安装存在问题。

【讨论】:

  • 你说得对,我能够重现这个,问题出在 cuda-gdb 我正在打印 dcost[0] 的值,它显示为 0,我不知道为什么会这样,你能尝试使用 cuda 调试器在 cudaMemcpy 之后打印 dcost 的值,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多