サンプルコード

以下の単純なサンプルプログラムは、インテル® 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」 文がコメントアウトされている場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® 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)
! Declare oneMKL memory allocation routine
    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

C におけるアライメントされていないデータで CNR を使用

#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);

Fortran におけるアライメントされていないデータで CNR を使用

     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