我使用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进行调试?
以下是您的代码的稍作修改的版本:
#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安装存在问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句