キューブ (3D イメージ、正確にはスペクトル キューブ) を処理する GPU/CUDA コードがあります。立方体を一連の画像/スライス、または別の方法として、異なる空間位置 (正方形上) を持つスペクトルの束と考えてください。画像の各ピクセルは、異なる x 値、y 値、および同じ z 値を持ちます。スペクトル上の各ピクセルの x、y は同じですが、z は異なります。キューブのメモリは、2 つの連続するメモリ アドレスが x と x+1 に対応するように配置されます。
私の CUDA コードでは、各 CUDA スレッドが異なるスペクトルを処理するように構成しました。このようにして、グローバルメモリの合体を実現できます。次に、このコードを Intel Phi (#pragma offload+OpenMP) に移植しました。GPU の場合と同様に、各 Phi コアで異なるスペクトルを処理します。その結果、ここでもメモリの合体が達成されます。ただし、出来は悪いです。
- 問題は、グローバル メモリと合体したものの、各スペクトルのピクセルが連続したメモリ アドレスにないため、Phi のベクトル化によってパフォーマンスが向上しないことだと思います。(各コアは、関連するスペクトル全体で何らかの削減を行うことに注意してください。より正確には、1 次、2 次、および 3 次モーメントを計算します)。この考えは理にかなっていますか?
- SIMD からパフォーマンスを得るために私が間違っていなければ、メモリアドレスは連続している必要がありますよね?
- そのため、Xeon phi では、グローバル メモリを結合する完全なメモリを実現し、同時に SIMD を最大限に活用することは不可能のようです。これは理にかなっていますか、それとも私は完全に間違っていますか?
PS: Intel Xeon Phi 7120 を使用しています。