インテル® マス・カーネル・ライブラリー (インテル® MKL) のルーチンを同じシステムで複数回実行した場合、異なる結果が得られることがあります。 通常は、浮動小数点演算が実行される順序の変更が原因です。最も影響がある 2 つの要因は、配列のアライメントと並列処理です。配列のアライメントによって、内部ループが浮動小数点演算を行う順序が決まります。非決定性の並列処理では、計算タスクが実行される順序が変更されることがあります。結果が異なる場合でも、計算誤差の範囲内に収まる必要があります。実行ごとに同一の結果が得られるようにするには、以下の操作を行います。
入力配列を 16 バイト境界でアライメントするには、以下のコード例で示されているように、システムが提供するメモリー・アロケーターの代わりに mkl_malloc() を使用します。 インテル® MKL を逐次モードで実行すると、非決定性の並列処理は行われません。
// ******* C 言語 ******* ... #include <stdlib.h> ... void *darray; int workspace; ... // 16 ビット境界でアライメントされたワークスペースを割り当てる darray = mkl_malloc( sizeof(double)*workspace, 16 ); ... // MKL を使用してプログラムを呼び出す mkl_app( darray ); ... // ワークスペースを解放する mkl_free( darray );
! ******* Fortran 言語 ******* ... double precision darray pointer (p_wrk,darray(1)) integer workspace ... ! 16 ビット境界でアライメントされたワークスペースを割り当てる p_wrk = mkl_malloc( 8*workspace, 16 ) ... ! MKL を使用してプログラムを呼び出す call mkl_app( darray ) ... ! ワークスペースを解放する call mkl_free(p_wrk)
© 2007 - 2010 Intel Corporation. 無断での引用、転載を禁じます。