假设您可以使用两个单独的数组,并考虑如何在 CUDA 中使用/读取/写入它们,我将把数据安排在两个数组中,主要是由于内核中全局内存的合并访问。
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 函数时不要忘记检查错误。