SX-Aurora TSUBASAではじめるベクトルプログラミング(PDF)

【基本】CPUやGPUの理論値FLOPSの計算方法と測定方法

この記事は約15分で読めます。

みなさん、こんにちわ。Vectory(@vectorywork)です。

 

今回は、FLOPSについて書きたいと思います。

理論計算性能は簡単に計算できますので、分からなくなったら自分で計算してみてください。

 

メモリバンド幅の計算方法については以下をどうぞ↓

 

FLOPS(Floating-point Operations Per Second)とは

FLOPS(フロップスと読みます)は、FLoating-point Operations Per Secondの略でコンピュータの性能指標の一つです。

FLOPSは、1秒間に浮動小数点演算が何回できるか示す値です。

例えば、1秒間に10回演算が出来るマシンは、「10FLOPSの性能を持つ」ということになります。

 

最近のコンピュータは性能が上がってきていますので、1兆FLOPSなど、非常に大きな値になります。

そういったときには、Giga(ギガ)とかTera(テラ)とかの接頭辞をつけることが一般的です。

読み記号
エクサ(Exa)E1,000,000,000,000,000,000100京
ペタ(Peta)P1,000,000,000,000,0001000兆
テラ(Tera)T1,000,000,000,0001兆
ギガ(Giga)G1,000,000,00010億
メガ(Mega)M1,000,000100万

 

FLOPS計算方法

理論演算性能(FLOPS)の計算方法ですが、プロセッサのクロック周波数クロックあたりの演算数で決まります。

 

例えば、Intel Xeon Skylake-SP Goldシリーズの場合のクロックあたり演算数は、

  • AVX512⇒8 (=512/64)
  • FMA演算器の数⇒2
  • FMA (Fused Multiply-Add) 1演算器あたり⇒2 (足し算と掛け算が同時にできるので2)

から、クロックあたりの演算数=8×2×2=32です。

※この32という値は、プロセッサによって変わります。

 

Intel Xeon Gold 6126(2.6GHz/12core)

Intel Xeon Gold 6126のクロック周波数は2.6GHz(ベース動作周波数)です。

よって、1コアあたりの性能は、

2.6GHz × 32 = 83.2 GFLOPS/core

となります。

 

加えてIntel Xeon Gold 6126は、1CPUあたり、12コアありますので

83.2 FLOPS × 12コア = 998.4 GFLOPS/CPU

となります。

 

AVX利用時は、演算数は増えるけどクロックが下がる?

引用:http://pc.watch.impress.co.jp/docs/news/665641.html

少し細かい話になりますが、AVX利用時の周波数は、ベースクロックより下がります。

そのため、AVX512を考慮した演算数でFLOPS計算する時は、AVX512 Base Frequencyを使って理論演算性能を計算する必要があります。

 

ただし、今までの慣例からかTOP500などに登録されるFLOPS値は、AVX512を考慮した演算数×ベースクロックで計算されることが多いようです。

このあたりは少し注意が必要です。

 

なお、ベースクロック、AVXクロックともにIntelより情報が公開されています。

Intel® Xeon® Processor Scalable Family Specification Update

2nd Gen Intel® Xeon® Scalable Processors Spec Update

 

一方でGPUなどはターボクロックという最大クロックを利用してFLOPSを算出していたりと、ルールが定まっていないため、平等に比較されていないのでは?という問題点も度々耳にします。

 

Intel Core i7 8700K(Coffee Lake)(3.7GHz/6core)

パソコンに使われるCPUのFLOPS値も確認しておきましょう。

Intel Core i7 8700Kは、AVX2となりますので演算数は上記のXeonよりも少なくなります。

3.7GHz × 16 × 6core = 355.2GFLOPS/CPU

※FMA対応や演算器数が違うかも知れません。。違ってたら指摘お願いします。

 

Intel ロードマップ

コードネーム世代製造プロセス発売年
Nehalem(Lynnfield)1st45nm2009
Sandy Bridge2nd32nm2011
Ivy Bridge3rd22nm2012
Haswell4th22nm2013
Broadwell5th14nm2014
Skylake6th14nm2015
Kabylake7th14nm+2016
Coffeelake8th14nm++2017
Cannonlake9th(予定)10nm2018
Icelake10th(予定)10nm+未定

ちなみにデスクトップパソコン向けのIntel CPUの推移は上記のような感じです。

私の今使っているパソコンはIvyBridgeくらいだったと思うのでそろそろ買い替えたいです。

 

AMD EPYC 7451(2.3GHz/24core)

AMDのEPYCもAVX2拡張命令セットですので演算数は16です。

