サンプルコード

以下の単純なサンプルプログラムは、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数の実行で一貫性のある結果を得る方法を示します。インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) デベロッパー・リファレンスを参照してください。

CNR の C サンプルプログラム

#include <mkl.h>
int main(void) {
    int my_cbwr_branch;
    /* すべての入出力データを64バイト境界にそろえる */
    /* インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の最高のパフォーマンスを実現 */
    void *darray;
    int darray_size=1000;
    /* アラインメント値をバイト単位で設定 */
    int alignment=64;
    /* アラインされた配列を割り当てる */
    darray = mkl_malloc (sizeof(double)*darray_size, alignment);
    /* 利用可能なMKL_CBWR_BRANCHを自動的に検出 */
    my_cbwr_branch = mkl_cbwr_get_auto_branch();
    /* oneMKL呼び出しのないユーザーコード */
    /* oneMKL の CNR が必要なコードの一部 */
    /* CNR モードでは oneMKL 関数のパフォーマンスが低下する可能性があります。 */
    /* 以下の 「IF」 文がコメントアウトされている場合、(oneMKL は通常モードで実行され、 */
    /* データのアライメントによって最高のパフォーマンスが得られます。 */
    if (mkl_cbwr_set(my_cbwr_branch)) {
        printf("Error in setting MKL_CBWR_BRANCH! Aborting…\n");
        return;
    }
    /* CNR は oneMKL とその他のコードを呼び出す */
    /* 割り当てられた配列を解放 */
    mkl_free(darray);
}

CNR の Fortran サンプルプログラム


    PROGRAM MAIN
    INCLUDE 'mkl.fi'
    INTEGER*4 MY_CBWR_BRANCH
    ! すべての入出力データを64バイト境界にそろえる
    ! インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の最高のパフォーマンスを実現
    ! oneMKL メモリー割り当てルーチンを宣言
    DOUBLE PRECISION DARRAY
    POINTER (P_DARRAY,DARRAY(1))
    INTEGER DARRAY_SIZE
    PARAMETER (DARRAY_SIZE=1000)
    ! アラインメント値をバイト単位で設定
    INTEGER ALIGNMENT
    PARAMETER (ALIGNMENT=64)
    ! アライメントされた配列を割り当て
    INTEGER*8 ALLOC_SIZE
    ALLOC_SIZE = 8*DARRAY_SIZE
    P_DARRAY = MKL_MALLOC (ALLOC_SIZE, ALIGNMENT);
    ! 利用可能な MKL_CBWR_BRANCH を自動的に検出
    MY_CBWR_BRANCH = MKL_CBWR_GET_AUTO_BRANCH()
    ! oneMKL 呼び出しのないユーザーコード
    ! oneMKL の CNR が必要なコードの一部
    ! CNR モードでは oneMKL 関数のパフォーマンスが低下する可能性があります。
    ! 以下の 「IF」 文がコメントアウトされている場合、
    ! インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL)は通常モードで実行され、
    ! データのアライメントにより最高のパフォーマンスが得られます
    IF (MKL_CBWR_SET (MY_CBWR_BRANCH) .NE. MKL_CBWR_SUCCESS) THEN
    PRINT *, 'Error in setting MKL_CBWR_BRANCH! Aborting…'
    STOP 0
    ENDIF
    ! CNRは oneMKL とその他のコードを呼び出す
    ! 割り当てられた配列を解放
    CALL MKL_FREE(P_DARRAY)
    END

アライメントされていないデータで CNR を使用する C サンプルプログラム

#include <mkl.h>
int main(void) {
     int my_cbwr_branch;
     /* パフォーマンスを達成するためにすべての入出力データを 64 バイト境界に揃えることができない場合は、 */
     /* パフォーマンスが低下する可能性がある非整列 IO データを使用します。 */ 
     /* 非整列 IO データを使用 */
     double *darray;
     int darray_size=1000;
     /* 配列を割り当て、malloc はデータを 8/16 バイト境界にのみ配置 */
     darray = (double *)malloc (sizeof(double)*darray_size);
     /* 利用可能なMKL_CBWR_BRANCHを自動的に検出 */
     my_cbwr_branch = mkl_cbwr_get_auto_branch();
     /* oneMKL 呼び出しのないユーザーコード */
     /* oneMKL の CNR が必要なコードの一部 */
     /* CNR モードでは oneMKL 関数のパフォーマンスが低下する可能性があります。 */
     /* 以下の 「IF」 文がコメントアウトされている場合、oneMKL は通常モードで実行され、 */ 
     /* データのアライメントなしでは最高のパフォーマンスが得られません。 */
     if (mkl_cbwr_set(my_cbwr_branch)) {
          printf("Error in setting MKL_CBWR_BRANCH! Aborting…\n");
          return;
}
    /* CNR は oneMKL とその他のコードを呼び出す */
    /* 割り当てられた配列を解放 */
     free(darray);

アライメントされていないデータで CNR を使用する Fortran サンプルプログラム


    PROGRAM MAIN
    INCLUDE 'mkl.fi'
    INTEGER*4 MY_CBWR_BRANCH
    ! パフォーマンスを達成するためにすべての入出力データを 64 バイト境界に揃えることができない場合は、
    ! パフォーマンスが低下する可能性がある非整列 IO データを使用します。
    !
    DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: DARRAY
    INTEGER DARRAY_SIZE, STATUS
    PARAMETER (DARRAY_SIZE=1000)
    ! 未定義のアラインメントで配列を割り当て
    ALLOCATE(DARRAY(DARRAY_SIZE));
    ! 利用可能な MKL_CBWR_BRANCH を自動的に検出
    MY_CBWR_BRANCH = MKL_CBWR_GET_AUTO_BRANCH()
    ! oneMKL 呼び出しのないユーザーコード
    ! oneMKL の CNR が必要なコードの一部
    ! CNR モードでは oneMKL 関数のパフォーマンスが低下する可能性があります。
    ! 以下の 「IF」 文がコメントアウトされている場合、oneMKL は通常モードで実行され、
    ! データのアラインメントなしでは最高のパフォーマンスは得られません
    IF (MKL_CBWR_SET(MY_CBWR_BRANCH) .NE. MKL_CBWR_SUCCESS) THEN
    PRINT *, 'Error in setting MKL_CBWR_BRANCH! Aborting…'
    RETURN
    ENDIF
    ! CNR は oneMKL とその他のコードを呼び出す
    ! 割り当てられた配列を解放
    DEALLOCATE(DARRAY)
    END