インテル® MKL 2019 for Windows* デベロッパー・ガイド
このセクションでは、サポートするアーキテクチャー・ベースのプロセッサー上でパフォーマンスを向上するコーディング手法について説明します。
パフォーマンスを向上させるには、コードで配列のアライメントを適切に行います。追加の条件により特定の関数ドメインのパフォーマンスを向上できます。
インテル® MKL を呼び出すアプリケーションのパフォーマンスを向上させるには、配列を 64 バイト境界でアライメントして、配列のリーディング・ディメンジョンが 64/element_size で割り切れるようにします。ここで、element_size は行列の要素のバイト数 (単精度実数の場合は 4、倍精度実数および単精度複素数の場合は 8、倍精度複素数の場合は 16) です。詳細は、「データのアライメントの例」を参照してください。
インテル® Xeon Phi™ x200 製品ファミリー (開発コード名 Knights Landing) の場合、行列を 4096 バイト境界でアライメントして、リーディング・ディメンジョンを次の整数式に設定します。
(((n * element_size + 511) / 512) * 512 + 64) /element_size
ここで、n はリーディング・ディメンジョンに沿った行列の次元です。
名前の行列の型と格納位置 (2 つ目と 3 つ目の文字) が HP、OP、PP、SP、TP、UP のルーチンは、圧縮形式で行列を処理します (『インテル® MKL デベロッパー・リファレンス』の LAPACK の「ルーチン命名規則」セクションを参照)。これらの機能は、名前の行列の型と格納位置 (2 つ目と 3 つ目の文字) が HE、OR、PO、SY、TR、UN の非圧縮ルーチンの機能と厳密に等価ですが、パフォーマンスは大幅に低くなります。
メモリー制限があまり厳しくない場合は、非圧縮ルーチンを使用してください。この場合、それぞれの圧縮ルーチンで要求されるメモリーよりも N2/2 多いメモリーを割り当てる必要があります。N は問題サイズ (方程式の数) です。
例えば、エキスパート・ドライバーを使用した対称固有値問題を解く時間を短縮するには、次の非圧縮ルーチンを使用します。
call dsyevx(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info)
a は少なくとも N2 の要素を含む次元 lda-n です。
変更前の圧縮ルーチンは次のとおりです。
call dspevx(jobz, range, uplo, n, ap, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info)
ap は次元 N*(N+1)/2 です。
最適化に関する注意事項 |
---|
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。 注意事項の改訂 #20110804 |