「Structure of Arrays(SoA)」の版間の差分

提供:MonoBook
ページの作成:「Structure of Arrays(SoA)とは、構造体の配列(Array of Structures, AoS)を ひとつの構造体にしてしまうことをいいます。 ; AoS <source lang="csharp"> public struct Vertex { public Vector3 Position; public Vector3 Normal; public Vector2 UV; } var vertices = new Vertex[1000]; </source> ; SoA <source lang="csharp"> public struct Vertices { public Vector3[] Position; public Vector3[] Normal; public Vector2[] UV;…」
 
 
44行目: 44行目:


=== SIMD処理の適用 ===
=== SIMD処理の適用 ===
連続したメモリ領域により、SIMD(Single Instruction, Multiple Data)処理が適用しやすくなります。例えば、Yフィールドに対する一括処理が高速化されます。
連続したメモリ領域により、[[SIMD]](Single Instruction, Multiple Data)処理が適用しやすくなります。例えば、Yフィールドに対する一括処理が高速化されます。


== 適用場面 ==
== 適用場面 ==

2025年7月11日 (金) 02:08時点における最新版

Structure of Arrays(SoA)とは、構造体の配列(Array of Structures, AoS)を ひとつの構造体にしてしまうことをいいます。

AoS
public struct Vertex {
    public Vector3 Position;
    public Vector3 Normal;
    public Vector2 UV;
}

var vertices = new Vertex[1000];
SoA
public struct Vertices {
    public Vector3[] Position;
    public Vector3[] Normal;
    public Vector2[] UV;
}

パフォーマンス効果[編集 | ソースを編集]

実際のベンチマークテストでは、Vector3[10000]に対してYの最大値を求める処理において、以下の結果が得られています:

通常の実装でも2倍の高速化

SIMD処理を適用した場合は10倍の高速化

構造の違い[編集 | ソースを編集]

Array of Structures(従来の配列)[編集 | ソースを編集]

通常のC#配列では、データがXYZXYZXYZXYZという順序でメモリに配置されます。

Structure of Arrays(SoA)[編集 | ソースを編集]

SoAでは、同じフィールドのデータがXXXXYYYYZZZZという順序で連続配置されます。

高速化の理由[編集 | ソースを編集]

CPUキャッシュの効率化[編集 | ソースを編集]

SoAは同じ型のデータが連続してメモリに配置されるため、CPUキャッシュを効率的に活用できます。

SIMD処理の適用[編集 | ソースを編集]

連続したメモリ領域により、SIMD(Single Instruction, Multiple Data)処理が適用しやすくなります。例えば、Yフィールドに対する一括処理が高速化されます。

適用場面[編集 | ソースを編集]

SoAは特にパフォーマンスが重要なシチュエーションで有効です。大量のデータに対して同じフィールドへの処理を繰り返し行う場合や、数値計算が多い処理において、その効果を最大限に発揮します。