にのみ収まる入力の問題については、データレイアウトStructs of Arrays
(SoAArray of Structs
)が(AoS)またはArray of Pointers
(AoP )よりも常に高速であるかどうか疑問に思いRAM
ましたC/JAVA
。
数日前、私は分子動力学アルゴリズム(C)のパフォーマンスを改善していました。このアルゴリズムで要約すると、粒子間の力と位置に基づいて粒子間の力の相互作用が計算されます。
元の粒子は、9つの異なるdoubleを含む構造体で表されていました。3つは粒子の力(Fx、Fy、Fz)、3つは位置、3つは速度です。アルゴリズムには、すべてのパーティクルへのポインタを含む配列がありました(AoP)。キャッシュの使用を改善するために、レイアウトをAoPからSoAに変更することにしました。
これで、9つの配列を持つ構造体ができました。各配列には、各粒子の力、速度、位置(x、y、z)が格納されています。各パーティクルには、独自の配列インデックスによってアクセスされます。
パフォーマンス(RAMにのみ収まる入力の場合)が約1.9倍向上したので、通常AoPまたはAoSからSoAに変更すると、常にパフォーマンスが向上するのではないかと思いました。そうでない場合は、どのタイプのアルゴリズムでこれを行うのでしょうか。発生しません。