Developer Guide

Contents

Code Examples

The following simple programs show how to obtain reproducible results from run to run of
Intel® MKL
functions. See the
Intel® MKL
Developer Reference
for more examples.

C Example of CNR

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

Fortran Example of CNR

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

Use of CNR with Unaligned Data in C

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

Use of CNR with Unaligned Data in Fortran

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

Product and Performance Information

1

Intel's compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice.

Notice revision #20110804