重要: このトピックは、エンベデッド プラットフォームには該当しません。エンベデッド プラットフォーム ユーザーは、clEnqueueMapBuffer の使用 で説明するように
clEnqueueMapBuffer
を使用する必要があります。XRT は、4K 境界のメモリ空間を割り当てて、内部メモリを管理します。ホスト メモリのポインターが ページ境界に揃っていない場合、XRT が揃うように memcpy
を追加で実行します。このため、ホスト メモリ ポインターを 4 K 境界に揃えて、メモリ コピー操作が余分に実行されないようにしてください。
次に、ホストのメモリ空間に malloc
ではなく posix_memalign
を使用する例を示します。
int *host_mem_ptr; // = (int*) malloc(MAX_LENGTH*sizeof(int));
// Aligning memory in 4K boundary
posix_memalign(&host_mem_ptr,4096,MAX_LENGTH*sizeof(int));
// Fill the memory input
for(int i=0; i<MAX_LENGTH; i++) {
host_mem_ptr[i] = <... >
}
cl_mem dev_mem_ptr = clCreateBuffer(context,
CL_MEM_READ_WRITE ,
sizeof(int) * number_of_words, host_mem_ptr, NULL);
err = clEnqueueMigrateMemObjects(commands, 1, dev_mem_ptr, 0, 0,
NULL, NULL);