83

この質問は、ここでの私の質問に続きます (Mystical のアドバイスによる):

C コードのループ性能


私の質問を続けると、スカラー命令の代わりにパック命令を使用すると、組み込み関数を使用するコードは非常によく似たものになります。

for(int i=0; i<size; i+=16) {
    y1 = _mm_load_ps(output[i]);
    …
    y4 = _mm_load_ps(output[i+12]);

    for(k=0; k<ksize; k++){
        for(l=0; l<ksize; l++){
            w  = _mm_set_ps1(weight[i+k+l]);

            x1 = _mm_load_ps(input[i+k+l]);
            y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
            …
            x4 = _mm_load_ps(input[i+k+l+12]);
            y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
        }
    }
    _mm_store_ps(&output[i],y1);
    …
    _mm_store_ps(&output[i+12],y4);
    }

このカーネルの測定されたパフォーマンスは、1 サイクルあたり約 5.6 FP 操作ですが、スカラー バージョンのパフォーマンスのちょうど 4 倍、つまり 1 サイクルあたり 4.1,6=6,4 FP 操作になると予想されます。

重み係数の移動を考慮すると (指摘してくれてありがとう)、スケジュールは次のようになります。

スケジュール

スケジュールは変更されていないように見えますが、movss操作の後にスカラーの重み値を XMM レジスタに移動し、shufpsこのスカラー値をベクター全体にコピーするために使用する追加の命令があります。mulpsロードから浮動小数点ドメインへの切り替えレイテンシを考慮して、重みベクトルを使用する準備ができているように見えるため、余分なレイテンシが発生することはありません。

このカーネルで使用されるmovaps(アラインされた、パックされた移動) addps&mulps命令 (アセンブリ コードでチェック) は、スカラー バージョンと同じレイテンシとスループットを持っているため、余分なレイテンシが発生することはありません。

このカーネルが得られる最大パフォーマンスがサイクルあたり 6.4 FP ops であり、サイクルあたり 5.6 FP ops で実行されていると仮定して、8 サイクルあたりのこの余分なサイクルがどこに費やされているかを知っている人はいますか?


ちなみに実際の組み立てはこんな感じ。

…
Block x: 
  movapsx  (%rax,%rcx,4), %xmm0
  movapsx  0x10(%rax,%rcx,4), %xmm1
  movapsx  0x20(%rax,%rcx,4), %xmm2
  movapsx  0x30(%rax,%rcx,4), %xmm3
  movssl  (%rdx,%rcx,4), %xmm4
  inc %rcx
  shufps $0x0, %xmm4, %xmm4               {fill weight vector}
  cmp $0x32, %rcx 
  mulps %xmm4, %xmm0 
  mulps %xmm4, %xmm1
  mulps %xmm4, %xmm2 
  mulps %xmm3, %xmm4
  addps %xmm0, %xmm5 
  addps %xmm1, %xmm6 
  addps %xmm2, %xmm7 
  addps %xmm4, %xmm8 
  jl 0x401ad6 <Block x> 
…
4

1 に答える 1

3

Vtune で EMON プロファイリングを使用するか、oprof などの同等のツールを使用してみてください

EMON (Event Monitoring) プロファイリング => 時間ベースのツールに似ていますが、どのパフォーマンス イベントが問題を引き起こしているかを知ることができます。ただし、最初に時間ベースのプロファイルから開始して、飛び出す特定の命令があるかどうかを確認する必要があります。(そしておそらく、その IP でリタイアメント ストールが発生した頻度を示す関連イベント。)

EMON プロファイリングを使用するには、「通常の容疑者」から ...

ここでは、キャッシュ ミス、アラインメントから始めます。あなたが使用しているプロセッサーが RF ポート制限のカウンターを持っているかどうかはわかりませんが、そうあるべきですが、私はずっと前に EMON プロファイリングを追加しました。

フロントエンド、命令フェッチ、ストールの可能性もあります。とにかく、これらの命令には何バイトありますか? そのためのEMONイベントもあります。


Nehalem VTune が L3 イベントを認識できないというコメントへの対応: 正しくありません。これは私がコメントに追加していたものですが、収まりませんでした:

実際には、LL3 / L3$ / いわゆる Uncore 用のパフォーマンス カウンターがあります。VTune がそれらをサポートしていないとしたら、私は非常に驚くでしょう。http://software.intel.com/sites/products/collat​​eral/hpc/vtune/performance_analysis_guide.pdfを参照してください。VTune および PTU などのその他のツールを指します。実際、LL3 イベントがなくても、David Levinthal は次のように述べています。命令の実行と実際のデータ配信の間のサイクル. 測定されたレイテンシが MSR 0x3f6 のビット 15:0 にプログラムされた最小レイテンシよりも大きい場合、カウンタがインクリメントされます. カウンタ オーバーフローは PEBS メカニズムを準備し、次のレイテンシしきい値を満たすイベント、測定されたレイテンシ、仮想アドレスまたは線形アドレス、およびデータ ソースは、PEBS バッファ内の 3 つの追加レジスタにコピーされます. 仮想アドレスは既知の場所にキャプチャされるため、サンプリング ドライバは、仮想から物理への変換を実行し、物理アドレスを取得することもできます。物理アドレスは NUMA のホーム ロケーションを識別し、原則として、キャッシュ占有率の詳細を分析できます。" 彼はまた、35 ページで、L3 CACHE_HIT_UNCORE_HIT や L3 CACHE_MISS_REMOTE_DRAM などの VTune イベントを指摘しています。コードを作成して VTune の下位レベル インターフェイスにプログラムしますが、この場合はプリティ ユーザー インターフェイスに表示されると思います。


わかりました。http://software.intel.com/en-us/forums/showthread.php?t=77700&o=d&s=lrで、ロシアの VTune プログラマー (と思います) が Uncore でサンプリングできないことを「説明」しています。イベント。

彼は間違っています。たとえば、CPU を 1 つだけ有効にして、意味のあるサンプリングを行うことができます。また、L3 欠落データが CPU に戻ったときにマークする機能もあると思います。実際、L3 は全体として、データを返す CPU を認識しているため、間違いなくサンプリングできます。どのハイパースレッドかわからないかもしれませんが、無効にしてシングル スレッド モードに切り替えることができます。

しかし、かなり一般的であるように、これを行うには、VTune を使用するのではなく、VTune の周りで作業する必要があるようです。

最初にレイテンシ プロファイリングを試してください。それは完全に CPU の内部にあり、VTune 関係者がそれを台無しにした可能性は低いです。

繰り返しますが、問題は L3 ではなくコアにある可能性があります。したがって、VTune はそれを処理できるはずです。


Levinthalあたりの「Cycle Accounting」を試してみてください。

于 2012-04-17T22:14:07.827 に答える