< 目次

インテル® MKL 2017 デベロッパー・ガイド

マルチコア・パフォーマンスの管理

スレッドを処理するコアが変更されないようにすることで、マルチコア・プロセッサーのシステムで最良のパフォーマンスを得ることができます。このためには、スレッドにアフィニティー・マスクを設定し、スレッドと CPU コアをバインドします。以下のいずれかのオプションを使用します。

以下のパフォーマンス問題について考えてみます。

この問題を解決するには、インテル® MKL を呼び出す前に、KMP_AFFINITY 環境変数や SetThreadAffinityMask システム関数を使用して、各 OpenMP* スレッドのアフィニティー・マスクを設定します。以下のコードサンプルは、オペレーティング・システムでアフィニティー・マスクを設定してこの問題を解決する方法を示しています。このコードは、システム関数 SetThreadAffinityMask を呼び出して適切なコアにスレッドをバインドしスレッドを処理するコアが変更されないようにします。 その後、インテル® MKL LAPACK ルーチンが呼び出されます。

        
        // Set affinity mask
        #include <windows.h>
        #include <omp.h>
        int main(void) {
        #pragma omp parallel default(shared)
        {
        int tid = omp_get_thread_num();
        // 2 packages x 2 cores/pkg x 1 threads/core (4 total cores)
        DWORD_PTR mask = (1 << (tid == 0 ? 0 : 2 ));
        SetThreadAffinityMask( GetCurrentThread(), mask );
        }
        // Call Intel MKL LAPACK routine
        return 0;
        }
         
        

インテル® コンパイラーで、以下のコマンドを使用してアプリケーションをコンパイルします。

icl /Qopenmp test_application.c

test_application.c は、アプリケーションのファイル名です。

アプリケーションをビルドします。例えば、次のように環境変数を使用してスレッド数を設定し、ビルドしたアプリケーションを 4 スレッドで実行します。

set OMP_NUM_THREADS=4test_application.exe
 

Windows® API ルーチンの使用における制限と上記の例で使用されている SetThreadAffinityMask 関数の詳細については、Windows API ドキュメント (msdn.microsoft.com/) を参照してください。

en.wikipedia.org/wiki/Affinity_mask (英語) の例も参照してください

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804