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