Может ли массив шорт быть передан в ядро ​​CUDA - PullRequest
0 голосов
/ 16 апреля 2020

Я написал ядро ​​CUDA, и когда я копирую массив шортов в память устройства и затем передаю его ядру, оно не работает. Упрощенный код ниже выражает мою проблему.

KernelCaller()
{
    const int size = 1;
    short hostArray[size]{41};
    short* devPointer;
    cudaMalloc((void**)&devicePointer, size * sizeof(short));
    cudaMemcpy(devPointer, hostArray, size * sizeof(short), cudaMemcpyHostToDevice);
    cudaKernel<<<1,1>>>(devPointer);

}

__global__
void cudaKernel(short* arr)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    short val = arr[idx];
}

На данный момент значение val равно 1063714857, и я хочу, чтобы это было 41. Я предполагаю, что проблема в 41 в шестнадцатеричном является 0x29 и у меня есть значение 0x3F670029, так что похоже, что он читает слишком много байтов, потому что 0x29 находится в начале. Когда я переключаюсь на массив с плавающей точкой, он работает отлично, но я пытался сэкономить память. Разве CUDA не допускает массив шорт?

1 Ответ

2 голосов
/ 16 апреля 2020

Я реализовал ваш код и получил вывод, как и ожидалось.

Вот код

 #include<stdio.h>
__global__ void cudaKernel(short* arr)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    short val = arr[idx];
    # if __CUDA_ARCH__>=200
        printf("Inside kernel %d\n",val);
    #endif
    arr[idx] = val;
}

int main()
{
    const int size = 1;
    short hostArray[size]{41};
    printf("Before kernel call %d\n",hostArray[0]);
    short *devPointer;
    cudaMalloc((void**)&devPointer, size * sizeof(short));
    cudaMemcpy(devPointer, hostArray, size * sizeof(short), cudaMemcpyHostToDevice);
    cudaKernel<<<1,1>>>(devPointer);
    cudaMemcpy(hostArray, devPointer, size * sizeof(short), cudaMemcpyDeviceToHost);
    printf("After kernel call %d\n",hostArray[0]);
    cudaFree(devPointer);
    return 0;
}

И вывод

Before kernel call 41
Inside kernel 41
After kernel call 41

Итак, да, мы может передавать массив шортов в ядро ​​CUDA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...