显存二级指针初始化的问题

  • 4 replies
  • 192 views
显存二级指针初始化的问题
« 于: 六月 26, 2019, 12:07:44 pm »
现在需要往核函数中传一个二级指针,但是cudaMalloc会有内存错误。
之前用数组里包含指针,里面的指针就可以正常分配内存。
不太清楚如何定位。

代码就是下面三行:
GPU_mems_data * GPU_data;
cudaMalloc((void**)&GPU_data,sizeof(GPU_mems_data));
cudaMalloc((void**)&GPU_data->pac_Gpu, sizeof(uint8_t) * 10);
问题应该是第二行没给GPU_data->pac_Gpu初始化出来空间,导致第三行访问了未初始化的内存,请问,如何写才能给它开辟出来空间?

在CPU上按这个逻辑验证没出什么问题。

本人的设备是1050ti cuda9.2 显卡驱动398.26

Re: 显存二级指针初始化的问题
« 回复 #1 于: 六月 26, 2019, 01:34:17 pm »
现在需要往核函数中传一个二级指针,但是cudaMalloc会有内存错误。
之前用数组里包含指针,里面的指针就可以正常分配内存。
不太清楚如何定位。

代码就是下面三行:
GPU_mems_data * GPU_data;
cudaMalloc((void**)&GPU_data,sizeof(GPU_mems_data));
cudaMalloc((void**)&GPU_data->pac_Gpu, sizeof(uint8_t) * 10);
问题应该是第二行没给GPU_data->pac_Gpu初始化出来空间,导致第三行访问了未初始化的内存,请问,如何写才能给它开辟出来空间?

在CPU上按这个逻辑验证没出什么问题。

本人的设备是1050ti cuda9.2 显卡驱动398.26

楼主你好,在CPU上试图提领(de-reference)GPU存储器(也就是显存),将直接导致Access Violation/Segmentaion Fault/Bus Fault的。请不要这样做。

建议的解决方案:
(1)采用经典的分步shadow方案。在CPU上分配同样大小的一个结构体实例(Shadow),然后在CPU上初始化它的某个成员(Field)的值为指向你第二次cudaMalloc时候显存。然后再次分配显存上同样大小的一个结构体实例(实际使用的),再用cudaMemcpy将Shadow复制成真实的显存上的结构体(一次H->D)复制。

或者可以考虑:
(2)采用全自动方案:
执行一次cudaMallocManaged()替换至少你的第一次cudaMalloc()。Unified Memory管理机制将自动为你完成自动副本/自动复制。

你严重缺乏基本的CUDA常识。我建议你在工作前,先通篇看一下手册。

Re: 显存二级指针初始化的问题
« 回复 #2 于: 六月 26, 2019, 03:29:27 pm »
楼主你好,在CPU上试图提领(de-reference)GPU存储器(也就是显存),将直接导致Access Violation/Segmentaion Fault/Bus Fault的。请不要这样做。

建议的解决方案:
(1)采用经典的分步shadow方案。在CPU上分配同样大小的一个结构体实例(Shadow),然后在CPU上初始化它的某个成员(Field)的值为指向你第二次cudaMalloc时候显存。然后再次分配显存上同样大小的一个结构体实例(实际使用的),再用cudaMemcpy将Shadow复制成真实的显存上的结构体(一次H->D)复制。

或者可以考虑:
(2)采用全自动方案:
执行一次cudaMallocManaged()替换至少你的第一次cudaMalloc()。Unified Memory管理机制将自动为你完成自动副本/自动复制。

你严重缺乏基本的CUDA常识。我建议你在工作前,先通篇看一下手册。

好的,十分感谢,从CUDA_C_Programming_Guide看起还是先看CUDA_Runtime_API ?我是想结合项目中遇到的问题来学习,看这种类似字典的手册感觉有点使不上力。

Re: 显存二级指针初始化的问题
« 回复 #3 于: 六月 26, 2019, 03:40:57 pm »
好的,十分感谢,从CUDA_C_Programming_Guide看起还是先看CUDA_Runtime_API ?我是想结合项目中遇到的问题来学习,看这种类似字典的手册感觉有点使不上力。

显然你得先看前者。例如你这个问题:
cudaMalloc(&显存中的东西, 大小); (你出错的最后一行的那个cudaMalloc)。
而你如果看了手册,你就知道,原来应当改成:
cudaMalloc(内存中的地址 或者 &内存中的指针变量 或者 &unified memory中的指针变量, 大小);
此时错误是显然的。

Re: 显存二级指针初始化的问题
« 回复 #4 于: 六月 26, 2019, 03:59:28 pm »
显然你得先看前者。例如你这个问题:
cudaMalloc(&显存中的东西, 大小); (你出错的最后一行的那个cudaMalloc)。
而你如果看了手册,你就知道,原来应当改成:
cudaMalloc(内存中的地址 或者 &内存中的指针变量 或者 &unified memory中的指针变量, 大小);
此时错误是显然的。
好的,感谢分享~