【问题标题】:Converting from AoS to SoA - Write performance and Optimal packing从 AoS 转换为 SoA - 写入性能和优化打包
【发布时间】:2015-09-07 22:52:00
【问题描述】:

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

我有一个结构 Element:

struct Element
{
    float3 origin;
    float3 direction;
    uint8_t count1;
    uint8_t count2;
    unsigned int index;
    float distance;
    uint16_t instanceId;
    uint64_t hash;
};

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

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

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 个单独的“小”写入而不是 1 个“大”写入,写入性能会受到影响吗?

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

  struct uint8_2
  {
       uint8_t count1;
       uint8_t count2;
  };

3) 如果“打包”有用,有没有办法计算ElementSoA的最优结构? 假设我有一个这样的每个内核读取访问的列表:

  • kernel2: origin, direction, hash
  • kernel3: count1, count2, distance, hash
  • ...

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

【问题讨论】:

  • @buttifulbuttefly 我更新了我的问题。考虑到大量的组合,也许有办法限制必要的测试......
  • 目前还不清楚访问模式是什么。线程i 是否访问元素i 并且仅访问元素i?从上下文来看,我认为是这样,但明确表示会很好。
  • @Jez 是的,对于大多数内核,每个线程只能访问一个元素。但也许我必须构建一些自动化的组合构建和测试来找到全局最优值。

标签: arrays struct cuda


【解决方案1】:

假设线程 i 访问元素 i 并且仅访问元素 i。从上下文来看,情况似乎如此。

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

是的。它应该更快。 “大”写入将被编译器拆分为多个小写入,每个小写入都将跨步。当访问模式未跨步时,内存子系统工作得更好。

这里值得指出的是,您正在使用的float3 类型也将像这样工作,并且将被拆分为三个 32 位事务,步幅较大。不过,您也没有理由不能将这些从 AoS 转换为 SoA。

ElementSoA 中“打包”部分条目是否有意义?

是的。更大对齐的二次幂类型(在当前硬件上,最多 128 位)允许硬件更有效地加载和存储。差别不大,但如果容易做到,通常是值得的。

如果“打包”有用,有没有办法计算最优 ElementSoA的结构?

无法计算。一个问题是内核具有不同的特性。可能是带宽受限,因此使用有效负载会有所帮助。另一个可能是计算受限,因此更高效的负载不会有太大帮助。

【讨论】:

  • 关于float3:既然这是一个内置类型,这不是比普通的float[3]数组更优化吗?
  • 不,不是。归根结底,每个 float3 只是一个 12 字节的内存区域。要直接从内存中获取 12 个未填充字节到寄存器,除了跨步访问之外别无他法,因为可用的事务大小是 2 的幂。
猜你喜欢
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2014-06-14
  • 2018-03-05
  • 1970-01-01
相关资源
最近更新 更多