首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从AoS到SoA的转换-写性能和优化包装

从AoS到SoA的转换-写性能和优化包装
EN

Stack Overflow用户
提问于 2015-06-22 13:05:50
回答 1查看 549关注 0票数 0

我目前正在考虑将我的CUDA内核中使用的数据存储从结构阵列(AoS)转换为数组结构(SoA)。

我有一个结构化的Element

代码语言:javascript
运行
复制
struct Element
{
    float3 origin;
    float3 direction;
    uint8_t count1;
    uint8_t count2;
    unsigned int index;
    float distance;
    uint16_t instanceId;
    uint64_t hash;
};

这些结构在kernel1中作为一个整体写入一个驻留在全局内存中的数组中,然后在多个后续内核中使用条目的子集。

我现在可以将其转换为以下结构:

代码语言:javascript
运行
复制
struct ElementSoA
{
    float3 origin[N];
    float3 direction[N];
    uint8_t count1[N];
    uint8_t count2[N];
    unsigned int index[N];
    float distance[N];
    uint16_t instanceId[N];
    uint64_t hash[N];
};

问题:

1)如果在kernel1中有8个单独的“小”写,而不是一个“大”写,那么写性能会受到影响吗?

2)在ElementSoA中“打包”条目的部分是否有意义,例如将count1count2组合成一个

代码语言:javascript
运行
复制
  struct uint8_2
  {
       uint8_t count1;
       uint8_t count2;
  };

3)如果“包装”有用,是否有一种计算的方法-- ElementSoA的最优结构?假设我有一个每个内核读取访问的列表,如下所示:

  • kernel2origindirectionhash
  • kernel3count1count2distancehash
  • ..。

我要求计算最优解的原因是,我有多个结构,它们包含的条目比Element还要多,所以需要实现和测试大量的组合。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-22 18:23:49

假设线程i访问元素i,并且只访问元素i。从上下文来看,情况似乎是这样的。

如果在kernel1中有8个单独的“小”写,而不是一个“大”写,那么写性能会受到影响吗?

。应该更快些。“大”写入将由编译器拆分为多个小写入,每个写入都将被跨出。当访问模式不跨时,内存子系统的工作性能要好得多。

这里值得指出的是,您所使用的float3类型也将像这样工作,并且将被分割为三个32位的事务。但是,您也没有理由不能将这些代码从AoS转换为SoA。

ElementSoA中“打包”条目的部分内容有意义吗?

。更大的对齐功率两种类型(在目前的硬件,多达128位)允许硬件加载和存储效率更高。两者之间的差别并不大,但如果很容易做到,那往往是值得的。

如果“包装”有用的话,是否有办法计算-- ElementSoA的最优结构?

没有办法计算这个。一个问题是内核具有不同的特性。它可能是一个很强的带宽限制,所以使用有效的负载将有所帮助。另一个可能是计算界,因此更有效的负载不会有多大帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30980767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档