メモリー関数の再定義

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

メモリーの名前変更

インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のメモリー管理は、デフォルトで標準 C ランタイムメモリー関数を使用してメモリーの割り当てと解放を行います。これらの関数は、メモリーの名前変更を使用して置き換えることができます。

インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) は、アプリケーション・レベルで確認可能な、ポインター i_malloc、i_free、i_calloc、および i_realloc を使用してメモリー関数にアクセスします。これらのポインターは、最初はそれぞれ標準 C ランタイム メモリー関数 malloc、free、calloc、および realloc のアドレスを保持します。これらのポインターの値を、アプリケーションのメモリー管理関数のアドレスに再定義できます。

ポインターをリダイレクトすることが、独自のメモリー管理関数セットを使用する唯一の正しい方法です。ポインターをリダイレクトせずに独自のメモリー関数を呼び出すと、メモリーは 2 つの独立したメモリー管理パッケージによって管理され、予期しないメモリーの問題が発生する可能性があります。

メモリー関数の再定義

メモリー関数を再定義するには、次の手順に従います。

静的にリンクされたインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を使用している場合は、コードで i_malloc.h ヘッダーファイルをインクルードします。

  1. このヘッダーファイルには、メモリー割り当て関数を置き換えるために必要なすべての宣言が含まれています。ヘッダーファイルでは、この機能をサポートするインテル® ライブラリーでメモリー割り当てを置き換える方法も記述されています。
  2. インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数への最初の呼び出しの前に、ポインター i_malloc、i_free、i_calloc、および i_realloc の値を以下のように再定義します。

    #include "i_malloc.h"
    . . .
    i_malloc  = my_malloc;
    i_calloc  = my_calloc;
    i_realloc = my_realloc;
    i_free    = my_free;
    . . .
    // ここで oneMKL 関数を呼び出すことができます。

動的にリンクされたインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を使用している場合は、コードで i_malloc.h ヘッダーファイルをインクルードします。

  1. コードに i_malloc.h ヘッダーファイルをインクルードします。
  2. インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) 関数への最初の呼び出しの前に、ポインター i_malloc_dll, i_free_dll, i_calloc_dll、および i_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;             
   . . .
   // ここで oneMKL 関数を呼び出すことができます。