< 目次

コーディングのテクニック

パフォーマンスを向上させるには、コードで配列のアライメントを適切に行います。

データ・アライメントとリーディング・ディメンジョン

インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出すアプリケーションのパフォーマンスを向上させるには、次の推奨事項に留意して、配列を 64 バイト境界に揃え、先頭の次元にパディングを追加します。

推奨事項 1

最高のパフォーマンスを得るには、行列の最初の次元を 64 バイトの倍数 (フル・キャッシュライン・サイズ) にする必要があります。単精度データでは、先頭の次元が (64 / sizeof(float)) の倍数の 16 要素でなければなりません。同様に、倍精度実数データまたは単精度複素数データの場合、先頭の次元は 8 要素の倍数である必要があり、倍精度複素数データの場合、先頭の次元は 4 要素の倍数である必要があります。

推奨事項 2

最高のパフォーマンスを得るには、先頭の次元を 2 の乗数の倍数にしてはなりません (4096 など)。先頭の次元を上記の条件より少し大きくすると (例: 4096 から 4096 + 64 バイトなど)、パフォーマンスが向上する場合があります。

LAPACK 圧縮ルーチン

名前の行列の型と格納位置 (2 つ目と 3 つ目の文字) が HP、OP、PP、SP、TP、UP のルーチンは、圧縮形式で行列を処理します (『インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) デベロッパー・リファレンス』の 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 の要素を含む次元 n/lda です。
変更前の圧縮ルーチンは次のとおりです。

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 です。

製品および性能に関する情報

性能は、使用状況、構成、およびその他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex (英語) をご覧ください。

改訂 #20201201

関連情報