CUDA-перенос 2D-массива с хоста на устройство - PullRequest
3 голосов
/ 21 февраля 2012

У меня 2D-матрица в основном.Я хочу перенести, если с хоста на устройство.Можете ли вы сказать мне, как я могу выделить для него память и перенести ее в память устройства?

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

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

}

1 Ответ

9 голосов
/ 21 февраля 2012

Возможно, что-то вроде этого вы действительно имели в виду:

#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 вы должны использовать вторую форму доступа для чтения памяти, которую вы копируете с хоста.

...