インテル® MIC アーキテクチャー向けの高度な最適化 - 精度を下げて最適化

同カテゴリーの次の記事

インテル® MIC アーキテクチャー向けの高度な最適化 - ヘテロジニアス・プログラミング・モデル

この記事は、インテル® ソフトウェア・サイトに掲載されている「Advanced Optimizations for Intel® MIC Architecture, Low Precision Optimizations」の日本語参考訳です。


はじめに

2012 年 5 月以前にリリースされた、インテル® Xeon Phi™ コプロセッサー (開発コード名: Knights Corner) 向け初期アルファ版および初期ベータ版 インテル® コンパイラーでは、デフォルトの最適化レベルにおいて、除算や平方根などの特定の処理で精度の低いコードシーケンスを生成していました。

このコンパイラーのデフォルトの動作は、ベータ版 インテル® Composer XE 2013 Update 1 (バージョン 13.0.039) で変更されました。製品版のインテル® コンパイラー (バージョン 13.0.039 以降) では、低い精度での演算を指示するオプションが明示的に指定されない限り、低い精度のシーケンスは生成されません。

トピック

インテル® コンパイラーは、除算や平方根などの特定の操作や組込み関数において、低い精度のコードシーケンスを生成することができます。どのような場合に低い精度が要求されるのでしょうか?
速度とパフォーマンスが重要なケース: 精度が高い演算よりも低いほうが実行速度は速くなります。また、2012 年 5 月以前にリリースされたインテル® コンパイラーを使用したテスト結果を確認することもあるでしょう。インテル® コンパイラーは、算術演算の精度を制御する強力なオプション群を提供します。

現行のコンパイラーには、次に示す -fimf* オプションがあります。”ulp (Unit in the Last Place)” は最下位桁単位の略語です (バイナリーの場合、4 ulp は仮数の最下位 2 ビットを表します)。このオプションの一般的な構文は、次のとおりです。

-fimf-domain-exclusion=<n1> -fimf-accuracy-bits=<n2> -fimf-precision=low -fimf-max-error=<n3_ulps>

次のような組み合わせが考えられます。

a) -fimf-precision=low -fimf-domain-exclusion=15 (単精度/倍精度の両方で利用可能な最も低い精度)

b) -fimf-domain-exclusion=15 -fimf-accuracy-bits=22 (倍精度でデフォルトよりも低い精度)

c) -fimf-domain-exclusion=15 -fimf-accuracy-bits=11 (倍精度ではより低い精度、単精度ではデフォルトよりも低い精度)

d) -fimf-precision=low

e) -fimf-max-error=2048 -fimf-domain-exclusion=15 (デフォルトの max-error=4 ulps よりも低く、(d) よりも高い精度)

f) -fp-model fast=2 (コンパイラーのデフォルトは -fp-model fast=1。fast=2 は、これに -fimf-domain-exclusion=15 オプションを追加するのと同じ)

g) -fp-model-precise –no-prec-div –no-prec-sqrt –fast-transcendentals –fimf-precision=high (libsvml の除算、平方根、超越関数のベクトル化された精度の高いバージョン)

これらのオプションは、ベクトルコードとスカラーコードの両方に影響します。

オプションの完全なリストと詳細は、コンパイラーとともにインストールされる、『インテル® コンパイラー・ユーザー・リファレンス・ガイド』の「浮動小数点オプション」を参照してください。以下に、一部抜粋したものを示します。

『インテル® コンパイラー・ユーザー・リファレンス・ガイド』 からの抜粋:

-fimf-domain-exclusion

ドメイン排他属性は、コマンドライン・オプションで指定される classList から派生する ‘ビットベクトル’ です。一般に、一意の classList 要素はそれぞれ 2 の累乗に対応します。排他属性は、関連付けられた 2 の累乗の OR (論理和) になります。次の表に、classList 簡略名から数値への現在のマッピングを示します。

ドメインから除外する値のクラス

計算される対応する整数値

極値

1

NaN

2

無限大

4

デノーマル値

8

ゼロ

16

なし

0

すべて

31

共通値

15

その他の組み合わせ

使用される値のビット単位の OR (論理和)

適切なビットを設定することで、これらの条件を除外することができます。コンパイラーにより生成/参照されるコードは、除外されたクラスの値を IEEE 標準で規定されている方法で処理する必要がありません。アプリケーションが除外された値を生成し、正しく処理しない場合、異常結果を生成したり、アプリケーションが異常終了する可能性があるため、注意が必要です。ただし、アプリケーションの動作に問題がない場合、除外された値をチェックし、処理する必要がなくなるため、コード生成が簡略化されます。


fimf-accuracy-bits

