Intel MICの間のメモリ転送オーバーヘッド
質問
私は奇妙な行動を観察していて、それが関連するIntel Xeon Phiであるかどうかを知りたいです。
私は基本的にコードをほとんど持っていません誰もが知っている行列乗算です(3つのループに入れ子)。 OpenMP 4.0 target
プラグマを使用して、Intel MACに計算をオフロードし、map(to:A,B)
GenerAcodeTagCodeを使用して3つの行列をマッピングします。
今、私が観察しているのは、小さな行列のためのものです。 1024x1024メモリ転送は非常に長くかかりました。ネイティブバージョン(同じコード、同じ並列化戦略、オフロードなし)と比較して、オフロードバージョンは約320ミリ秒の時間を消費します。初期化のオーバーヘッドを削除するためのコードのウォームアップランを実行しました。
この320msを表すことなく同じ量のメモリがコピーされているNVIDIA Tesla K20と比較して、非常に悪いです。
メモリ転送速度を向上させる可能性がある環境設定はいくつかありますか?
追加的な質問: offload_report環境変数を介してオフロードレポートを有効にしました。レポートに表示されている2つのタイミング結果の違いは何ですか:
[Offload] [HOST] [Tag 5] [CPU Time] 26.995279(seconds)
[Offload] [MIC 0] [Tag 5] [CPU->MIC Data] 3221225480 (bytes)
[Offload] [MIC 0] [Tag 5] [MIC Time] 16.859548(seconds)
[Offload] [MIC 0] [Tag 5] [MIC->CPU Data] 1073741824 (bytes)
.
マイクタイムで10秒が足りないもの(メモリ転送?)
ウェルの第3質問。 Intel Micsで固定メモリを使用することは可能ですか?もしそうなら、どのように?
解決
MICのメモリ割り当ては時間がかかることがあります。3つのオーバーヘッドのソースを試してみて、時間がどこに移動する場所をよりよく理解してみてください。
// Device initialization
#pragma offload_transfer target(mic)
...
// Memory allocation and first data transfer
// This is expected to have overhead proportional to the amount of memory allocated
// Doing at least one transfer will speed up subsequent transfers
#pragma offload_transfer target(mic) in(p[0:SIZE] : alloc_if(1) free_if(0))
...
// This transfer should be faster
// For large sizes, approaching 6 GiB/s
#pragma offload_transfer target(mic) in(p[0:SIZE] : alloc_if(0) free_if(0))
. 他のヒント
「初期化のオーバーヘッドを削除するためのコードのウォームアップ実行を行いました」と言ったので、ダミーセクションをオフロードすることでオフロードランタイムを起動しました。 「on_offload」(デフォルト)またはプログラムの初期化時刻(offload_init= on_start)で調整があることを忘れないでください。とにかく、DMAエンジンに高速経路もあります。高速経路は、バッファ(転送する)がページサイズに揃ったときに取られます。オフロードアプリケーションの場合は、閾値INTEGERB | k | k | k | g | M |が単に環境変数を設定することができます。ここで、Mはメガバイト(例えば、mic_use_2mb_buffers= 2m)である。このしきい値は、巨大なページが使用される前に必要なバッファのサイズを定義します。だからあなたは2つのことを手に入れます:巨大なページとより速い転送!この機能は、コプロセッサーに透明な巨大ページ(THP)が導入されていてもまだ意味があります。
単にoffload_init= on_startとmic_use_2mb_buffers= 0を試すと、それに応じて host 側のバッファを揃えることができます(最大です。ベクトル幅とページサイズ;-)。追加のオフロード句を指定せずに覚えておいてください(ただし、OpenMP 4.0についてはわかりません)ホストバッファのアラインメントは、オフロードセクションによって継承です。 2MBに合わせてすべてをカバーする必要があります(ただし、小型バッファのリソースの浪費を避けるためにはるかにスマートになることができます)。それに、必要な場合は、より多くの背景を見つけるのに十分なキーワードがあるはずです。