rme*_*elo 2 memory cuda dynamic
我正在尝试在CUDA应用程序中实现链接列表,以模拟不断增长的网络.在奥德这样做,我malloc 在__device__函数内部使用,旨在分配全局内存中的内存.代码是:
void __device__ insereviz(Vizinhos **lista, Nodo *novizinho, int *Gteste)
{
Vizinhos *vizinho;
vizinho=(Vizinhos *)malloc(sizeof(Vizinhos));
vizinho->viz=novizinho;
vizinho->proxviz=*lista;
*lista=vizinho;
novizinho->k=novizinho->k+1;
}
Run Code Online (Sandbox Code Playgroud)
在一定数量的分配元素(大约90000)后,我的程序返回"未知错误".起初我虽然这是一个记忆约束,但我检查了nvidia-smi,我有
+------------------------------------------------------+
| NVIDIA-SMI 331.38 Driver Version: 331.38 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 770 Off | 0000:01:00.0 N/A | N/A |
| 41% 38C N/A N/A / N/A | 159MiB / 2047MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)
所以它似乎不是内存问题,除非malloc在共享内存中分配.为了测试这个,我试图在分离的块中运行两个网络,并且仍然可以分配我可以分配的结构数量.但是当我尝试使用较少数量的结构运行同一程序的两个实例时,它们都完成没有错误.
我也试过cuda-memcheck了
========= CUDA-MEMCHECK
========= Invalid __global__ write of size 8
========= at 0x000001b0 in /work/home/melo/proj_cuda/testalloc/cuda_testamalloc.cu:164:insereviz(neighbor**, node*, int*)
========= by thread (0,0,0) in block (0,0,0)
========= Address 0x00000000 is out of bounds
========= Device Frame:/work/home/melo/proj_cuda/testalloc/cuda_testamalloc.cu:142:insereno(int, int, node**, node**, int*) (insereno(int, int, node**, node**, int*) : 0x648)
========= Device Frame:/work/home/melo/proj_cuda/testalloc/cuda_testamalloc.cu:111:fazrede(node**, int, int, int, int*) (fazrede(node**, int, int, int, int*) : 0x4b8)
========= Saved host backtrace up to driver entry point at kernel launch time
========= Host Frame:/usr/lib/libcuda.so.1 (cuLaunchKernel + 0x331) [0x138281]
========= Host Frame:gpu_testamalloc5 [0x1bd48]
========= Host Frame:gpu_testamalloc5 [0x3b213]
========= Host Frame:gpu_testamalloc5 [0x2fe3]
========= Host Frame:gpu_testamalloc5 [0x2e39]
========= Host Frame:gpu_testamalloc5 [0x2e7f]
========= Host Frame:gpu_testamalloc5 [0x2c2f]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xfd) [0x1eead]
========= Host Frame:gpu_testamalloc5 [0x2829]
Run Code Online (Sandbox Code Playgroud)
内核启动是否存在任何限制或者我缺少什么?我怎么检查呢?
谢谢,
里卡多
最可能的原因是"设备堆"上的空间不足.这最初默认为8MB,但您可以更改它.
参考文档,我们看到设备malloc分配出设备堆.
如果发生错误,将返回NULL指针malloc.最好在设备代码中测试这个NULL指针(在主机代码中 - malloc在这方面它与主机没有区别).如果获得NULL指针,则表示设备堆空间已用完.
如文档中所示,可以在内核调用之前调整设备堆的大小,方法是:
cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)
Run Code Online (Sandbox Code Playgroud)
运行时API函数.
如果忽略所有这些并尝试使用返回的NULL指针,您将在设备代码中获得无效访问,如下所示:
========= Address 0x00000000 is out of bounds
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
420 次 |
| 最近记录: |