インテル® MKL 11.3 ユーザーズガイド

メモリー関数の再定義

C/C++ プログラムでは、ライブラリーがデフォルトで使用するインテル® MKL メモリー関数を独自の関数に置換できます。置換するには、メモリー関数名の変更機能を使用します。

メモリー関数名の変更

デフォルトでは、インテル® MKL メモリー管理は、標準 C ランタイムメモリー関数を使用してメモリーの割り当てと解放を行います。これらの関数は、メモリー関数名の変更機能を使用して置換することができます。

インテル® MKL は、アプリケーション・レベルで確認可能な、ポインター i_malloc、i_free、i_calloci_realloc を使用してメモリー関数にアクセスしています。 これらのポインターは、最初は標準 C ランタイムメモリー関数 malloc、free、callocrealloc のアドレスをそれぞれ保持しています。 これらのポインターの値がアプリケーションのメモリー管理関数のアドレスを指すように、プログラムで再定義できます。

ポインターのリダイレクトは、独自のメモリー管理関数を使用するための唯一の正しい方法です。ポインターのリダイレクトを行わずに独自のメモリー関数を呼び出すと、2 つのメモリー管理パッケージでメモリーが管理されることになり、予測できないメモリー問題が発生します。

メモリー関数の再定義方法

メモリー関数を再定義するには、以下の操作を行います。

スタティックにリンクしたインテル® MKL を使用している場合:

  1. i_malloc.h ヘッダーファイルをコードにインクルードします。
    ヘッダーファイルには、メモリー割り当て関数を置換するために必要な宣言がすべて含まれています。 このヘッダーファイルでは、この機能をサポートするインテル® ライブラリーでメモリー割り当てを置換する方法も示しています。
  2. インテル® MKL 関数への最初の呼び出しの前に、ポインター i_malloc、i_free、i_calloci_realloc の値を以下のように再定義します。
                    
            #include "i_malloc.h"
              . . .
              i_malloc  = my_malloc;
              i_calloc  = my_calloc;
              i_realloc = my_realloc;
              i_free    = my_free;
              . . .
            // ここでインテル® MKL 関数を呼び出すことができます。
            

ダイナミックにリンクしたインテル® MKL を使用している場合:

  1. i_malloc.h ヘッダーファイルをコードにインクルードします。
  2. インテル® MKL 関数への最初の呼び出しの前に、ポインター i_malloc_dll、i_free_dll、i_calloc_dlli_realloc_dll の値を以下のように再定義します。
                  
#include "i_malloc.h"         
  . . .          
  i_malloc_dll  = my_malloc;       
  i_calloc_dll  = my_calloc;          
  i_realloc_dll = my_realloc;          
  i_free_dll    = my_free;             
. . .
// ここでインテル® MKL 関数を呼び出すことができます。