Возможно, что-то вроде этого вы действительно имели в виду:
#define N 5
__global__ void kernel(int *a)
{
// Thread indexing within Grid - note these are
// in column major order.
int tidx = threadIdx.x + blockIdx.x * blockDim.x;
int tidy = threadIdx.y + blockIdx.y * blockDim.y;
// a_ij = a[i][j], where a is in row major order
int a_ij = a[tidy + tidx*N];
}
int main(void)
{
int a[N][N], *a_device;
const size_t a_size = sizeof(int) * size_t(N*N);
cudaMalloc((void **)&a_device, a_size);
cudaMemcpy(a_device, a, a_size, cudaMemcpyHostToDevice);
kernel<<<N,N>>>(a_device);
}
Возможно, вы упустили момент, когда вы статически объявляете массив, подобный этому A[N][N]
, это действительно просто ряд крупных заказных кусков линейной памяти.Компилятор автоматически преобразует между a[i][j]
и a[j + i*N]
, когда он генерирует код.На GPU вы должны использовать вторую форму доступа для чтения памяти, которую вы копируете с хоста.