インテル® 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
と
2-63 + (1 + (-1)) ≃ 2-63 + 0 = 2-63
演算順序による結果の不一致は、まさにこの新しい機能が解決する問題です。
単一の実行プログラム内の浮動小数点演算の順序に影響を与えるアプリケーションに関連する要因には、実行時のプロセッサー・ディスパッチに基づくコードパスの選択、データ配列の配置、スレッド数の変化、スレッド・アルゴリズム、および内部浮動小数点制御の設定などがあります。スレッド数と浮動小数点の設定を制御し、メモリーを割り当てるときにアライメントすることで、ほとんどの要因を制御することができます。ただし、実行時のディスパッチと特定のスレッド・アルゴリズムには、実行ごとに同じ操作順序を保証するような変更をユーザーが行うことはできません。
インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) は、アプリケーションに呼び出されたインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数で通過する適切な内部コードパスを特定するため、ランタイム・プロセッサー・ディスパッチを行います。選択されるコードパスは、さまざまなインテル® プロセッサーおよびインテル® アーキテクチャー互換プロセッサー間で異なる場合があり、パフォーマンス・レベルも異なることがあります。例えば、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数をインテル® Pentium® 4 プロセッサーで実行した場合に選択されるコードパスと、最新のインテル® Xeon® プロセッサーで実行した場合に選択されるコードパスは異なります。これは、それぞれの固有のコードパスが、ベースとなるプロセッサーで利用可能な機能に合わせて最適化されていることで発生します。プロセッサーの新しい機能をプログラマーに認識させる方法の 1 つとして、命令セット アーキテクチャー (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 |