Automatic Data Movement and Computation Mapping for Multi-level Parallel Architectures with Explicitly Managed Memories

by syoyo

M. Baskaran, U. Bondhugula, S. Krishnamoorthy, J. Ramanujam, A. Rountev and P. Sadayappan,
“Automatic Data Movement and Computation Mapping for Multi-level Parallel Architectures with Explicitly Managed Memories,”
in Proc. 13th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming, (PPoPP 2008), Salt Lake City, UT, February 2008.
http://www.cse.ohio-state.edu/~saday/

PLUTO ツールのチームから.

ネストしたループをタイル化してメモリアクセスの局所性を高め、
またタイル内で処理するデータの転送を最適な場所に挿入してくれる手法.

データ転送命令の挿入位置は二次最適化問題に帰結され、
SQP(Sequential Quadtratic Programming, 逐次二次計画法)を解くことで
最小の転送オーバヘッドで最大の効果を得られる場所を見つけます.

デモでは本手法を CUDA に適用し、シェアードメモリを有効に使ってパフォーマンスが
改善された例を示しています.

CPU の場合でも本手法の考え方は有効で、
たとえばデータ転送部分はプリフェッチ命令などに
置き換えるようにすれば CPU の場合でも使えて、
メモリアクセスの効率化が図れると思います.

CUDA(GPU), CPU(x86) ともに、今もこれからもパフォーマンスで
重要になってくるのはメモリアクセスをどう最適化するかだと思います.

メモリアクセスの最適化は手作業でやらずに、
論文で提案されているような手法で自動的にできないかなぁと思っています.
メモリアクセスの最適化は、 SIMD 化みたいにコードを見ればなんとなく
直感的に分かるというものではないので、手作業では、
実行させてプロファイルとってみてパラメータを変えてもう一度試して…
と非効率になると思うのです.

ちなみに、グラフィックス(大域照明)だと、
ネストループでどうメモリアクセスの効率化を図るかという問題ではなくて、
木探索の効率化やプログラム実行の spatio-temporal プロファイルから
どうコヒーレンスを見つけるかという問題に帰結されるのが多いのですが、
このような分野に対するメモリアクセス最適化の研究は
(言語、コンパイラ野郎方面からは)まだまだやられていないような気がしています.
(私が既存研究を見つけられていないだけかもしれません)

Advertisements