
WhetStoneテストは、実行される計算の性質がCoreMarkの利点と異なります。条件付き遷移テストを除く、それに含まれるすべてのテストは、ある程度の内部並列性を持っています。 テストは2つのバージョンで実行されました。 最初の-Multiclet R1-LLVMコンパイラの現在のバージョンは、次のオプションでコンパイルされました:
-ffast-math -fno-builtin -O3
2番目のオプションである-Multiclet R1 *、-テストは、現在コンパイラーに追加されている「最適化された」手動の高度な最適化の導入により実行されました。 手動の改良は、ループの複数の反復を組み合わせることにより、コンパイラーが線形セクションを増やすのに役立つように削減されました。
結果
システム | MHz | MWIPS / MHz | MFLOPS1 / MHz | MFLOPS2 / MHz | MFLOPS3 / MHz | COS MOPS / MHz | EXP MOPS / MHz | FIXPT MOPS / MHz | IF MOPS / MHz | EQUAL MOPS / MHz |
---|---|---|---|---|---|---|---|---|---|---|
マルチクレットR1 * | 100 | 0.721 | 0.256 | 0.212 | 0.162 | 0.018 | 0.008 | 3.569 | 0.417 | 1.57 |
RPi 2 v7-A7 | 1000 | 0.585 | 0.28 | 0.291 | 0.248 | 0.011 | 0.006 | 1.314 | 1.209 | 0.981 |
RPi 3 v8-A53 | 1200 | 0.604 | 0.276 | 0.29 | 0.248 | 0.01 | 0.007 | 1.267 | 1.561 | 1.014 |
ARM v8-A53 | 1300 | 0.642 | 0.268 | 0.241 | 0.239 | 0.028 | 0.004 | 1.197 | 1.436 | 0.439 |
Core i7 4820K | 3900 | 0.887 | 0.341 | 0.308 | 0.167 | 0.023 | 0.014 | 0.998 | 1.504 | 0.251 |
コアi7 1 CP | 3066 | 0.873 | 0.325 | 0.295 | 0.174 | 0.025 | 0.013 | 0.892 | 0.958 | 0.167 |
天才II | 3000 | 0.799 | 0.307 | 0.27 | 0.111 | 0.026 | 0.016 | 0.835 | 1.001 | 0.167 |
アスロン64 | 2211 | 0.785 | 0.308 | 0.272 | 0.104 | 0.026 | 0.016 | 0.832 | 0.999 | 0.187 |
チュリオン64 M | 1900 | 0.884 | 0.302 | 0.258 | 0.145 | 0.026 | 0.016 | 0.827 | 0.988 | 0.187 |
コアi5 2467M | 2300 | 0.853 | 0.296 | 0.298 | 0.163 | 0.022 | 0.013 | 0.807 | 0.993 | 0.222 |
コア2デュオ1 CP | 2400 | 0.885 | 0.337 | 0.307 | 0.198 | 0.024 | 0.012 | 0.804 | 0.81 | 0.176 |
セレロンC2 M | 2000年 | 0.868 | 0.297 | 0.296 | 0.194 | 0.023 | 0.012 | 0.778 | 0.781 | 0.172 |
コア2デュオm | 1830 | 0.878 | 0.337 | 0.305 | 0.197 | 0.024 | 0.012 | 0.751 | 0.785 | 0.174 |
マルチクレットr1 | 100 | 0.311 | 0.157 | 0.153 | 0.029 | 0.018 | 0.008 | 0.714 | 0.081 | 0.143 |
セレロンm | 1295 | 0.832 | 0.324 | 0.297 | 0.178 | 0.022 | 0.012 | 0.631 | 0.923 | 0.173 |
ラズベリーパイ | 1000 | 0.391 | 0.137 | 0.146 | 0.123 | 0.009 | 0.004 | 0.617 | 1.014 | 0.805 |
アスロンXP | 2088 | 0.856 | 0.307 | 0.274 | 0.139 | 0.026 | 0.016 | 0.576 | 0.998 | 0.166 |
Pentium Pro | 200 | 0.79 | 0.332 | 0.278 | 0.146 | 0.023 | 0.013 | 0.575 | 0.755 | 0.149 |
アスロン4バートン | 1800 | 0.846 | 0.305 | 0.272 | 0.137 | 0.026 | 0.016 | 0.571 | 0.988 | 0.165 |
セレロンa | 450 | 0.76 | 0.291 | 0.276 | 0.14 | 0.022 | 0.012 | 0.569 | 0.751 | 0.147 |
ペンティアム4E | 3000 | 0.39 | 0.182 | 0.164 | 0.058 | 0.014 | 0.006 | 0.323 | 0.27 | 0.126 |
アトムm | 1600 | 0.348 | 0.176 | 0.157 | 0.051 | 0.01 | 0.007 | 0.252 | 0.744 | 0.11 |
ペンティアム4 | 1900 | 0.383 | 0.214 | 0.188 | 0.056 | 0.012 | 0.006 | 0.241 | 0.427 | 0.118 |
Pentium MMX | 200 | 0.615 | 0.328 | 0.267 | 0.079 | 0.025 | 0.013 | 0.198 | 0.73 | 0.186 |
ペンティアム | 100 | 0.604 | 0.322 | 0.267 | 0.078 | 0.025 | 0.013 | 0.192 | 0.568 | 0.183 |
80486DX2 | 66 | 0.182 | 0.076 | 0.068 | 0.026 | 0.008 | 0.005 | 0.105 | 0.212 | 0.017 |
*有望なLLVMコンパイラ最適化を使用するオプション |
マルチレットは、CoreMark / MHzよりもMWIPS / MHzではるかに自信があるように見えることがわかります(この記事で以前に公開された図)。 次のことがわかります。
- 線形セクションの長さを増やす最適化を使用すると、MWIPS / MHz全体が約1.5倍になります。
- このような最適化は、以前は問題に隠されていた内部並列処理のリリースにより、マルチセルラープロセッサの適用範囲を大幅に拡大します。
WhetStoneに含まれるテストは、4つのグループに分けることができます。 最初のグループには、浮動小数点計算のパフォーマンスのテストが含まれます。 これらのテストの結果により、 MFLOPS1 、 MFLOPS2 、 MFLOPS3のパフォーマンスが決まります。 LLVMコンパイラの追加の最適化を使用すると、3つのテストすべてで大幅に高速化されることがわかります。
MFLOPS1インジケーターの例によって得られた加速度の性質を考慮し、例として浮動小数点演算の最初のテストを使用して、この結果がどのように達成されるかを調べます。 Cテストコード:
timea = dtime(); { for (ix=0; ix<xtra; ix++) { for(i=0; i<n1*n1mult; i+=5) { e1[0] = (e1[0] + e1[1] + e1[2] - e1[3]) * t; e1[1] = (e1[0] + e1[1] - e1[2] + e1[3]) * t; e1[2] = (e1[0] - e1[1] + e1[2] + e1[3]) * t; e1[3] = (-e1[0] + e1[1] + e1[2] + e1[3]) * t; } t = 1.0 - t; } t = t0; } timeb = dtime();
既存のバージョンのLLVMを使用してテストをコンパイルすると、内部ループの本体に対して次のアセンブリコードが取得されます。
jmp LBB2_4 SR4 := rdq #IR7, 2160 SR5 := rdq #IR7, 2152 SR6 := rdq #IR7, 2144 SR7 := rdq #IR7, 2136 SR8 := rdq #IR7, 2128 SR9 := rdq #IR7, 2120 SR10:= subf @SR6, @SR5 SR11:= subf @SR5, @SR6 SR12:= addf @SR5, @SR6 SR5 := addf @SR10, @SR4 SR10:= addf @SR11, @SR4 SR4 := addf @SR10, @SR7 SR7 := mulf @SR4, @SR8 SR10:= addf @SR5, @SR7 SR5 := subf @SR4, @SR10 SR11:= subf @SR10, @SR4 SR4 := mulf @SR10, @SR8 SR10:= mulf @SR5, @SR8 SR5 := addf @SR12, @SR10 SR10:= addf @SR11, @SR5 SR11:= mulf @SR5, @SR8 SR5 := mulf @SR10, @SR8 SR10:= addf @SR5, @SR6 SR5 := mulf @SR10, @SR8 wrq @SR9, #IR7, 2760 wrq @SR5, #IR7, 2752 wrq @SR11, #IR7, 2744 wrq @SR4, #IR7, 2736 wrq @SR7, #IR7, 2728
このセクションの命令の多くは、並行して実行できることがわかります。 ただし、複数の反復を1つに組み合わせると、メモリなしでセルラー媒体内で実行されるコード部分を大幅に拡張でき、反復間の中間結果を保存する時間も節約できます。
反復を結合する手順の後、ループの本体は次の形式になります
jmp LBB2_4 SR4 := rdq #IR7, 272 SR5 := rdq #IR7, 264 SR6 := rdq #IR7, 256 SR7 := rdq #IR7, 248 SR8 := rdq #IR7, 320 SR9 := rdq #IR7, 240 SR10 := rdq #IR7, 232 SR11 := addf @SR4, @SR5 SR5 := addf @SR7, @SR6 SR12 := addf @SR11, @SR6 SR13 := subf @SR12, @SR7 SR12 := mulf @SR13, @SR8 SR14 := addf @SR12, @SR4 SR4 := addf @SR14, @SR11 SR11 := subf @SR14, @SR6 SR6 := addf @SR11, @SR7 SR11 := subf @SR13, @SR6 SR12 := subf @SR6, @SR13 SR13 := mulf @SR11, @SR8 SR11 := addf @SR5, @SR13 SR5 := addf @SR12, @SR11 SR12 := addf @SR11, @SR4 SR13 := mulf @SR5, @SR8 SR5 := mulf @SR12, @SR8 SR12 := addf @SR13, @SR7 SR7 := mulf @SR12, 0x3f000000 SR12 := subf @SR5, @SR7 SR5 := addf @SR12, @SR6 SR6 := addf @SR12, @SR11 SR13 := subf @SR5, @SR11 SR11 := addf @SR5, @SR4 SR4 := mulf @SR13, @SR8 SR5 := mulf @SR11, @SR9 SR11 := addf @SR4, @SR7 SR4 := subf @SR11, @SR12 SR12 := subf @SR6, @SR11 SR6 := mulf @SR12, @SR8 SR11 := subf @SR13, @SR12 SR12 := addf @SR6, @SR7 SR6 := mulf @SR8, @SR11 SR11 := addf @SR4, @SR12 SR4 := mulf @SR12, @SR8 SR13 := mulf @SR11, @SR8 SR11 := addf @SR4, @SR5 SR4 := addf @SR13, @SR7 SR5 := mulf @SR4, 0x3f000000 SR4 := subf @SR11, @SR5 SR7 := addf @SR4, @SR12 SR12 := addf @SR6, @SR4 SR6 := mulf @SR12, @SR8 SR12 := addf @SR6, @SR5 SR13 := addf @SR6, @SR11 SR6 := subf @SR12, @SR4 SR4 := subf @SR7, @SR12 SR7 := mulf @SR4, @SR8 SR4 := addf @SR7, @SR5 SR7 := addf @SR6, @SR4 SR6 := addf @SR4, @SR13 SR11 := mulf @SR7, @SR8 SR7 := mulf @SR6, @SR8 SR6 := addf @SR11, @SR5 SR5 := mulf @SR6, 0x3f000000 SR6 := subf @SR7, @SR5 SR7 := addf @SR6, @SR12 SR11 := addf @SR6, @SR4 SR12 := subf @SR7, @SR4 SR4 := addf @SR7, @SR13 SR8 := moveq @SR8 SR9 := moveq @SR9 SR10 := moveq @SR10 SR7 := mulf @SR12, @SR8 SR13 := mulf @SR4, @SR9 SR4 := addf @SR7, @SR5 SR7 := subf @SR4, @SR6 SR6 := subf @SR11, @SR4 SR4 := mulf @SR6, @SR8 SR9 := subf @SR12, @SR6 SR6 := addf @SR4, @SR5 SR4 := mulf @SR8, @SR9 SR9 := addf @SR7, @SR6 SR7 := mulf @SR6, @SR8 SR11 := mulf @SR9, @SR8 SR9 := addf @SR7, @SR13 SR7 := addf @SR11, @SR5 SR5 := mulf @SR7, 0x3f000000 SR7 := subf @SR9, @SR5 SR11 := addf @SR7, @SR6 SR6 := addf @SR4, @SR7 SR4 := mulf @SR6, @SR8 SR12 := addf @SR4, @SR5 SR13 := addf @SR4, @SR9 SR4 := subf @SR12, @SR7 SR7 := subf @SR11, @SR12 SR9 := mulf @SR7, @SR8 SR11 := subf @SR6, @SR7 SR6 := addf @SR9, @SR5 SR7 := mulf @SR8, @SR11 SR9 := addf @SR4, @SR6 SR4 := addf @SR13, @SR6 SR11 := mulf @SR9, @SR8 SR9 := mulf @SR4, @SR8 SR4 := addf @SR11, @SR5 SR5 := mulf @SR4, 0x3f000000 SR4 := subf @SR9, @SR5 SR9 := addf @SR7, @SR4 SR7 := addf @SR4, @SR6 SR6 := mulf @SR4, @SR8 SR11 := mulf @SR9, @SR8 SR9 := addf @SR11, @SR5 SR11 := subf @SR7, @SR9 SR7 := subf @SR9, @SR4 SR4 := mulf @SR9, @SR8 SR9 := mulf @SR11, @SR8 SR11 := addf @SR9, @SR5 SR9 := addf @SR7, @SR11 SR7 := mulf @SR11, @SR8 SR11 := mulf @SR9, @SR8 SR8 := addf @SR11, @SR5 SR5 := mulf @SR8, 0x3f000000 wrq @SR10, #IR7, 384 wrq @SR6, #IR7, 376 wrq @SR4, #IR7, 368 wrq @SR7, #IR7, 360 wrq @SR5, #IR7, 352
テストの2番目のグループは、基本的な数学関数の速度を評価し、 COS MOPSおよびEQUAL MOPSによって特徴付けられます。 主な負荷は数学ライブラリにかかるため、コンパイラの最適化はこれらのテストのパフォーマンスに大きな影響を与えません。 これらのテストの結果に大きなマイナスの影響を与えたのは、使用した数学ライブラリが古いP1プロセッサ用に作成されており、新しいR1プロセッサの多くの利点を使用していなかったためです。
テストの3番目のグループは、整数演算パフォーマンステスト( FIXPT MOPS指数 )とアレイパフォーマンステスト( EQUAL MOPS指数)を組み合わせることができます。 このグループのテストは、最初のグループの生産性を向上させるすべてのプロセスの影響を受けます。さらに、ループの反復を組み合わせて得られる線形セクションの増加は、標準のLLVMコンパイラ最適化ツールを使用して最適化できます。 これらの最適化により、必要な中間計算の数が大幅に削減され、R1の最終テストスコアが対応するIntelおよびARMスコアよりも1.5〜2倍高いという事実につながります。
最後のグループには、IF MOPSメトリックを使用した条件分岐パフォーマンステストが含まれます。 このテストのパフォーマンスが低いのは、テストの順序が厳密であり、その結果、必要な量の並列性が不足しているためです。
したがって、プロセッサの現在のリビジョンは、十分な長さの線形セクションと内部に十分な数の相互依存命令を備えており、ARMおよびIntelコアの現在のバージョンに匹敵する実行速度を提供します。 インジケーターMFLOPS1 、 MFLOPS2 、 MFLOPS3で良好な結果が達成されています。 FIXPT MOPSおよびEQUAL MOPSの優れた結果は、 マルチセルラーアーキテクチャの機能だけでなく、増加した線形セクションで実行されるアルゴリズムのコンパイラー最適化の結果とも関連しています。 COS MOPSおよびEXP MOPSは 、数学ライブラリの最適化への十分な注意によって決定される指標ではないため、今後改善される予定です。
コンパイラ自体に関しては、 前回の記事の執筆以来、マルチセルラーアーキテクチャの機能が大幅に拡張されています。
- 64ビット整数演算のサポートが追加されました。
- デバッグ情報を生成する機能が追加されました。
- ターゲットが追加されました(-targetオプション)。これにより、単精度のリアルタイム演算のみを使用してアセンブラーコードが生成されます(double、long double型は、float型のように32ビットのサイズです)。
- 32ビットの書き込み命令のみの使用を保証するコンパイラオプションが追加されました(32ビット値のみを書き込むことができるR1プロセッサの外部メモリの実装の特性により、この必要性が生じました)。
- ライブラリ関数memset()、memcpy()、memmov()は最適に実装されています。
- ベクトル命令のコンパイラーサポートの可能性について研究が行われましたが、R1プロセッサー自体でサポートされているベクトル命令のセットが限られているため、その結果はこの機能を実装する必要性を明らかにしませんでした。
一般に、LLVMコンパイラはバージョン3.8.1に更新されています。