CUDA: невозможно скопировать массив символов с хоста в единую память устройства с помощью cudaMemcpyToSymbol - PullRequest
1 голос
/ 07 мая 2020

Я новичок в программировании на Cuda. Я пытаюсь скопировать массив символов с хоста в единую память устройства. Код не выдает никаких ошибок, но показывает память устройства в виде пустых строк.

int main(int argc, char **argv)
{
    int i = 0, n = 0;
    unsigned char * buff;
    char inp[512] = "abc";
    n = 10;

    while (i < n)
    {
         int num = i, size = 0;
         while(num > 0)
         {
             ++size;
             num /= 10;
         }
         size += strlen(inp);
         num = i;
         inp[size--] = '\0';
         while(num > 0)
         {
              inp[size--] = '0' + num%10;
              num /= 10;
         }
         size = strlen(inp);
         cudaMallocManaged(&buff, (size+1)*sizeof(char));
         cudaMemcpyToSymbol(buff, &inp, sizeof(inp), 0, cudaMemcpyHostToDevice);
         printf("%s\n", inp);
         printf("%s\n", buff);
    }

    cudaDeviceReset();
    return 0;
 }

Это результат приведенного выше кода:

abc

abc1

abc12

abc123

abc1234

abc12345

abc123456

abc1234567

abc12345678

abc123456789

Пожалуйста, помогите мне.

1 Ответ

2 голосов
/ 07 мая 2020

Здесь бафф размещается в единой памяти и не является символом устройства. Следовательно, в этом контексте нам нужно забыть о символах устройств. Доступ к данным в объединенной памяти может осуществляться напрямую как хостом, так и устройством, когда это необходимо. Устройство автоматически извлекает нужные данные из единой памяти без необходимости явно перемещать данные в память устройства.

Проблему здесь можно решить, используя memcpy вместо cudaMemcpyToSymbol. cudaMemcpyToSymbol используется для записи данных в память устройства, а не в единую память.

cudaMemcpyToSymbol(buff, &inp, sizeof(inp), 0, cudaMemcpyHostToDevice);

следует заменить на

memcpy(buff, inp, size+1);

Спасибо @talonmies за предложение.

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