Developer Reference for Intel® oneAPI Math Kernel Library for Fortran

ID 766686
Date 3/22/2024
Public
Document Table of Contents

mkl_free_buffers

Frees unused memory allocated by Intel® oneAPI Math Kernel Library (oneMKL) on the Host, including both CPU- and GPU-related buffers.

Syntax

call mkl_free_buffers

mkl.fi

Description

To improve performance of Intel® oneAPI Math Kernel Library (oneMKL) on CPU, the Memory Allocator uses per-thread memory pools where buffers may be collected for fast reuse. Intel® oneAPI Math Kernel Library (oneMKL) also allocates temporary buffers on the host memory to improve performance of GPU kernels. The mkl_free_buffers function frees both types of memory.

See theIntel® oneAPI Math Kernel Library (oneMKL) Developer Guide for details.

You should call mkl_free_buffers after the last call to Intel® oneAPI Math Kernel Library (oneMKL) functions. In large applications, if you suspect that the memory may get insufficient, you may call this function earlier, but anticipate a drop in performance that may occur due to reallocation of buffers for subsequent calls to Intel® oneAPI Math Kernel Library (oneMKL) functions.

NOTE:

mkl_free_buffers is triggered automatically during oneMKL unloading when it is possible as part of mkl_finalize; however, in the case of statically linked oneMKL or oneMKL using GPU on Windows, the user must call mkl_free_buffers or mkl_finalize manually in order to clean up oneMKL internal buffers when oneMKL is no longer needed.

Product and Performance Information

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

Notice revision #20201201

Usage of mkl_free_buffers with FFT Functions (C Example)

DFTI_DESCRIPTOR_HANDLE hand1; 
DFTI_DESCRIPTOR_HANDLE hand2; 
void mkl_free_buffers(void);
. . . . . .
/* Using Intel MKL FFT */
Status = DftiCreateDescriptor(&hand1, DFTI_SINGLE, DFTI_COMPLEX, dim, m1); 
Status = DftiCommitDescriptor(hand1);
Status = DftiComputeForward(hand1, s_array1);
. . . . . .
Status = DftiCreateDescriptor(&hand2, DFTI_SINGLE, DFTI_COMPLEX, dim, m2); 
Status = DftiCommitDescriptor(hand2);
. . . . . .
Status = DftiFreeDescriptor(&hand1);
. . . . . .
Status = DftiComputeBackward(hand2, s_array2)); 
Status = DftiFreeDescriptor(&hand2);
/* Here you finish using Intel MKL FFT */
/* Memory leak will be triggered by any memory control tool */
/* Use mkl_free_buffers() to avoid memory leaking */
mkl_free_buffers();