0

奇妙な動作が見られます。Intel Xeon Phi に関連するものかどうかを知りたいです。

基本的に誰もが知っている行列乗算 (3 つのネストされた for ループ) の小さなコード例があります。targetOpenMP 4.0プラグマを使用して Intel MIC に計算をオフロードし、3 つの行列をmap(to:A,B) map(tofrom:C).

現在、私が観察しているのは、1024x1024 などの小さな行列の場合、メモリ転送に非常に長い時間がかかることです。ネイティブ バージョン (同じコード、同じ並列化戦略、オフロードなし) と比較して、オフロード バージョンは約 320 ミリ秒多くの時間を消費します。初期化のオーバーヘッドを取り除くために、コードのウォームアップを実行しました。

この 320 ミリ秒に気付かずに同じ量のメモリがコピーされる 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)

MIC Time で欠けている 10 秒は何ですか (メモリー転送?)

さて、3つ目の質問です。Intel MIC で固定メモリを使用することは可能ですか? はいの場合、どのように?

4

2 に答える 2

1

「初期化のオーバーヘッドを取り除くためにコードのウォームアップ ランを行った」とおっしゃっていたので、ダミー セクションをオフロードしてオフロード ランタイムを開始したと思います。「on_offload」(デフォルト) またはプログラムの初期化時 (OFFLOAD_INIT=on_start) に開始する調整があることを覚えています。とにかく、DMAエンジンにも高速パスがあります。バッファー (転送される) がページ サイズに合わせられると、ファスト パスが使用されます。オフロード アプリケーションの場合、環境変数をしきい値 integerB|K|M|G|T と共に設定するだけで済みます (M はメガバイトです (例: MIC_USE_2MB_BUFFERS=2M))。このしきい値は、巨大なページが使用される前に必要なバッファーのサイズを定義します。つまり、巨大なページと高速転送の 2 つが得られます。

OFFLOAD_INIT=on_start と MIC_USE_2MB_BUFFERS=0 を単純に試した後、それに応じてホスト側のバッファーを調整したい場合があります(ベクトル幅とページサイズの最大値 ;-)。オフロード節を追加しないと (LEO; ただし OpenMP 4.0 については不明)、ホスト バッファーのアラインメントは単にオフロード セクションに継承されることに注意してください。2MB に調整すると、すべてがカバーされるはずです (ただし、小さなバッファーのためにリソースを浪費するのを避けるために、割り当てをよりスマートにすることができます)。これで、必要に応じてより多くの背景を見つけるのに十分なキーワードが必要になります。

于 2013-11-18T06:48:00.910 に答える
1

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))
于 2013-11-18T17:31:10.910 に答える