プロセッサのFLOPSにおける理論性能と実効性能に関する考察

1年くらい前に卒論で学んだことをほとんどアウトプットしてなかったので,研究テーマにクリティカルでない内容をちょいちょいアウトプットしていきたい.
あくまで自分の理解を書いているだけなので内容に間違いがあるかもしれない.

今回はFLOPSの話.

FLOPS

FLOPSとはFLoating-point Operations Per Secondの略で,1秒間あたりの浮動小数点数演算の回数のこと.
FLOPSはプロセッサの性能指標として使われる.
スパコンやGPUなどのHPCの世界でよく見かける.
あくまで演算命令の回数であって,演算以外の命令(メモリ操作など)は含まれない.

FLOPSでややこしいのは,FLOPSという言葉が理論性能と実効性能の両方を指していることかもしれない. 僕の観測範囲では,理論性能を指していることが多い気がする.

理論性能としてのFLOPSは,プロセッサのパイプラインにおける全てのサイクルで,演算を実行できると仮定したときの1秒あたりの演算回数である.

一方,実効性能としてのFLOPSは,実際になんらかのアプリケーション(科学計算的なやつが多い)を実行したときの1秒あたりの演算回数である.

(実効性能としてのFLOPS) / (理論性能としてのFLOPS) でプロセッサの実行効率を表せる.

実効性能が理論性能に届かない原因は以下のような感じだと考えている.

  • 理論性能としてのFLOPSにはSIMD演算命令も含まれており,アプリケーションの全ての命令がSIMD演算で処理できるわけはないので,SIMD演算以外の演算の分だけ実効性能が低下する.(SIMDについてはまた今度エントリ書きたい)

  • 理論性能としてのFLOPSに積和演算命令が含まれている場合,アプリケーションの全ての演算が積和演算命令を使って処理できるわけではないので,積和演算でない演算の分だけ実効性能が低下する.

  • パイプラインのうち,例えばメモリからデータをレジスタにフェッチしたときに,キャッシュミスすると1サイクルではとうてい終わらず,その次の命令にフェッチした結果を用いなければならない場合(ハザード),メモリアクセスを待たなければならない.メモリアクセスを待っている間に何も演算を実行していないので実効性能が低下する.

FLOPSの計算に関する詳細は下記の参考資料を読むといいと思う.

実効効率はCPU利用率と似てる雰囲気あるけど,ぜんぜん違うものだ.
うまく比較するのは難しいけど,細かいことを気にせず誤解を恐れずに言えば,CPU利用率は経過したコンピュータ時間のうちのCPUを利用している時間の割合をみるのに対して,実行効率はCPU利用時間の内のCPUが演算を行なっている割合をみていると思う.

CPU利用率の分子にはメモリアクセス待ち時間が含まれているのに対して,実行効率はメモリアクセス待ちを無駄な時間と捉えて,純粋に演算の効率だけをみている.

要はシステム全体の性能を評価するときはCPU利用率を用いて,あるアルゴリズムの計算効率を評価したいときはFLOPSを用いる感じだと思う.

卒論時に,Sandy Bridge世代のCPUで実行すると実効性能としてのFLOPSが理論性能としてのFLOPSを超えてしまったことがあって,結局何がおかしかったのかがわからなかった.
(Nehalemだとそんなことはなかった)
アプリケーションが整数演算のみを含んでいたので,理論性能としてのFLOPSを浮動小数点演算ではなく整数演算の個数を元に計算していたからだと思う.
ALUの個数とかをみてると浮動小数点演算は基本的に1サイクルあたり1回実行できるけど,整数演算はSandy Bridgeの場合,1サイクルあたり2回以上実行できそうな雰囲気はあった.
でも,結局決定的な資料を見つけられなかった.

参考