Developer Guide

  • 2021.1
  • 12/04/2020
  • Public Content
Contents

Code Examples

The following simple programs show how to obtain reproducible results from run to run of
Intel® oneAPI Math Kernel Library
functions. See the
Intel® oneAPI Math Kernel Library
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® oneAPI Math Kernel Library */ 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 oneMKL calls */ /* Piece of the code where CNR of oneMKL is needed */ /* The performance of oneMKL functions might be reduced for CNR mode */ /* If the "IF" statement below is commented out, Intel® oneAPI Math Kernel Library 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 oneMKL + 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® oneAPI Math Kernel Library ! Declare oneMKL 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 oneMKL calls ! Piece of the code where CNR of oneMKL is needed ! The performance of oneMKL functions may be reduced for CNR mode ! If the "IF" statement below is commented out, Intel® oneAPI Math Kernel Library 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 oneMKL + 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 oneMKL calls */ /* Piece of the code where CNR of oneMKL is needed */ /* The performance of oneMKL functions might be reduced for CNR mode */ /* If the "IF" statement below is commented out, oneMKL 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 oneMKL + 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 oneMKL calls ! Piece of the code where CNR of oneMKL is needed ! The performance of oneMKL functions might be reduced for CNR mode ! If the "IF" statement below is commented out, oneMKL 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 oneMKL + any other code ! Free the allocated array DEALLOCATE(DARRAY) END

Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.