おそらく、このようなものは、あなたが本当に考えていたものです:あなたが見逃している可能性があります
#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]
ような配列を宣言するとき、それは本当にただrow major orderedであるということですリニアメモリの一部です。コンパイラはコードを発行するときにa[i][j]
とa[j + i*N]
の間で自動的に変換します。 GPUでは、ホストからコピーするメモリを読み取るために、2番目のアクセス形式を使用する必要があります。
タイプミスの修正をしていただきありがとうございます。あまりにも綿密に見ていない元の投稿からコピーしました。 – talonmies
'cudaMemcpy'コールでホストからデバイスへコピーするべきではありませんか? – nsane