インテル® マス・カーネル・ライブラリー 11.2 ユーザーズガイド
以下の単純なサンプルプログラムは、インテル® MKL 関数の実行で一貫性のある結果を得る方法を示します。ほかのサンプルは、『インテル® MKL リファレンス・マニュアル』を参照してください。
#include <mkl.h> int main(void) { int my_cbwr_branch; /* Align all input/output data on 64-byte boundaries */ /* "for best performance of Intel MKL */ void *darray; int darray_size=1000; /* Set alignment value in bytes */ int alignment=64; /* Allocate aligned array */ darray = mkl_malloc (sizeof(double)*darray_size, alignment); /* Find the available MKL_CBWR_BRANCH automatically */ my_cbwr_branch = mkl_cbwr_get_auto_branch(); /* User code without Intel MKL calls */ /* Piece of the code where CNR of Intel MKL is needed */ /* The performance of Intel MKL functions might be reduced for CNR mode */ /* If the "IF" statement below is commented out, Intel MKL will run in a regular mode, */ /* and data alignment will allow you to get best performance */ if (mkl_cbwr_set(my_cbwr_branch)) { printf("Error in setting MKL_CBWR_BRANCH! Aborting…\n”); return; } /* CNR calls to Intel MKL + any other code */ /* Free the allocated aligned array */ mkl_free(darray); }
PROGRAM MAIN INCLUDE 'mkl.fi' INTEGER*4 MY_CBWR_BRANCH ! Align all input/output data on 64-byte boundaries ! "for best performance of Intel MKL ! Declare Intel MKL memory allocation routine #ifdef _IA32 INTEGER MKL_MALLOC #else INTEGER*8 MKL_MALLOC #endif EXTERNAL MKL_MALLOC, MKL_FREE DOUBLE PRECISION DARRAY POINTER (P_DARRAY,DARRAY(1)) INTEGER DARRAY_SIZE PARAMETER (DARRAY_SIZE=1000) ! Set alignment value in bytes INTEGER ALIGNMENT PARAMETER (ALIGNMENT=64) ! Allocate aligned array P_DARRAY = MKL_MALLOC (%VAL(8*DARRAY_SIZE), %VAL(ALIGNMENT)); ! Find the available MKL_CBWR_BRANCH automatically MY_CBWR_BRANCH = MKL_CBWR_GET_AUTO_BRANCH() ! User code without Intel MKL calls ! Piece of the code where CNR of Intel MKL is needed ! The performance of Intel MKL functions may be reduced for CNR mode ! If the "IF" statement below is commented out, Intel MKL will run in a regular mode, ! and data alignment will allow you to get best performance IF (MKL_CBWR_SET (MY_CBWR_BRANCH) .NE. MKL_CBWR_SUCCESS) THEN PRINT *, 'Error in setting MKL_CBWR_BRANCH! Aborting…' RETURN ENDIF ! CNR calls to Intel MKL + any other code ! Free the allocated aligned array CALL MKL_FREE(P_DARRAY) END
#include <mkl.h> int main(void) { int my_cbwr_branch; /* If it is not possible to align all input/output data on 64-byte boundaries */ /* to achieve performance, use unaligned IO data with possible performance */ /* penalty */ /* Using unaligned IO data */ double *darray; int darray_size=1000; /* Allocate array, malloc aligns data on 8/16-byte boundary only */ darray = (double *)malloc (sizeof(double)*darray_size); /* Find the available MKL_CBWR_BRANCH automatically */ my_cbwr_branch = mkl_cbwr_get_auto_branch(); /* User code without Intel MKL calls */ /* Piece of the code where CNR of Intel MKL is needed */ /* The performance of Intel MKL functions might be reduced for CNR mode */ /* If the "IF" statement below is commented out, Intel MKL will run in a regular mode, */ /* and you will NOT get best performance without data alignment */ if (mkl_cbwr_set(my_cbwr_branch)) { printf("Error in setting MKL_CBWR_BRANCH! Aborting…\n"); return; } /* CNR calls to Intel MKL + any other code */ /* Free the allocated array */ free(darray);
PROGRAM MAIN INCLUDE 'mkl.fi' INTEGER*4 MY_CBWR_BRANCH ! If it is not possible to align all input/output data on 64-byte boundaries ! to achieve performance, use unaligned IO data with possible performance ! penalty DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: DARRAY INTEGER DARRAY_SIZE, STATUS PARAMETER (DARRAY_SIZE=1000) ! Allocate array with undefined alignment ALLOCATE(DARRAY(DARRAY_SIZE)); ! Find the available MKL_CBWR_BRANCH automatically MY_CBWR_BRANCH = MKL_CBWR_GET_AUTO_BRANCH() ! User code without Intel MKL calls ! Piece of the code where CNR of Intel MKL is needed ! The performance of Intel MKL functions might be reduced for CNR mode ! If the "IF" statement below is commented out, Intel MKL will run in a regular mode, ! and you will NOT get best performance without data alignment IF (MKL_CBWR_SET(MY_CBWR_BRANCH) .NE. MKL_CBWR_SUCCESS) THEN PRINT *, 'Error in setting MKL_CBWR_BRANCH! Aborting…' RETURN ENDIF ! CNR calls to Intel MKL + any other code ! Free the allocated array DEALLOCATE(DARRAY) END