Intel Arria10 SoC : 初期性能評価(結果解析編)- 浮動小数点配列の整数変換処理 の比較
はじめに
本記事は、Intel Arria 10 SoCで実施した初期性能評価のうち、
浮動小数点配列を整数(long)配列へ切り捨て変換する処理(truncate_float_vector_to_long)の結果を解析した内容です。
- この記事は演算カーネル単体の比較です。
- AD変換器の実機接続やFMC通信の実測はまだ行っていません。
- 最終的には、FMC接続と HPS 2 コアの役割分担構成を想定した理論検討に使うための一次評価です。
測定条件
- 対象関数:
truncate_float_vector_to_long - 演算数:
n = 100000 - ループ回数: シート上は
1000回(比較表の設定) - 比較対象:
- Intel Core i7-6700 @ 3.3GHz(msvc release)
- Intel Arria10 SoC Linux(Angstrom Linux:Intel Arria 10 に最適化されたYocto Linux)
- Intel Arria10 SoC ベアメタル
- コンパイル最適化:
- 比較対象:
O0/O1/O2/O3/ffast-math/Ofast - ここでは各オプションの詳細説明は省略し、結果差の比較に集中します。
- 比較対象:
比較対象CPUの詳細
| 区分 | CPU情報 | 実行条件 |
|---|---|---|
| Arria10 SoC Linux | ARM Dual Core Cortex-A9 @ 1.5GHz | Angstrom Linux 上で実行 |
| Arria10 SoC ベアメタル | ARM Dual Core Cortex-A9 @ 1.5GHz | OSなしで直接実行 |
| 参照PC | Intel Core i7-6700 @ 3.3GHz | msvc release ビルド |
Angstrom Linux について
本記事のAngstrom Linuxは、Arria10 SoC評価キットで使われるLinux系ディストリビューションの一つです。
Yocto系の構成で、評価・組み込み用途に合わせて最小構成で動かす前提のため、
同じCPUでもベアメタル実行と比較すると、OSオーバーヘッドの影響を受ける可能性があります。
肝になる処理(ループ本体)
今回比較しているのは、u の実数値を long へ切り捨て変換する単純な変換ループです。
ループ本体や計測の流れは実装編で説明しているため、本記事では結果の比較と解釈に絞ります。
表1: 実行時間比較(usec/回)
| 環境 | int | float | double |
|---|---|---|---|
| Core i7-msvc(release) | 11.00 | 41.00 | 53.50 |
| SOC Angstrom Linux-Ofast | 527.24 | 793.99 | 1104.20 |
| SOC Angstrom Linux-O3 | 531.45 | 789.43 | 1105.18 |
| SOC Angstrom Linux-O2 | 634.83 | 748.54 | 1311.84 |
| SOC ベアメタル-Ofast | 222.65 | 219.24 | 222.04 |
| SOC ベアメタル-O3 | 222.67 | 219.14 | 222.03 |
| SOC ベアメタル-O1 | 222.56 | 226.86 | 231.84 |
表1-補足: 環境ごとの最速最適化オプション
※ Linux/ベアメタルは、表2の int/float/double 3列の平均値が最小の設定を「最速」としています。測定値は表1(usec/回)を参照しています。
| 環境 | 最速最適化OP | int(usec/回) | float(usec/回) | double(usec/回) | 平均(usec/回) | 判定メモ |
|---|---|---|---|---|---|---|
| Core i7-msvc(release) | msvc release(固定) | 11.00 | 41.00 | 53.50 | 35.17 | 本比較では GCC 系 -O* 切替は未実施 |
| SOC Angstrom Linux | Ofast |
527.24 | 793.99 | 1104.20 | 808.48 | 3列平均(倍率): 約29.31(O3 の約29.41よりわずかに小さい) |
| SOC ベアメタル | O3 |
222.67 | 219.14 | 222.03 | 221.28 | 3列平均(倍率): 約9.91(Ofast の約9.91よりわずかに小さい) |
表2: Core i7基準の速度比(倍)
数値が大きいほど、Core i7より遅いことを示します。
| 環境 | int | float | double |
|---|---|---|---|
| SOC Angstrom Linux-O0 | 193.27 | 60.10 | 46.64 |
| SOC Angstrom Linux-O1 | 63.93 | 19.01 | 22.99 |
| SOC Angstrom Linux-O2 | 57.71 | 18.26 | 24.52 |
| SOC Angstrom Linux-O3 | 48.31 | 19.25 | 20.66 |
| SOC Angstrom Linux-ffast-math | 193.30 | 60.14 | 46.66 |
| SOC Angstrom Linux-Ofast | 47.93 | 19.37 | 20.64 |
| SOC ベアメタル-O0 | 148.54 | 39.97 | 30.65 |
| SOC ベアメタル-O1 | 20.23 | 5.53 | 4.33 |
| SOC ベアメタル-O2 | 20.24 | 5.53 | 4.34 |
| SOC ベアメタル-O3 | 20.24 | 5.34 | 4.15 |
| SOC ベアメタル-ffast-math | 148.56 | 39.97 | 30.65 |
| SOC ベアメタル-Ofast | 20.24 | 5.35 | 4.15 |
表3: 最適化効果(O0→最良値の改善率)
改善率は、以下で算出しています。
ここでいう改善率は、最適化なしの O0 を基準にして、最も速かった設定で何%短縮できたかを表しています。
- 値が大きいほど、最適化による短縮効果が大きいです。
- たとえば
80%なら、O0と比べて実行時間が約8割減った、という見方になります。 - 逆に
0%に近い場合は、最適化を変えてもほとんど改善していないことを意味します。
$$
改善率(%) = \frac{O0 - 最良値}{O0} \times 100
$$
| 環境 | int改善率 | float改善率 | double改善率 |
|---|---|---|---|
| SOC Angstrom Linux | 75.2%(2126.02→527.24) | 69.6%(2464.06→748.54) | 55.7%(2495.09→1104.20) |
| SOC ベアメタル | 86.4%(1633.96→222.56) | 86.6%(1638.76→219.14) | 86.5%(1639.75→222.03) |
結果の読み方
1. Linuxよりベアメタルが明確に有利
同じArria10 SoCでも、ベアメタルはLinux実行より短時間でした。
特にfloat/doubleでは差が大きく、今回の単体演算ではベアメタル優位です。
2. ffast-math単独より O3/Ofast の効果が大きい
ffast-math単独では、O0に近い値が残るケースがあります。
今回の結果では、全体として O3/Ofast の方が改善に効いています。
3. 演算カーネル単体の一次評価としては十分
本結果は「演算処理そのもの」の傾向を掴むには有効です。
一方で、FMC通信・DMA転送・バッファ運用を含むE2E性能は別途評価が必要です。
4. このベンチマークは客観的に妥当か
単純ベンチマークとしては、一定の妥当性があります。
- 処理内容が単純で、比較対象が明確です。
- 同じロジックを複数環境で回しているため、相対比較に向いています。
- 最適化オプション差による傾向も見やすいです。
ただし、これはあくまで単純な数値変換カーネルの指標です。
そのため、AD変換器の入力、FMC通信、DMA転送、割り込み、キャッシュ状態まで含んだ実運用性能を代表するものではありません。
したがって、今回の結論は「実機全体の性能保証」ではなく、演算部の初期成立性をみる一次評価として読むのが適切です。
最終目的(FMC + AD変換想定)に対する位置づけ
今回の評価は、次の問いへの一次回答になります。
- AD変換データが流入する前提で、Arria10の演算が追従できるか?
結論として、演算カーネル単体では、最適化済みベアメタル実行に実用可能性が見える、
という段階です。
この結果を構成案に引き寄せると、
HPS 側の 2 コアを役割分担し、CPU0 でベアメタル演算、CPU1 で Linux 側の管理や結果受け渡しを担う方向は十分に検討対象になります。
イメージとしては、
- FPGA 側から AD 変換結果を HPS 側へ渡す
- CPU0 側でベアメタル演算を実行する
- 必要最小限の結果だけを CPU1 側 Linux へ渡す
構成イメージを図にすると、次のようになります。
という流れです。
今回の比較結果は、この方向性に対して「演算は Linux よりベアメタル側へ寄せた方が良さそうだ」という根拠になります。
一方で、CPU0/CPU1 の同時運用そのものは別論点であり、共有メモリ、割り込み、起動手順、AMP 構成の詰めが必要です。
ただし最終判断には、次の追加測定が必要です。
- DMA転送込みのレイテンシ
- バースト長やバッファサイズの影響
- 連続入力時のジッタとドロップ率
追加で見たい項目の関係を図にすると、次のようになります。
注意点
-
clock()はCPU時間ベースであり、壁時計時間と一致しない場合があります。 - 実運用の性能判断では、タイマ手法を統一し、同一条件で再測定してください。
付録: 実装コードの参照先
コード全文は重複を避けるため、ベンチマーク実装編に集約しています。
補足: 参照PC(Windows環境)のビルド条件
Core i7-msvcの測定データは、次の環境で得られたものです。
| 項目 | 内容 |
|---|---|
| IDE | Microsoft Visual Studio Professional 2017 |
| バージョン | 15.9.2 |
| .NET Framework | 4.8.03752 |
| Visual C++ | 2017(00369-60000-00001-AA385) |
| コンパイル最適化 | msvc release(既定設定、最適化カスタマイズなし) |
特に重要な点として、参照PC側は最適化オプションをいじっていない状態で測定しています。
これは、/O2相当のMSVCデフォルトリリースビルド設定で、Linux/ベアメタル側のO3/Ofastとの比較可能性を考慮したものです。
そのため「Core i7の結果がより最適化できる可能性」を含んでいる点に注意してください。
逆に言えば、今回の Arria10 SoC ベアメタル側の性能改善余地も、同様に存在する可能性があります。
関連記事
- 前の記事
- 次の記事
- 【future】 実行基盤編: Linux運用性とベアメタル性能のトレードオフ整理