1つのアプローチは、AoSとSoAのハイブリッドであるAoSoA(read:Array of Struct of Array)アプローチを使用することです。考え方は、N構造体相当のデータを連続したチャンクにSoA形式で格納し、次に次のN構造体相当のデータをSoA形式で格納することです。
4つの構造体の粒度でスウィズルされた16個のベクトル(ラベル0、1、2 ... F)のAoSフォームは次のとおりです。
000111222333444555666777888999AAABBBCCCDDDEEEFFF
XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ
SoAの場合、これは次のとおりです。
0123456789ABCDEF
XXXXXXXXXXXXXXXX
0123456789ABCDEF
YYYYYYYYYYYYYYYY
0123456789ABCDEF
ZZZZZZZZZZZZZZZZ
AoSoAの場合、これは次のようになります。
01230123012345674567456789AB89AB89ABCDEFCDEFCDEF
XXXXYYYYZZZZXXXXYYYYZZZZXXXXYYYYZZZZXXXXYYYYZZZZ
AoSoAアプローチには、AoSの以下の利点があります。
- 構造体のチャンクをSPUローカルメモリに転送するには、DMA転送が1つだけ必要です。
- 構造体には、すべてのデータがキャッシュラインに収まる可能性があります。
- ブロックのプリフェッチは非常に簡単です。
AoSoAアプローチには、SoAフォームのこれらの利点もあります。
- データをスウィズルすることなく、SPUローカルメモリから128ビットのベクトルレジスタに直接データをロードできます。
- 一度に4つの構造体を操作できます。
- 基本的な分岐がない場合(つまり、ベクトル演算に未使用のレーンがない場合)は、ベクトルプロセッサのSIMDを十分に活用できます。
AoSoAアプローチには、SoAフォームのこれらの欠点のいくつかがまだあります。
- オブジェクト管理は、スウィズリング粒度で行う必要があります。
- 完全な構造体のランダムアクセス書き込みは、分散したメモリにアクセスする必要があります。
- (これらは、構造体の構成/管理方法とその寿命に応じて、問題にならない場合があります)
ところで、これらのAoSoAの概念は、SSE / AVX / LRBniや、非常に広いSIMDプロセッサに例えられるGPUに非常によく適用されます。ベンダー/アーキテクチャに応じて32/48/64幅。