インテル® MKL 11.3 ユーザーズガイド

数値再現性のある結果を得る

インテル® MKL には、アプリケーションからライブラリー関数を呼び出したときに浮動小数点の演算結果で条件付き数値再現性 (CNR) が得られるように支援する関数と環境変数が用意されています。これらの新しいコントロールを使用すると、次の条件の下で関数がビット単位で数値再現性のある浮動小数点結果を返す場合、インテル® MKL を特別なモードで実行することができます。

一般的な単精度および倍精度 IEEE 浮動小数点数では、結合則が常に満たされるとは限らない、つまり (a+b)+c = a +(b+c) が成り立たない場合があることは有名です。特定の例について考えてみます。無限の精度では、数学的には 2-63 + 1 + -1 = 2-63 となります。この同じ計算を倍精度浮動小数点数を使用するコンピューターで実行する場合、丸め誤差が発生するため、演算の順序が重要になります。

(2-63 + 1) + (-1) 1 + (-1) = 0

vs

2-63 + (1 + (-1)) 2-63 + 0 = 2-63

新しい機能は、この演算の順序によって結果が一貫しない問題に対応しています。

単一実行ファイル内の浮動小数点演算の順序に影響するアプリケーション関連の要因には、ランライム・プロセッサー・ディスパッチに基づくコードパスの選択、データ配列のアライメント、スレッド数における変化、マルチスレッド・アルゴリズム、内部浮動小数点の制御設定が含まれます。スレッド数と浮動小数点の設定を制御し、メモリーを割り当てるときにアライメントすることで、ほとんどの要因を制御することができます (詳細は、ナレッジベースの記事『インテル® MKL を使用して一貫した演算結果を得る』 (英語) を参照してください)。 ただし、ランタイム・ディスパッチと特定のマルチスレッド・アルゴリズムでは、ユーザーが実行ごとに演算の順序が同じになるように変更することはできません。

インテル® MKL は、アプリケーションに呼び出されたインテル® MKL 関数で走査する適切な内部コードパスを特定するために、ランタイム・プロセッサー・ディスパッチを行います。選択されるコードパスは、インテル® プロセッサーおよび互換プロセッサーの種類によって異なり、さまざまなレベルのパフォーマンスが提供されます。例えば、インテル® MKL 関数をインテル® Pentium® 4 プロセッサーで実行した場合に選択されるコードパスと、最新のインテル® Xeon® プロセッサーで実行した場合に選択されるコードパスは異なります。この違いは、各コードパスが実行しているプロセッサーで利用可能な機能を活用するように最適化されているためです。プロセッサーの新しい機能をプログラマーが区別する主要な方法として、命令セット・アーキテクチャー (ISA) によるものがあります。インテル® MKL のコード分岐は、最適化に使用する ISA によって、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) からインテル®アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2) までのいずれかで指定されます。 機能ベースのアプローチには課題もあります。内部浮動小数点演算が異なる順序で行われたり、関連付けが変更されると、計算結果は異なります。

コードを実行しているプロセッサーの機能に基づいて最適化されたコードパスをディスパッチすることが、インテル® MKL で使用される最適化アプローチのメインです。一貫した結果を得るには、パフォーマンスの低下は避けられません。特定のコードパスに制限される場合、状況によってはインテル® MKL のパフォーマンスが大幅に低下することがあります。例えば、インテル® AVX2 命令をサポートする新しいプロセッサーでは、行列乗算のパフォーマンスがほぼ 2 倍になることに注意してください。コード分岐が制限されない場合でも、新しい機能では演算の順序を維持するためにアルゴリズムが制限されるため、パフォーマンスは 10-20% 低下します。

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804