2012-02-21 12 views
2

私は主に2次元マトリックスを持っています。私はホストからデバイスに転送する場合。どのように私はそれのためのメモリを割り当てることができますし、デバイスのメモリに転送することを教えてくれますか?ホストからデバイスへのCUDA転送2D配列

#define N 5 
__global__ void kernel(int a[N][N]){ 
} 
int main(void){ 

    int a[N][N]; 
    cudaMalloc(?); 
    cudaMemcpy(?); 
    kernel<<<N,N>>>(?); 

} 

答えて

8

おそらく、このようなものは、あなたが本当に考えていたものです:あなたが見逃している可能性があります

#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番目のアクセス形式を使用する必要があります。

+0

タイプミスの修正をしていただきありがとうございます。あまりにも綿密に見ていない元の投稿からコピーしました。 – talonmies

+0

'cudaMemcpy'コールでホストからデバイスへコピーするべきではありませんか? – nsane

関連する問題