【发布时间】: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