したがって計算式は以下となります。

2.3GHz ×16 × 24コア = 883.2 GFLOPS/CPU

 

NVIDIA GPU Tesla V100(1.53GHz/2560core)

参考:http://images.nvidia.com/content/volta-architecture/pdf/volta-architecture-whitepaper.pdf

最近流行りのNVIDIA GPUは、AVXといったベクトル拡張命令セットはありません。

そのかわりにコア数が沢山あります。

 

Tesla V100の場合には、浮動少数演算コア数が2560あります。

クロックは1.53GHz(※ターボクロック)とのことなので以下になります。

1.53GHz ×2 × 2560コア = 7833 GFLOPS/GPU

 

京(K computer)(SPARC64TM VIIIfx)(2GHz/8core)

国のプロジェクトで開発された京のプロセッサは、SPARCアーキテクチャで2GHz/8core。

SIMD拡張(積和演算器2個 x 2セット)とのことなので以下となる。

2GHz × 8 × 8コア = 128GFLOPS

 

富岳A64FX、Armv8.2-A SVE(1.8GHz/48core)

富岳のA64FX、PRIMEHPCは富岳の商用機ですね。

国が開発費を一企業に提供しているという香ばしいマシンですがその分期待できますね。

Armv8.2-A SVE (2x 512-bit wide SIMD FMA)

1.8GHz x 2 x 2(FMA) x 8(512bit) x 48core =2.7 TFLOPS

 

SX-Aurora TSUBASA (1.6GHz/8core)

SX-Aurora TSUBASAは、NEC独自の日本発の商用プロセッサです。

  • ベクトル命令セット/cycle⇒32要素(64bitが32個)
  • FMA (Fused Multiply-Add) ⇒2
  • FMA演算器の数⇒3
  • コア数⇒8コア
1.6GHz × 32 × 2× 3 × 8コア = 2457 GFLOPS

コアもクロックもそれほど高くないのに理論演算性能が高いですね。

これがベクトルスーパーコンピュータの技術というわけですね。

 

ゲーム機:PS(PlayStation)4

GPUのコアはGCN (Graphics Core Next) 系アーキテクチャで、搭載する18個のCU (コンピュートユニット) はそれぞれ16レーンのSIMD演算ユニットを4個持つ。動作クロックは800MHzであり、計1,152個の積和算ユニットを持つことから単精度浮動小数点の演算性能は1.84TFLOPSとなる。- Wikipedia

おまけですが、ゲーム機(プレイステーション4)のFLOPS値もありました。

上から読み取ると以下のような式になりますね。

0.8GHz × 2 × 1152コア = 1843GFLOPS

 

実際に自分のパソコン(Windows)でLINPACKを測ってみた。

実際にどんなものか理論性能だけじゃなくて測ってみたいですよね!←

最近はLINPACKがwindowsパソコンでも測れるみたいので早速試してみました。

 

LINPACKとは

LINPACK ベンチマークは LINPACK に基づいたベンチマークプログラムで、システムの浮動小数点演算性能を評価する。ジャック・ドンガラが考案したもので、理学・工学で一般的な n×n の線型方程式系[3] Ax = b を解く速度を測定する。このベンチマークの最新版はTOP500で世界の高速なコンピュータの性能値としてランキングに使用されている[4]。-wikipedia

LINPACKは、世界ランキングにも使われているベンチマークプログラムです。

早速、マイPCの性能をベンチマークしてみましょう。

 

Intel LINPACK Benchmarkをダウンロード

まずはIntel LINPACK Benchmarkのダウンロードページに行きます。

すると、 License Agreementが表示されますので、読んで問題なければ「Accept」をクリックしましょう。

 

次に進むと、Intel Math Kernel Library(MKL) Benchmarksのダウンロードページに行きますのでwindows版をダウンロードしましょう。

 

Intel LINPACK Benchmarkを実行する

ダウンロードしたZIPファイルを回答すると、以下フォルダの中に「runme_xeon64.bat」というファイルがあるのでダブルクリックします。

\w_mklb_p_2018.2.010\w_mklb_p_2018.2.010\benchmarks_2018\windows\mkl\benchmarks\linpack

This is a SAMPLE run script for running a shared-memory version of
Intel(R) Distribution for LINPACK* Benchmark. Change it to refect
the correct number of CPUs/threads, problem input files, etc..
*Other names and brands may be claimed as the property of others.
2018/04/21
13:08
Running linpack_xeon64.exe. Output could be found in win_xeon64.txt.

すると、コマンドプロンプトが立ち上がってLINPACKが実行されます。

