メモリー割り当てとファーストタッチ
この記事は、インテル® デベロッパー・ゾーンに掲載されている「Memory Allocation and First-Touch」の日本語参考訳です。
コプロセッサーにおけるメモリー割り当てはインテル® Xeon® プロセッサーよりもコストがかかるため、可能な場合はすでに割り当てられているメモリーを再利用するほうが効率的です。例えば、関数が (ループ内で) 繰り返し呼び出され、この関数が一時ストレージの配列を使う場合、(必要な最大サイズの) 配列を最初に割り当てて、後の呼び出しの配列に再利用します。
static real *temp_array=0; void foo(..) { ... if (temp_array == 0) { temp_array = my_malloc(MAX_SIZE); } ... // temp_array の使用 }
また、Linux* での物理メモリー割り当てはファーストタッチ (malloc 時ではなく最初にメモリーにアクセスした) の時点で行われることも考慮する必要があります。このため、malloc されまだアクセスされていない配列を走査するループがある場合、最初の反復は残りの反復よりも時間がかかります。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。