我应该如何为许多(1000+)阵列分配内存,我不知道它的大小?

时间:2013-03-24 17:45:20

标签: memory dynamic cuda neural-network

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

  1. 将内存(cudaMalloc)分配给许多不同的阵列。到目前为止,简单地使用cudaMalloc'手动'已经足够了,因为我没有必要制作超过10个左右的阵列。但是,我现在需要指向并为数千个数组分配内存。

  2. 如何确定为每个阵列分配多少内存。阵列的高度为3(突触后神经元id为1行,突触后神经元突触数为1行,突触效应为1行),但它们的长度不确定,随时间变化具有传出突触的数量。

  3. 我听说CUDA中的动态内存分配非常慢,因此想要分配每个阵列所需的最大内存,但是每个神经元的传出突触数量在100-10,000之间变化,所以我认为这是不可行,因为我有1000个神经元。

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

    提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

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