「Output could be found in win_xeon64.txt」ということで先程のフォルダを見るとテキストファイルができてました。

 

結果を見てみる。

少し長いですが、テキストファイルの中身を貼り付けます。

Sample data file lininput_xeon64.

Current date/time: Sat Apr 21 13:08:03 2018

CPU frequency:    3.810 GHz
Number of CPUs: 1
Number of cores: 4
Number of threads: 4

Parameters are set to:

Number of tests: 15

Number of equations to solve (problem size) : 1000  2000  5000  10000 15000 18000 20000 22000 25000 26000 27000 30000 35000 40000 45000
Leading dimension of array                  : 1000  2000  5008  10000 15000 18008 20016 22008 25000 26000 27000 30000 35000 40000 45000
Number of trials to run                     : 4     2     2     2     2     2     2     2     2     2     1     1     1     1     1    
Data alignment value (in Kbytes)            : 4     4     4     4     4     4     4     4     4     4     4     1     1     1     1    
Maximum memory requested that can be used=16200901024, at the size=45000

=================== Timing linear equation system solver ===================

Size   LDA    Align. Time(s)    GFlops   Residual     Residual(norm) Check
1000   1000   4      0.021      32.4567  1.029343e-12 3.510325e-02   pass
1000   1000   4      0.010      69.4419  1.029343e-12 3.510325e-02   pass
1000   1000   4      0.010      69.5091  1.029343e-12 3.510325e-02   pass
1000   1000   4      0.010      70.2038  1.029343e-12 3.510325e-02   pass
2000   2000   4      0.107      50.0789  4.298950e-12 3.739560e-02   pass
2000   2000   4      0.073      72.6778  4.298950e-12 3.739560e-02   pass
5000   5008   4      1.070      77.9594  2.581643e-11 3.599893e-02   pass
5000   5008   4      1.009      82.6635  2.581643e-11 3.599893e-02   pass
10000  10000  4      8.320      80.1505  9.603002e-11 3.386116e-02   pass
10000  10000  4      8.244      80.8936  9.603002e-11 3.386116e-02   pass
15000  15000  4      25.579     87.9789  2.042799e-10 3.217442e-02   pass
15000  15000  4      26.477     84.9964  2.042799e-10 3.217442e-02   pass
18000  18008  4      43.557     89.2769  2.894987e-10 3.170367e-02   pass

 

GFlopsとちゃんと出ていますね。

どうやら私のパソコン(Core i5 3570K)は80GFlopsくらいみたいです。

Sizeが大きいほうが性能が良くなるんですね。

 

3.810 GHzで4coreなので理論性能は121GFlopsですね。

65%くらいの性能が出ているといった感じでしょうか。

 

非常に簡単なので良かったら試してみてください。

 

まとめ:FLOPSの理論値計算は簡単。でも大事なのは実効性能

さてさて、色々なマシンを例にコンピュータの理論性能値の指標であるFLOPSを計算してみました。

 

カラクリさえ分かってしまえば、計算自体は簡単なものだったのではないでしょうか?

 

ただ、あくまで理論値は理論値です。

 

実際のアプリケーション・ソフトウェアを動かした時に、高速かどうかが重要です。

 

理論性能ばかりに気をとられていて、思ったより実効性能が出ないという場面に出くわすというのは結構アルアル話のようです。

 

理論性能はあくまで指標の一つとして有効に活用してみてください。

 

余談:2位じゃだめなんですか?

スパコン事業仕分けで蓮舫議員の「2位じゃだめなんですか?」という発言が問題になりましたね。

これはほんの一部のセリフを切り出しただけなんですけどね。

※事業仕分の時の全文リンクを張っておきますので興味のある方はどうぞ⇒行政刷新会議ワーキングチーム「事業仕分け」第3WG(pdf)

 

確かに言い方は良くなかったかも知れませんが、議員も知識のない国民もマスコミに踊らされて少しかわいそうだったように思います。

 

比較的単純で理論性能に近い値のでるLINPACKというアプリケーションで一位をとることが、日本の発展にどう繋がるのかがピンと来なかったから質問しただけではないでしょうかね。

 

例えば、

ある球団が世界最速のストレートを投げられる投手を100億円で一位指名で契約しました。

その投手は確かにストレートは世界最速ですが、変化球は投げられないし、コントロールも悪く、精神も不安定です。

もちろん、実際の試合では、パフォーマンスがあまり良くありませんでした。

これに対して「世界最速じゃないとダメなんですか?」と採用担当に質問するのと似たようなもんだと思うんですけどね。#まあ、少し違いますが。

 

さて、今日はここまで!

おわりっ!