Memory 我应该如何将内存分配给许多(1000+;)我没有的数组';我不知道这个房间有多大?

Memory 我应该如何将内存分配给许多(1000+;)我没有的数组';我不知道这个房间有多大?,memory,dynamic,cuda,neural-network,Memory,Dynamic,Cuda,Neural Network,我正在使用CUDA库实现一个尖峰神经网络,我真的不确定如何处理以下事项: 将内存(cudamaloc)分配给许多不同的阵列。到目前为止,简单地“手工”使用Cudamaloc已经足够了,因为我不必制作超过10个数组。但是,我现在需要为数千个数组创建指针并分配内存 如何决定分配给每个阵列的内存量。这些阵列的高度为3(1行表示突触后神经元ID,1行表示突触后神经元上的突触数量,1行表示该突触的效能),但它们的长度不确定,随时间的推移会随着传出突触的数量而变化 我听说CUDA中的动态内存分配非常缓慢,因

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

  • 将内存(cudamaloc)分配给许多不同的阵列。到目前为止,简单地“手工”使用Cudamaloc已经足够了,因为我不必制作超过10个数组。但是,我现在需要为数千个数组创建指针并分配内存

  • 如何决定分配给每个阵列的内存量。这些阵列的高度为3(1行表示突触后神经元ID,1行表示突触后神经元上的突触数量,1行表示该突触的效能),但它们的长度不确定,随时间的推移会随着传出突触的数量而变化

  • 我听说CUDA中的动态内存分配非常缓慢,因此我一直在玩弄分配每个阵列所需的最大内存的想法,但是每个神经元的传出突触数量从100到10000不等,因此我认为这是不可行的,因为我有大约1000个神经元

    如果有人能告诉我如何在GPU上为多个阵列分配内存,和/或如何为上述任务编写快速动态内存分配代码,我将不胜感激


    提前谢谢

    如果你真的想这样做,你可以随时调用
    cudamaloc
    ;然而,这可能不是一个好主意。相反,尝试找出如何布局内存,以便块中的相邻线程尽可能访问RAM的相邻元素

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


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

    如果您真的想这样做,可以调用
    cudaMalloc
    任意次数;然而,这可能不是一个好主意。相反,尝试找出如何布局内存,以便块中的相邻线程尽可能访问RAM的相邻元素

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


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

    有什么原因不能只用一个大内存分配而不是许多小内存分配?我打算使用许多小内存分配的原因是我希望信息的“结构”类似于邻接列表,即,网络中的每个节点都有一个列表,告诉您它连接到了哪些其他节点(在我的情况下除外,它是一个“矩阵”,因为每个节点有3行信息)-我认为这样可以避免出现许多零元素,如果我使用大的3D阵列,就会出现这种情况。我认为这些零元素会占用内存,对吗?只有两种选择:使用可用的分配器(如设备上的cudamaloc或malloc)或创建自己的分配器。如果您担心速度,并且有很多小的分配,那么创建您自己的分配程序可能是一个不错的选择。这将涉及到发出一次或少量的
    cudamaloc
    ,然后根据需要通过指针索引到设备上的分配区域来进行分组。一个大的3D阵列可以简化编码,但可能会浪费更多的空间。智能分配器只会根据需要剥离尽可能多的空间。此外,如果您有1000个阵列,每个阵列约1000字节,那么这仅为1 MB,在今天的1GB或RAM或更大的设备中,这是很小的。如果您的总体大小较低,那么通过将每个元素设置为最大大小(一个固定大小的分配器,或者仅使用单个3D数组方法),一定会浪费空间并保持代码的简单性.有什么原因不能只使用一个大内存分配而不是许多小内存分配?我打算使用许多小内存分配的原因是我希望信息的“结构”类似于邻接列表,即,网络中的每个节点都有一个列表,告诉您它连接到了哪些其他节点(在我的例子中除外,它是一个“矩阵”,因为每个节点有3行信息)