OpenCLデバイス(GPUなど)でのメモリ割り当ては、clCreateBuffer(またはテクスチャメモリを使用する場合はclCreateImage2D / 3D )を使用してホストスレッドで実行する必要があります。これらの関数を使用すると、ホストデータ(たとえばmallocで作成)をデバイスに自動的にコピーできますが、データ転送のプロファイルを作成できるように、通常はclEnqueueWriteBuffer / clEnqueueMapBuffer(またはテクスチャメモリを使用している場合はclEnqueueWriteImage / clEnqueueMapImage )を明示的に使用することを好みます。次に例を示します。
#define DATA_SIZE 1000
typedef struct data {
cl_uint id;
cl_uint x;
cl_uint y;
} Data;
...
// Allocate data array in host
size_t dataSizeInBytes = DATA_SIZE * sizeof(Data);
DATA * dataArrayHost = (DATA *) malloc(dataSizeInBytes);
// Initialize data
...
// Create data array in device
cl_mem dataArrayDevice = clCreateBuffer(context, CL_MEM_READ_ONLY, dataSizeInBytes, NULL, &status );
// Copy data array to device
status = clEnqueueWriteBuffer(queue, dataArrayDevice, CL_TRUE, 0, dataSizeInBytes, &dataArrayHost, 0, NULL, NULL );
// Make sure to pass dataArrayDevice as kernel parameter
// Run kernel
...
考慮する必要があるのは、OpenCLカーネルを実行する前に、OpenCLカーネルのメモリ要件を知る必要があるということです。そのため、カーネルの実行前(つまりホスト内)に実行された場合、メモリ割り当ては動的になる可能性があります。カーネルを何度も呼び出し、そのたびにカーネルのメモリ要件を調整(割り当て)することを妨げるものは何もありません。
これを考慮して、問題への取り組み方を再考することをお勧めします。まず、配列の構造よりも構造の配列を操作する方が簡単です(ただし、必ずしも効率的である必要はありません)(この場合、配列のサイズは固定されている必要があります)。
これは、OpenCLがどのように機能するかを理解するためのものです。Khronos OpenCLリソースページをご覧ください。OpenCLのチュートリアルと例がたくさんあり、Khronos OpenCLページには、公式のOpenCLリファレンス、manページ、クイックリファレンスカードがあります。