也许有人可以帮助我。我将在我的CUDA内核中使用动态分配,原因很简单,每个块都需要大量的全局内存作为暂存器,并且块的数量大约为4000.静态分配暂存器会有我的偏好,但由于内存大小限制,这根本不可能。我认为在这种情况下动态分配将是有用的,因为内存量现在只是活动块的数量,订购100-200。这一切都作为旁注,让你知道它也没有我的偏好,但在我看来,这是唯一的前进方向。
根据cuda c编程指南B.17部分提到的要点;
CUDA in-kernel malloc()函数至少从设备堆中分配大小字节,并返回指向已分配内存的指针,如果存在的内存不足以满足请求,则返回NULL。保证返回的指针与16字节边界对齐。
并根据F.4.2;
高速缓存行为128字节,并映射到设备存储器中的128字节对齐段。 在L1和L2中高速缓存的存储器访问由128字节存储器提供服务 事务,而只在L2中缓存的内存访问是由服务的 32字节的内存事务。因此,L2中的缓存可以减少过度获取 例如,在分散的内存访问的情况下。
和5.3.2;
驻留在全局内存中或由其中一个内存返回的变量的任何地址 来自驱动程序或运行时API的分配例程始终与至少256个字节对齐。
这是否意味着内核分配没有正确对齐warp到并行访问合并的连续浮点数和cudaMalloc()可能的动态分配?