【发布时间】: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 中“打包”部分条目是否有意义,例如将count1 和count2 组合成一个
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 是的,对于大多数内核,每个线程只能访问一个元素。但也许我必须构建一些自动化的组合构建和测试来找到全局最优值。