問題タブ [flops]

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.

0 投票する
1 に答える
484 参照

c - FLOP とデータのサイズをカウントし、関数がメモリ バウンドか CPU バウンドかを確認する

私はいくつかの C コードを分析して最適化するつもりなので、最初に、最適化したい関数がメモリ バウンドか CPU バウンドかを確認する必要があります。一般に、これを行う方法はわかっていますが、浮動小数点演算のカウントと使用されるデータのサイズの分析についていくつか質問があります。分析したい次の for ループを見てください。配列の値は double です (つまり、それぞれ 8 バイトを意味します)。

1) 浮動小数点演算はいくつ数えますか? 私は 3*(Nt-1)*N について考えました...しかし、配列内の操作もカウントする必要がありますか?

2) どのくらいのデータが転送されますか? 2* ((Nt-1)*N) 8Byte または 3 ((Nt-1)*N)*8Byte. つまり、マトリックスのすべてのエントリをロードする必要があります。計算後、新しい値が配列のそのインデックスに保存されます (これらは 1 ロードと 1 ストアです)。ただし、この値は次の計算に使用されます。したがって、別のロード操作が必要ですか、それともこの値 (matrix[j*Nt+i-1]) はロード操作なしで既に使用可能ですか?

ありがとう!!!

0 投票する
1 に答える
939 参照

optimization - GPU での行列乗算。メモリ バンクの競合とレイテンシの隠蔽

編集:時間の経過に伴う成果は、この質問の最後にリストされています(まだ〜1Tflops/s)。

私は、C++ DLL から opencl(gpu) を使用して C# 用のある種の数学ライブラリを作成しており、単精度正方行列 - 行列乗法 (学習目的および後でニューラル ネットワーク プログラムでの再利用の可能性のため) でいくつかの最適化を既に行っています。以下のカーネル コードは、v1 1D 配列を matrix1(1024x1024) の行として取得し、v2 1D 配列を matrix2 の列として取得し ((1024x1024)転置最適化)、結果を v3 1D 配列にマトリックス 3 の行として配置します (1024x1024)。

今のところ、1024x1024 正方行列 - 行列乗算のカーネル実行時間は、HD7870 で 3.6 ms です。

行われた最適化:

  • 2 番目の行列の転置 (改善された時間)
  • 32x32 サブマトリックスを使用してローカル メモリで計算する (私の HD7870 では最大ワークグループ サイズが 256 であり、gpu は何らかの理由で 24kB を超えるローカルを受け入れないため、4x 16x16 ですが、オンライン ソースは 64kB と言っていますか?)(とにかく、かなりの差で時間を改善しました)
  • 結果をローカルおよびグローバルに書き込む前に、プライベート変数を使用してデータを再利用することを増やしました。(時間の改善)
  • 最も内側のループでのローカル 2D 配列への列優先アクセス。(タイムアップ)
  • パッチごとに 2 つのアキュムレータ レジスタへの加算を共有します。(時間の改善と数値安定性の低下)
  • 最も内側のループをループ展開しても時間は改善されませんでした (4 回目の展開後にさらに悪化しました) (したがって、整数 alu を緩和する必要があります)

質問:すべてのローカル (lds) バンク競合の排除やメモリ レイテンシを隠すための命令の並べ替えなどの最適化を完了できませんでした。この数学関数のパフォーマンスを向上させるにはどうすればよいですか?

このカーネルは確かにローカルメモリの帯域幅 (競合) に制限されており、乗算に 3.2 ミリ秒かかります =

(1024*1024*1024 * (1 sum + 1 mult =2) / 0.0036 seconds )= 596x10^9 Flops per second(596 GFlops) コンピューティング ユニットごとのローカル メモリが多いか、コアが多いか、またはその両方があるためですか?

(1024*1024*1024*(2 float 読み取り)*(4 バイト/float) /0.0036 秒)=2386x10^9 バイト/秒 しかし、このカーネルは 8 個の float を読み取り、それらを 16 回使用し、データの再利用は 2 です。フロートごと。

2386x10^9 バイト / 再利用 (2) = 1193 GB/秒

HD7870 の理論上の最大値は次のとおりです。ここでは、付録 D

計算能力 = 毎秒 2560 ギガ浮動小数点演算、LDS 帯域幅 = 2560 GB/秒、レジスタ アクセス帯域幅 = 15360 GB/秒

カーネルは次のとおりです。

以下は、バンクの競合を排除しようとしたものですが、カーネルの実行時間は約 20 % 増加しました。

これは新しいgpuの放送技術でしょうか?また、16 要素の合計は、16 バンクのみが使用されることを意味しますか? デバイスには、ローカル アクセス用に 32 のバンクがあります。

これが私がメモリレイテンシを隠そうとしたものです:

しかし、これは exec を増減しませんでした。時間。

カーネル時間を改善するにはどうすればよいですか? 実行可能ですか?

デバイス: HD7870 @ 1000MHz/1200MHz ホスト: FX8150@4GHz ヘッダー、Khronos のサイトからの LIB ファイル、AMD のドライバーからの opencl.dll。

時間のサンプリングは次のように行われます: カーネルを 100 回循環させ、Stopwatchstart() および stop() メソッドからの合計時間を 100.0 で割ります。実行のみで、配列のコピーは含まれません。

すべての結果は、ランダム行列の同じ入力を使用した単純な 3 ネスト ループ バージョンと比較されます (結果は m(ij)+/-delta の範囲内で、delta は 0.001f です)。

ここでのカーネルは、より一般化されたものの単純化されたバージョンです (さまざまなマトリックスとパッチ サイズ用)。

このバージョンのカーネル パラメータ: グローバル= 512,512 ローカル=16,16、リファレンス=0,0

8320x8320 マトリックスの場合 --->Global=4160,4160, Local=16,16, ref=0,0 time = 1.87Seconds

編集:ローカルの Lcache3 をプライベート バージョンに置き換えると、DarkZeros の提案により、1024x1024 の時間が 2.7 ミリ秒に改善されました。これは毎秒 795 GFlops です。これは占有率が良いからでしょう。

Edit2:ローカルでの使用量が少ないため、48x48 (9 x 16x16) パッチを使用する可能性が開かれ、1056x1056 の乗算が 2.4 ms -->981 Gflops/s になりました。8208x8208 は、1150 GFlops を超える 961ms で実行されます。

0 投票する
2 に答える
805 参照

c++ - 一部のコードの浮動小数点演算カウントを取得する自動方法

かなり複雑で高度にテンプレート化されたコード (C++ ですが、これはあまり関係ないかもしれません) があり、実行時の add、sub、mul、div、および sqrt の数を知りたいです。この情報を自動的に取得する方法はありますか (コンパイラーは簡単に解決できます)。生成されたアセンブラ コードで自分でカウントしようとしましたがjp、 、jmp、およびcalls と混同されました。

0 投票する
1 に答える
2135 参照

gpu - GPU FLOPS と FPS

私は OpenCL および OpenGL アプリケーションのパフォーマンスを推定するために GPU をモデル化しています (どれを開示することはできません)。モデルは、実行中のアプリ/カーネル/コードの FLOPS を合理的に推定できます。FLOPS から 1 秒あたりのフレーム数を推定する方法があります。またはフレームバッファをモデル化し、そこから FPS を推定する方がよいでしょうか。