1

我正在使用 CUDA 库实现一个尖峰神经网络,我真的不确定如何处理以下事情:

  1. 将内存 (cudaMalloc) 分配给许多不同的数组。到目前为止,只需“手动”使用 cudaMalloc 就足够了,因为我不必制作超过 10 个左右的数组。但是,我现在需要为数千个数组创建指针并分配内存。

  2. 如何决定为每个数组分配多少内存。阵列的高度为 3(1 行用于突触后神经元 ID,1 行用于突触后神经元上的突触数量,1 行用于突触的功效),但它们的长度不确定,会随时间变化与传出突触的数量。

我听说 CUDA 中的动态内存分配非常慢,因此玩弄了分配每个数组所需的最大内存的想法,但是每个神经元的传出突触数量从 100 到 10,000 不等,所以我认为这是不可行的,因为我有大约 1000 个神经元。

如果有人可以建议我如何为 GPU 上的许多数组分配内存,和/或如何为上述任务编写快速动态内存分配代码,我将非常感激。

提前致谢!

4

1 回答 1

1

如果你真的想这样做,你可以调用任意cudaMalloc多次;但是,这可能不是一个好主意。相反,尝试弄清楚如何布局内存,以便块中的相邻线程尽可能访问 RAM 的相邻元素。

这可能有问题的原因是线程一次以 32 个为一组执行(一个扭曲)。NVidia 的内存控制器非常智能,因此如果相邻线程请求 RAM 的相邻字节,它会将这些负载合并为一个可以有效执行的请求。相反,如果 warp 中的每个线程都在访问一个随机内存位置,则整个 warp 必须等待 32 个内存请求完成。此外,对卡内存的读取和写入一次发生整个高速缓存行,因此如果线程在从高速缓存中逐出之前未使用所有读取的 RAM,则会浪费内存带宽。如果您不针对线程块内的连贯内存访问进行优化,预计会出现 10 倍到 100 倍的减速。

(旁注:上述讨论仍然适用于 G80 后的卡;第一代 CUDA 硬件(G80)甚至更加挑剔。如果程序员想要合并行为,它还需要对齐的内存请求。)

于 2013-03-24T19:39:34.647 回答