一貫した結果を得るためのデータのアライメント

インテル® マス・カーネル・ライブラリー (インテル® MKL) のルーチンを同じシステムで複数回実行した場合、異なる結果が得られることがあります。 通常は、浮動小数点演算が実行される順序の変更が原因です。最も影響がある 2 つの要因は、配列のアライメントと並列処理です。配列のアライメントによって、内部ループが浮動小数点演算を行う順序が決まります。非決定性の並列処理では、計算タスクが実行される順序が変更されることがあります。結果が異なる場合でも、計算誤差の範囲内に収まる必要があります。実行ごとに同一の結果が得られるようにするには、以下の操作を行います。

入力配列を 16 バイト境界でアライメントするには、以下のコード例で示されているように、システムが提供するメモリー・アロケーターの代わりに mkl_malloc() を使用します。 インテル® MKL を逐次モードで実行すると、非決定性の並列処理は行われません。

16 バイト境界でアドレスをアライメント

            
            // ******* 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)
            

このヘルプトピックについてのフィードバックを送信

© 2006 - 2010 Intel Corporation. 無断での引用、転載を禁じます。