Developer Guide

Developer Guide for Intel® oneAPI Math Kernel Library Linux*

ID 766690
Date 12/16/2022
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of 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 theIntel® 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