算術ライブラリー関数の相対誤差を定義します。

IDE オプション:

なし

アーキテクチャー:

すべて

構文:

-fimf-accuracy-bits=bits[:funclist]

引数の意味:

bits

コンパイラーで使用する正しいビット数を示す正の浮動小数点数です。

funclist

属性が適用される 1 つまたは複数の算術ライブラリー関数のリストです (オプション)。複数の関数を指定する場合は、カンマで区切ります。

デフォルト:

オフ

コンパイラーは、算術ライブラリー関数を呼び出すときにデフォルトのヒューリスティックを使用します。

説明:

このオプションは、算術ライブラリー関数の結果において、正しいビット数により測定される相対誤差を定義します。

次の数式は、ビットを ulps に変換するのに使用されます: ulps = 2p-1-bits
p はターゲット形式の仮数ビットの数 (24、53、64。順に、単精度、倍精度、長倍精度) です。

このオプションで実行時のパフォーマンスを改善できますが、結果の精度が低下する可能性があります。

-fimf-precision オプションや -fimf-max-error オプション、あるいは -fimf-accuracy-bits オプション が指定されると、max-error のデフォルト値はそのオプションによって決定されます。これらのいずれか、または複数のオプションが指定された場合、max-error のデフォルト値はコマンドラインの最後に指定されたオプションにより決定されます。

これらのオプションのいずれも指定されない場合は、max-error のデフォルト値は、-[no-]fast-transcendentals で指定された設定により決定されます。これらのオプションも指定されない場合は、デフォルト値は -fp-model により決定されます。


fimf-precision

算術ライブラリー関数の精度を定義します。

IDE オプション:

なし

アーキテクチャー:

すべて

構文:

-fimf-precision[=value[:funclist]]

引数の意味:

value

精度を示す次のいずれかの値を指定できます。

high

max-error = 0.6 と同じです。

medium

max-error = 4 と同じです。オプションが設定され、value が省略された場合、デフォルトの設定です。

low

値が単精度の場合は accuracy-bits = 11、値が倍精度の場合は accuracy-bits = 26 と同じです。

max-error は -fimf-max-error、accuracy-bits は -fimf-accuracy-bits を意味します。

funclist

属性が適用される 1 つまたは複数の算術ライブラリー関数のリストです (オプション)。複数の関数を指定する場合は、カンマで区切ります。

デフォルト:

オフ

コンパイラーは、算術ライブラリー関数を呼び出すときにデフォルトのヒューリスティックを使用します。

説明:

このオプションは、算術ライブラリー関数の精度を定義します。

このオプションは、アプリケーションに十分な精度に値を低くした場合に、ランタイム・パフォーマンスの向上に使用できます。あるいは、算術ライブラリー関数の精度を向上するのに使用できます。

一般に、精度が低いとランタイム・パフォーマンスが向上し、精度が高いとランタイム・パフォーマンスが低下します。

-fimf-precision オプション、-fimf-max-error オプション、あるいは -fimf-accuracy-bits オプション が指定されると、max-error のデフォルト値はそのオプションによって決定されます。これらのいずれか、または複数のオプションが指定された場合、max-error のデフォルト値はコマンドラインの最後に指定されたオプションにより決定されます。

これらのオプションのいずれも指定されない場合は、max-error のデフォルト値は、-[no-]fast-transcendentals で指定された設定により決定されます。これらのオプションも指定されない場合は、デフォルト値は -fp-model により決定されます。

まとめ

インテル® コンパイラーでは、ユーザーが算術組込み関数の精度を選択できます。そのため、ユーザーはパフォーマンス、精度、再現性のバランスをとることができます。ここでは、-fimf オプションについて説明しました。

  • -fimf-precision は、算術ライブラリー関数の精度を定義します。

  • -fimf-accuracy-bits は、算術ライブラリー関数の相対誤差を定義します。

  • -fimf-domain-exclusion は、ビットマスクを設定して特定のクラスの値の例外処理を除外します。指定されたクラスの値の例外条件をチェックせずに済むため、算術関数を速く実行することができます。

より広範囲な精度の制御については、-fp-model コンパイラー・オプションを参照してください。このトピックについてより詳しく説明したホワイトペーパー「Consistency of Floating-Point Results using the Intel Compiler」もぜひお読みください。

次のステップ

この記事は、「Programming and Compiling for Intel® Many Integrated Core Architecture」(英語) の一部「Low Precision Optimizations」の翻訳です。インテル® Xeon Phi™ コプロセッサー上にアプリケーションを移植し、チューニングを行うには、本ガイドの各リンクのトピックを参照してください。アプリケーションのパフォーマンスを最大限に引き出すために必要なステップを紹介しています。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事