インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) には、アプリケーションからライブラリー関数を呼び出したときに浮動小数点の演算結果で条件付き数値再現性 (CNR) が得られるようにする関数と環境変数が用意されています。これらの新しいコントロールを使用すると、次の条件の下で関数がビット単位で数値再現性のある浮動小数点結果を返す場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を特別なモードで実行することができます。
一部のルーチンでは、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を厳密な CNR モード (英語) で使用することで 2 つ目の条件を排除できます。
一般的な単精度および倍精度 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
新しい機能は、この演算の順序によって結果が一貫しない問題に対応しています。
単一実行ファイル内の浮動小数点演算の順序に影響するアプリケーション関連の要因には、ランライム・プロセッサー・ディスパッチに基づくコードパスの選択、データ配列のアライメント、スレッド数における変化、マルチスレッド・アルゴリズム、内部浮動小数点の制御設定が含まれます。スレッド数と浮動小数点の設定を制御し、メモリーを割り当てるときにアライメントすることで、ほとんどの要因を制御することができます。ただし、ランタイム・ディスパッチと特定のマルチスレッド・アルゴリズムでは、ユーザーが実行ごとに演算の順序が同じになるように変更することはできません。
インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) は、アプリケーションに呼び出されたインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数で通過する適切な内部コードパスを特定するため、ランタイム・プロセッサー・ディスパッチを行います。選択されるコードパスは、インテル® プロセッサーおよび互換プロセッサーの種類によって異なり、さまざまなレベルのパフォーマンスが提供されます。例えば、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数をインテル® Pentium® 4 プロセッサーで実行した場合に選択されるコードパスと、最新のインテル® Xeon® プロセッサーで実行した場合に選択されるコードパスは異なります。この違いは、各コードパスが実行しているプロセッサーで利用可能な機能を活用するように最適化されているためです。プロセッサーの新しい機能をプログラマーが区別する主要な方法として、命令セット・アーキテクチャー (ISA) によるものがあります。インテル® oneAPI マス・カーネル・ライブラリー(インテル®oneMKL) のコード分岐は、最適化に使用する ISA によって、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) からインテル®アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2) までのいずれかで指定されます。機能ベースのアプローチには課題もあります。内部浮動小数点演算が異なる順序で行われたり、関連付けが変更されると、計算結果は異なります。
コードを実行しているプロセッサーの機能に基づいて最適化されたコードパスをディスパッチすることが、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) で使用される最適化アプローチのメインです。一貫した結果を得るには、パフォーマンスの低下は避けられません。特定のコードパスに制限される場合、状況によってはインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のパフォーマンスが大幅に低下することがあります。例えば、インテル® AVX2 命令をサポートする新しいプロセッサーでは、行列乗算のパフォーマンスがほぼ 2 倍になることに注意してください。コード分岐が制限されない場合でも、新しい機能では演算の順序を維持するためアルゴリズムが制限されることで、パフォーマンスは 10-20% 低下します。
oneMKL 2024.1 では、レベル 3 BLAS ルーチン (gemm や trsm など) とこれらのルーチンのバッチバージョンなど、特定の GPU 計算に対する CNR サポートが導入されています。いずれかの CNR コード分岐が有効になっている場合、GPU CNR サポートが自動的に有効になり、インテル® GPU 上のこれらのルーチンの実行ごとにビット単位で再現可能な結果が保証されます。選択された特定のコード分岐 (AVX2、AVX-512 など) は、GPU 実行では無視されます。
GPU CNR モードを有効にすると、oneMKL は、同じ GPU で同じ計算を複数回実行する際に、決定論的ビット単位での同一結果が得られることを保証します。2 つの GPU は同じ製品名 (例: インテル® Arc™ A770) を持つ場合、同一であるとみなされます。結果はデバイス間で異なる場合があることに注意してください (CPU と GPU 間、または異なる種類の GPU 間)。
製品および性能に関する情報 |
|---|
性能は、使用状況、構成、およびその他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex (英語) をご覧ください。 改訂 #20201201 |