SOAx与SoaAlloc

第一篇: SoAx: A generic C++ Structure of Arrays for handling particles in HPC codes

    首先从物理问题的数学计算问题引出粒子结构体的问题,粒子是具有属性的。而针对一系列的粒子,常见的情况,分为数组结构体(SoA)和结构体数组(AoS)。着重介绍了两种编程结构的优缺点。

      一种是结构体数组(AoS),本着面向对象编程(OOP)范式的精神。粒子信息是作为一个结构体处理的。这种情况下,一个对象代表着一个粒子,一堆粒子被存储在一个数组中。相反,在数组结构体(SoA)中,一个单独的结构体包含多个数组,一个数组代表着所有的粒子的某一个属性。

     结构体数组(AoS): I.使用的灵活性更高;

                                         II.单个粒子可以轻易地生成和修改;

                                        III.内存存储分散,没有合并内存;

     数组结构体(SoA): I.使用的灵活性较低;

                                         II.一种属性(即成员函数)的生成和修改更加简单,最大容量内存需要提前算好;

                                         III.内存合并同种属性占用同一空间;

    之后在CPUs和GPU上对结构体数组(AoS)和 数组结构体(SoA)做了测试。从向量化和缓存上进行分析。结构体数组(AoS)并不能利用向量化;但是数组结构体可以。但当三级缓存耗尽时,向量化的加速就没效果了。最佳状态在于L2使用完时。

           对于结构体数组(AoS)能不能使用缓存的部分还没有看懂,感觉理解反了。

            

     然后提出了C++的特性,C++允许抽象允许通过AoS模式访问数据,而数据是在内存中作为SoA。通过C++模板元编程设计了一种新的结构SoAx综合了两种的特点(并不了解C++这块儿,同时在想是否类似于thrust库中,将多个数组绑定到一起)

第二篇:SoaAlloc: Accelerating Single-Method Multiple-Objects Applications on GPUs

     一种基于GPU的内存分配策略,提高内存分配效率

        SoaAlloc将堆分成相等字节大小的M块 对象在SOA布局中存储在块中。,所有字段的值存储在一起;每个块只能储存相同类型类/结构体。在一个块,分配自由槽被一个对象分配跟踪位图。因为类型可以有不同的大小,块可能有不同数量的物体。块可以位于三个状态之一:未初始化,分配给特定类型,或分配和活动。新对象分配在新的块儿中。为了快速找到新块的块和空间。Soa-Alloc维护一个全局自由位图,并为每一种类型块分配位图和一个有源块位图。

        SoaAlloc还应用了三种优化来提高分配的效率:(a)与XMalloc相似,SIMD线程组(跃迁)中的分配请求被合并到单个请求中,以减少内存操作的数量。(b)位图是分层的,这样就可以在不扫描整个位图的情况下找到块。(c)SoaAlloc是由许多硬件架构提供的高效的位操作。

    

你可能感兴趣的:(学习,CUDA)