問題タブ [xeon-phi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Intel TBB ライブラリを Xeon Phi で利用可能にする方法
Xeon Phi オフロード コードのセグメントで Intel TBB を使用しようとしています。コードはエラーでコンパイルに失敗しますerror : *MIC* cannot open source file "tbb\parallel_for.h"
MPSS スタックをインストールし、binutils.msi
ユーティリティを実行しました。オフロードされたコード ファイルの先頭にあるインクルードは次のとおりです。
なぜこれが失敗するのですか?
コードを正常にオフロードして実行するには、何を変更する必要がありますか?
編集 :
-tbb
「MIC オフロード コンパイラの追加オプション」にオプションを追加した後、コンパイラは<tbb\parallel_for.h>
ファイルを検出しましたが、共有としてマークされていない tbb ライブラリ コードに関するいくつかの警告とエラーが表示されます。以下は、オフロードされたコード セグメントです。
intrinsics - _mm512_mask_prefetch_i32gather_ps() は各要素のキャッシュ ライン全体をプリフェッチしますか?
収集プリフェッチ組み込み関数_mm512_mask_prefetch_i32gather_ps
を使用して、Knights Corner で 32 ビット float をプリフェッチできます。
double に対応する組み込み関数が存在しないため、この組み込み関数を 64 または 128 ビット要素のプリフェッチに使用するにはどうすればよいですか?
4 バイトのチャンクごとに明示的にプリフェッチする必要がありますか? それとも、32 ビット変数のプリフェッチごとに、それが占有する 64 バイトのキャッシュ ライン全体を実際にプリフェッチすると想定できますか?
例:
{1,2,10,12}
base address からのオフセットで 4 つの double をプリフェッチしたいと考えています0xf0000000
。
これは のアドレスに対応します{0xf0000008, 0xf0000010, 0xf0000050, 0xf0000060}
。
これらは、 から始まる 2 つのキャッシュ ラインを占有し{0xf0000000, 0xf0000040}
ます。
_mm512_mask_prefetch_i32gather_ps
これら 2 つのキャッシュ ラインのベース アドレスを使用するだけで十分でしょうか?
私はもともとこの質問を Intel MIC フォーラムに投稿しましたが、成功しませんでした。
c - インライン asm の Jknzd、コンパイルでエラー
MIC (Intel Xeon Phi) の C コードでインライン asm を作成しようとしています。そして、jknzd命令に問題があります。
これは私のコードの一部です:
コンパイラは icc-13.0.1、オプション: -mmic -lrt -O3。コンパイルしようとすると、次のメッセージが表示されます。
/tmp/icc1XDD1vas_.s: アセンブラ メッセージ: /tmp/icc1XDD1vas_.s:237: エラー: 無効な文字 '{' オペランド 1
{rz-sae}' /tmp/icc1XDD1vas_.s:250: Error: invalid char '{' beginning operand 1
{rn-sae} の開始' /tmp/icc1XDD1vas_.s:254: エラー: 無効な文字 '{ ' オペランド 1 の開始{rn-sae}' /tmp/icc1XDD1vas_.s:260: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:263: エラー: 無効な文字 '{' オペランド 1 の開始{rn-sae}' /tmp/icc1XDD1vas_.s:264: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:360: エラー: 無効な文字 '{ ' オペランド 1 の開始{rz-sae}' /tmp/icc1XDD1vas_.s:373: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:375: エラー: 無効な文字 '{' オペランド 1 の開始{rn-sae}' /tmp/icc1XDD1vas_.s:378: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:383: エラー: 無効な文字 '{ ' オペランド 1 の開始{rn-sae}' /tmp/icc1XDD1vas_.s:385: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:398: エラー: 無効な文字 '{' オペランド 1 の開始{rz-sae}' /tmp/icc1XDD1vas_.s:402: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:415: エラー: 無効な文字 '{ ' オペランド 1 の開始{rn-sae}' /tmp/icc1XDD1vas_.s:417: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:422: Error: invalid char '{' beginning operand 1
{rn-sae}' /tmp/icc1XDD1vas_.s:421: エラー: オペランド 1 {rn-sae} の開始文字 '{' が無効です
「jmp 1b」のような簡単なジャンプがあればOKです。私は何を間違っていますか?
tbb - Xeon Phi で tbb アトミック操作を使用する
tbb
compare_and_swap
ロックフリー アルゴリズムで Xeon Phi の操作を使用しています。Xeon Phiは受注生産機のため、動作には対応しておりませんsfence
。では、アトミック操作は Xeon Phi で正しく機能するのでしょうか?
c++ - Intel MIC ステンシル計算
インテル Xeon Phi コプロセッサー (61 コア) 向けに、5 点ステンシル計算を実行する効果的な並列アプリケーションを作成したいと考えています。私は 2 つのバージョンのコードを書きました。
最初: OpenMP の「#pragma omp parralel for」を使用しました
2 つ目: マトリックスを 61 個のコアに分割しました。マトリックスの各部分は、各コアで実行される 4 つの HW スレッドによって計算されます。このバージョンでは、同じ L2 キャッシュの周りで 4 つのスレッドの計算を行うことで、キャッシュ ミスを減らすことを試みました。
この wersion ループでは、行列の各部分の反復が次のように実行されます。
i=0 -> スレッド 0
i=1 -> スレッド 1
i=2 -> スレッド 2
i=3 -> スレッド 3
i=4 -> スレッド0
...
このコードを実行した後。2 番目のバージョンは低速でした。しかし、なぜ?
c++ - MIC の奇妙な結果
私の論文では、Xeon Phi コプロセッサーでレナード・ジョーンズ システムを研究するために使用される単純なコードを実行し、それをベクトル化し、実行時間の変化を研究しようとしました。
特に私が使用したマシンは 61 個のコアを持ち、L1 キャッシュが 32 kB、L2 キャッシュが 512 kB で、ベクトル レジスタは 512 ビットを記憶できます。
cell-list メソッドを使用するコードと使用しないコードを実装し、異なる数の粒子 (特に 512 から 16384 まで) を使用して、毎回 2 倍にしました。
位置と力は、3 つの異なるベクトル (rx、ry、rz および fx、fy、fz) で記憶されます。
cell-list がない場合は良い結果が得られますが、別の場合は奇妙な結果が得られます。
セルリストと粒子数の間の依存関係は、実装されたセルリストメソッドで線形になるはずです。実際、粒子数に対して時間をプロットする直線が得られましたが、N = 8192 と N = 16384 の場合、実行力ははるかに高いです。
これらの値に近い N の値を使用して計算を試みましたが、スケーリングは他の数値に対して正しく、これら 2 つの場合にのみ問題があります。
明確にするために、いくつかの値を報告します。
技術的な問題だと思いますが、なぜこれが起こるのか正確にはわかりません。
また、ベクトル化を使用した場合の変動は非常に小さく、cell-list を使用しない場合は 4 倍程度の変動が観測されましたが、cell-list を使用した場合は約 1.5 倍にすぎません。
質問:
問題が何であるかを知っている人はいますか?これらの特定の値が奇妙で、ベクトル化ゲインが非常に低いのはなぜですか?
私の教授は、いくつかの値が実行時に奇妙な結果を示すことが起こる可能性があると私に言いました.誰かがこのようなことを観察しましたか?
どうもありがとうございました。
以下に、cell-list で実装された実行の主要部分である力を評価するメイン ループを報告します。