問題タブ [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.
c - Linux perf ツールを使用したアプリケーションの FLOP の測定
Linuxパフォーマンスカウンターサブシステムへの新しいコマンドラインインターフェイスコマンドである「perf」を使用して、アプリケーションによって実行される浮動小数点および算術演算の量を測定したいと考えています。(テスト目的で、私が作成した単純なダミー アプリを使用します。以下を参照してください)。
FP および整数演算を測定するために定義された「perf」イベントが見つからなかったため、未加工のハードウェア イベント コード (-rNNN で使用するため、NNN はイベント コードの 16 進値) を調べ始めました。したがって、私の本当の問題は、廃止された命令 (INST_RETIRED) で見つけたコードが、FP と他の命令 (X87 および MMX/SSE) を区別しないことです。特定のコードに適切な umask を使用しようとしたときに、どういうわけか「perf」が umask の組み込みを理解またはサポートしていないことがわかりました。私は試しました:
これにより、引退した指示が表示されますが、
これにより、実行された X87 命令に、間違ったパラメーターを指定したことが示されます。そうかもしれませんが、「perf」で生のハードウェア イベントの umask を使用する正しい方法は何ですか? 一般に、perf ツールを使用してプログラムが実行した浮動小数点演算と整数演算の正確な数を取得する方法は何ですか?
どうもありがとう、コンスタンティン・ボヤノフ
ここに私のテストアプリがあります:
c++ - コードのフロップを数える!
これは本当に時間がかかっています。次のコード(ループ)のFLOPSを推定する簡単な方法が見つかりませんでした。ループの1回の反復でのFLOPSの量は次のとおりです。
見た目はシンプルですが、先ほどの数字と混同してしまいましたので、正確な数字を教えていただければ幸いです。
ありがとう。
optimization - パフォーマンスと全体的な効率を測定するために GPU の sqrt に割り当てられた FLOPS
GPU 実装では、そのパフォーマンスを GLOPS で見積もる必要があります。コードは非常に基本的なものですが、私の問題は、操作「sqrt」または「mad」に 1 かそれ以上の FLOPS を与える必要があるかどうかです。
さらに、この GPU の理論上の最大値は 500GFLOPS ですが、これらの操作で 1 FLOP と言うと、コードで 50 GFLOPS が得られます。パーセンテージで表すと10%になります。スピードアップに関しては、100倍になります。ですから素晴らしいと思いますが、10% は利回りが少し低いように思えますが、どう思いますか?
ありがとう
c++ - サイクルあたり理論上の最大4FLOPを達成するにはどうすればよいですか?
最新のx86-64IntelCPUで、サイクルごとに4つの浮動小数点演算(倍精度)の理論上のピークパフォーマンスをどのように達成できますか?
私が理解している限り、最新のIntel CPUのほとんどでSSE add
が完了するまでに3サイクル、aが完了するまでに5サイクルかかりmul
ます(たとえば、Agner Fogの「InstructionTables」を参照)。add
パイプライン処理により、アルゴリズムに少なくとも3つの独立した合計がある場合、サイクルごとに1つのスループットを得ることができます。addpd
これは、パックバージョンとスカラーバージョンの両方に当てはまりaddsd
、SSEレジスタには2つdouble
の'を含めることができるため、スループットは1サイクルあたり最大2フロップスになる可能性があります。
さらに、(これに関する適切なドキュメントは見ていませんが)add
とmul
は並行して実行でき、1サイクルあたり4フロップの理論上の最大スループットが得られるようです。
ただし、単純なC /C++プログラムではそのパフォーマンスを再現できませんでした。私の最善の試みは、約2.7フロップ/サイクルでした。誰かがピークパフォーマンスを示す単純なC/C ++またはアセンブラプログラムを提供できるなら、それは大いにありがたいです。
私の試み:
コンパイル済み:
Intel Core i5-750、2.66GHzで次の出力を生成します。
つまり、1サイクルあたり約1.4フロップスです。メインループでアセンブラコードを見るのは、
g++ -S -O2 -march=native -masm=intel addmul.cpp
私にはちょっと最適なようです。
パックバージョン(addpd
およびmulpd
)でスカラーバージョンを変更すると、実行時間を変更せずにフロップカウントが2倍になるため、サイクルあたり2.8フロップに満たないことになります。サイクルごとに4フロップを達成する簡単な例はありますか?
Mysticialによる素敵な小さなプログラム。これが私の結果です(数秒間だけ実行します):
gcc -O2 -march=nocona
:10.66Gflopsのうち5.6Gflops(2.1フロップス/サイクル)cl /O2
、openmpが削除されました:10.66Gflopsのうち10.1Gflops(3.8フロップ/サイクル)
すべてが少し複雑に見えますが、これまでの私の結論は次のとおりです。
gcc -O2
addpd
可能な場合はとを交互に使用することを目的として、独立した浮動小数点演算の順序を変更しmulpd
ます。同じことが。にも当てはまりますgcc-4.6.2 -O2 -march=core2
。gcc -O2 -march=nocona
C++ソースで定義されている浮動小数点演算の順序を維持しているようです。cl /O2
、 SDK for Windows 7の64ビットコンパイラは 自動的にループ展開を行い、3つaddpd
のグループが3つと交互になるように操作を調整しているようですmulpd
(少なくとも私のシステムと私の単純なプログラムでは) 。私のCorei5750(Nehalemアーキテクチャ)は、addとmulを交互に使用するのが好きではなく、両方の操作を並行して実行できないようです。ただし、3つにグループ化すると、突然魔法のように機能します。
他のアーキテクチャ(おそらくSandy Bridgeなど)は、アセンブリコードで交互になっている場合、問題なくadd/mulを並行して実行できるようです。
認めるのは難しいですが、私のシステムで
cl /O2
は、システムの低レベルの最適化操作ではるかに優れた仕事をし、上記の小さなC++の例でピークに近いパフォーマンスを達成しています。私は1.85-2.01フロップ/サイクルの間で測定しました(Windowsではclock()を使用しましたが、これはそれほど正確ではありません。おそらく、より良いタイマーを使用する必要があります-Mackie Messerに感謝します)。私が管理し
gcc
た最善の方法は、手動でループ展開し、加算と乗算を3つのグループに配置することでした。g++ -O2 -march=nocona addmul_unroll.cpp
せいぜい0.207s, 4.825 Gflops
1.8フロップ/サイクルに相当するものが得られますが、これは今では非常に満足しています。
for
C ++コードでは、ループを次のように置き換えました。
そして、アセンブリは次のようになります。
c++ - 以下のコードで浮動小数点演算を最小限に抑える方法
次のコードでフロップの総数を最小限に抑える必要があります。だれか簡単に見て、どこに力を注ぐべきか教えてもらえますか? いくつかのパフォーマンス アナライザーを試しましたが、結果は適切ではありませんでした..
ありがとう、チョー
c# - C# アプリが使用する FLOPS を測定するにはどうすればよいですか?
Microsoft の Parallel Programming ホワイトペーパーでは、さまざまな FLOPS しきい値の下で最適な状況が説明されており、FLOPS レートは、特定の実装をいつ使用する必要があるかを決定するポイントであると説明されています。
アプリケーションで FLOPS を測定するにはどうすればよいですか?
cpu - 最新の FPGA のパフォーマンスは、CPU と比較して、絶対的に (GFlops/GIops) でどのくらいですか?
最新の FPGA の CPU に対するパフォーマンスは絶対 (GFlops/GIops) で、FPGA で 1 秒あたり 10 億の整数演算のコストはどれくらいですか? また、現在 FPGA を使用するメリットがあるのはどのタスクですか? 私はそれを見つけただけです: http://www.hpcwire.com/hpcwire/2010-11-22/the_expanding_floating-point_performance_gap_between_fpgas_and_microprocessors.html
python - PythonFLOPS計算
Python分散処理プログラムを実装したすべてのコンピューターで、標準化されたFLOPSの推定値を取得しようとしています。私は現在、パイストーンを非常に細かく計算できますが、パイストーンは特によく知られていないため、実際にどれほど正確であるかは完全にはわかりません。
したがって、さまざまなCPUなどを搭載している可能性のあるさまざまなマシンでFLOPSを計算する方法(またはすでに実行しているモジュール)が必要です。Pythonはインタプリタ言語であるため、実行にかかる時間をカウントするだけです。設定された数の操作は、たとえばLinpackのレベルでは実行されません。ベンチマークで有名な「名前」の1つとまったく同じ見積もりをする必要は特にありませんが、少なくとも適度に近いものにしたいと思います。
したがって、FLOPSを取得できるようにする方法または既存のモジュールはありますか?そうでなければ、私の唯一の選択はCythonにコンパイルするか、CPUクロック速度に基づいて機能を推定しようとすることです...
c++ - How to compare performance of two pieces of codes
I have a friendly competition with couple of guys in the field of programming and recently we have become so interested in writing efficient code. Our challenge was to try to optimize the code (in sense of cpu time and complexity) at any cost (readability, reusability, etc).
The problem is, now we need to compare our codes and see which approach is better comparing to the others but we don't know any tools for this purpose.
My question is, are there some (any!) tools that takes a piece of code as input and calculates the number of flops or cpu instructions necessary for running it? Is there any tool can measure the optimacy of a code?
P.S. The target language is c++ but would be nice to know if such tools exists also for java.