メモリのアライメントされたブロックを取得するためのいくつかのオプションがありますが、それらは非常に似ており、問題は主にターゲットとする言語標準とプラットフォームに帰着します。
C11
void * aligned_alloc (size_t alignment, size_t size)
POSIX
int posix_memalign (void **memptr, size_t alignment, size_t size)
ウィンドウズ
void * _aligned_malloc(size_t size, size_t alignment);
そしてもちろん、それは常に手動で調整するオプションでもあります。
Intelは別のオプションを提供しています。
Intel
void* _mm_malloc (int size, int align)
void _mm_free (void *p)
Intelがリリースしたソースコードに基づいて、これはエンジニアが好むアライメントメモリを割り当てる方法のようですが、他の方法と比較したドキュメントは見つかりません。私が見つけた最も近いものは、他の整列されたメモリ割り当てルーチンが存在することを単に認めます。
アライメントされたメモリの一部を動的に割り当てるには、GCCおよびIntelコンパイラでサポートされているposix_memalignを使用します。これを使用する利点は、メモリ破棄APIを変更する必要がないことです。通常どおりfree()を使用できます。ただし、パラメータプロファイルに注意してください。
int posix_memalign(void ** memptr、size_t align、size_t size);
インテル®コンパイラーは、メモリ割り当てAPIの別のセットも提供します。 C/C++プログラマーは、_mm_mallocおよび_mm_freeを使用して、メモリのアライメントされたブロックを割り当ておよび解放できます。たとえば、次のステートメントは、8つの浮動小数点要素に対して64バイトにアライメントされたメモリブロックを要求します。
farray =(float *)__ mm_malloc(8 * sizeof(float)、64);
_mm_mallocを使用して割り当てられたメモリは、_mm_freeを使用して解放する必要があります。 _mm_mallocで割り当てられたメモリでfreeを呼び出すか、mallocで割り当てられたメモリで_mm_freeを呼び出すと、予期しない動作が発生します。
ユーザーの観点からの明らかな違いは、_mm_malloc
には直接のCPUとコンパイラのサポートが必要であり、_mm_malloc
で割り当てられたメモリは_mm_free
で解放する必要があるということです。これらの欠点を考えると、_mm_malloc?
を使用する理由は何ですか?パフォーマンスにわずかな利点がありますか?歴史的な事故?
Intelコンパイラは、POSIX(Linux)および非POSIX(Windows)オペレーティングシステムをサポートしているため、POSIXまたはWindowsの機能に依存することはできません。そのため、コンパイラ固有であるがOSに依存しないソリューションが選択されました。
C11は優れたソリューションですが、MicrosoftはC99をまだサポートしていないため、C11をサポートするかどうかは誰にもわかりません。
更新: C11/POSIX/Windowsの割り当て関数とは異なり、ICC組み込み関数には割り当て解除関数が含まれています。これにより、このAPIはデフォルトとは別のヒープマネージャーを使用できます。それが実際にそれを行うかどうか/いつ行うかはわかりませんが、このモデルをサポートすることは有用です。
免責事項:私はインテルで働いていますが、これらの決定について特別な知識はありません。これは入社するずっと前に起こりました。
_mm_mallocは、標準のalign_alloc関数が存在する前に作成されたようです。_mm_freeを使用する必要があるのは、実装の癖です。
私の推測では、posix_memalignを使用する場合とは異なり、アライメントを保証するためにオーバーアロケートする必要はなく、代わりに別のアライメント対応アロケータを使用します。これにより、デフォルトのアラインメントとは異なるアラインメント(通常は8バイトまたは16バイト)で型を割り当てるときにメモリが節約されます。