Developer Guide

Developer Guide for Intel® oneAPI Math Kernel Library macOS*

ID 766688
Date 7/13/2023
Public

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

Document Table of Contents

Redefining Memory Functions

In C/C++ programs, you can replace Intel® oneAPI Math Kernel Library (oneMKL) memory functions that the library uses by default with your own functions. To do this, use thememory renaming feature.

Memory Renaming

Intel® oneAPI Math Kernel Library (oneMKL) memory management by default uses standard C run-time memory functions to allocate or free memory. These functions can be replaced using memory renaming.

Intel® oneAPI Math Kernel Library (oneMKL) accesses the memory functions by pointersi_malloc, i_free, i_calloc, and i_realloc, which are visible at the application level. These pointers initially hold addresses of the standard C run-time memory functions malloc, free, calloc, and realloc, respectively. You can programmatically redefine values of these pointers to the addresses of your application's memory management functions.

Redirecting the pointers is the only correct way to use your own set of memory management functions. If you call your own memory functions without redirecting the pointers, the memory will get managed by two independent memory management packages, which may cause unexpected memory issues.

How to Redefine Memory Functions

To redefine memory functions, use the following procedure:

  1. Include the i_malloc.h header file in your code.
    This header file contains all declarations required for replacing the memory allocation functions. The header file also describes how memory allocation can be replaced in those Intel libraries that support this feature.
  2. Redefine values of pointers i_malloc, i_free, i_calloc, and i_reallocprior to the first call to Intel® oneAPI Math Kernel Library (oneMKL) functions, as shown in the following example:
            
            #include "i_malloc.h"
              . . .
              i_malloc  = my_malloc;
              i_calloc  = my_calloc;
              i_realloc = my_realloc;
              i_free    = my_free;
              . . .
            // Now you may call Intel MKL functions