2 つの別々の配列を使用できると仮定し、それらを CUDA で使用/読み取り/書き込みする方法を考えて、主にカーネル内のグローバル メモリからの合体アクセスのために、データを 2 つの配列に配置します。
int *h_val1, *h_val2; // allocate arrays in the host and initialize them
配列のサイズを N とし、配列をデバイス メモリに割り当てます。
int *d_val1, *d_val2;
cudaMalloc( (void**) &d_val1, N * sizeof(int) );
cudaMalloc( (void**) &d_val2, N * sizeof(int) );
ホストからデバイスのメモリにデータをコピーする
cudaMemcpy(h_val1, d_val1, N * sizeof(int), cudaMemcpyHostoToDevice);
cudaMemcpy(h_val2, d_val2, N * sizeof(int), cudaMemcpyHostoToDevice);
カーネルを構成して起動し、配列内の要素と同じ数のスレッドを実行します。
// kernel configuration
dim3 dimBlock = dim3 ( BLK_SIZE, 1, 1 );
dim3 dimGrid = dim3 ( (N / BLK_SIZE) + 1 );
yourKernel<<<dimGrid, dimBlock>>>(d_val1, d_val2);
これを念頭に置いて、カーネルを実装します
__global__ void
yourKernel(int* val1, int* val2, N)
{
// map from threadIdx/BlockIdx to index position
int gid = threadIdx.x + blockIdx.x * blockDim.x;
if (gid < N)
{
int r_val1 = val1[ idx ]; // load from global memory to register
int r_val2 = val2[ idx ]; // load from global memory to register
// do what you need to do with pair val1:val2
}
}
CUDA 関数を呼び出すときは、エラーをチェックすることを忘れないでください。