CUDA从主机到设备传输2D阵列

时间:2012-02-21 07:49:43

标签: gpu gpu-programming cuda

我主要有一个2D矩阵。我想从主机转移到设备。你能告诉我如何为它分配内存并将其传输到设备内存吗?

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

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

}

1 个答案:

答案 0 :(得分:9)

也许这样的事情是你真正想到的:

#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上,您必须使用第二种访问形式来读取从主机复制的内存。