Intel® Math Kernel Library 11.0.2 User Guide
The following simple programs show how to obtain reproducible results from run to run of Intel MKL functions. See the Intel MKL Reference Manual for more examples.
#include <mkl.h>
int main(void) {
int my_cbwr_branch;
/* Align all input/output data on 128-byte boundaries to get reproducible results of Intel MKL function calls */
void *darray;
int darray_size=1000;
/* Set alignment value in bytes */
int alignment=128;
/* 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 (mkl_cbwr_set(my_cbwr_branch)) {
printf(“Error in setting MKL_CBWR_BRANCH! Aborting…\n”);
return;
}
/* CNR calls to Intel MKL + any other code with aligned input\output data */
/* Free the allocated aligned array */
mkl_free(darray);
}
PROGRAM MAIN
INCLUDE 'mkl.fi'
INTEGER*4 MY_CBWR_BRANCH
! Align all input/output data on 128-byte boundaries to get reproducible results of Intel MKL function calls
! 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=128)
! 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 (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