我下载了NVIDIA Computing Toolkit(包含CUDA 9.0 SDK)。在SDK中,有一个名为cppIntegration
的Visual Studio项目。
在cppIntegration
项目中,有char*
类型的变量使用cudaMalloc()
分配内存,然后使用cudaMemcpy()
将数据复制到这些变量中。在Visual Studio中调试项目时,我可以看到char*
变量指向的内存地址,但是当我尝试使用调试器中的内存窗口读取该内存时,我只是反复看到?? ?? ??
。
.cu
项目中的cppIntegration
文件如下(仅显示与问题相关的代码):
extern "C" bool
runTest(const int argc, const char **argv, char *data, int2 *data_int2, unsigned int len)
{
// use command-line specified CUDA device, otherwise use device with highest Gflops/s
findCudaDevice(argc, (const char **)argv);
const unsigned int num_threads = len / 4;
assert(0 == (len % 4));
const unsigned int mem_size = sizeof(char) * len;
const unsigned int mem_size_int2 = sizeof(int2) * len;
// allocate device memory
char *d_data;
checkCudaErrors(cudaMalloc((void **) &d_data, mem_size));
// copy host memory to device
checkCudaErrors(cudaMemcpy(d_data, data, mem_size,
cudaMemcpyHostToDevice));
...
...
...
}
runTest()
来自main()
。
我尝试查看d_data
指向的数据,但显示为?? ?? ??
。 如何查看char*
指定的实际内存数据?
答案 0 :(得分:2)
您无法在主机(= CPU)调试器中查看此内存。 cudaMalloc
分配设备(= GPU)内存,因此指针返回指向GPU内存并且在主机上没有任何意义。从主机的角度来看,设备内存指针只是一个黑盒值。只有设备代码可以取消引用。
为了能够在调试时查看设备内存的内容,您必须使用设备调试器(例如NSight或cuda-gdb)并在设备代码中放置断点。我没有这方面的经验,所以我无法提供更多信息。
如果要在主机上查看此类内存,则必须将其复制到主机内存中。这是cudaMemcpy(..., cudaMemcpyDeviceToHost)
和类似函数的作用。