2016-06-09 2 views
0

Всякий раз, когда я бегу мой сценарий, содержащий эти строки:CUDA выделения массив строк

char ** gpu_reads; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_reads, inputDim * sizeof(char *))); 
    for(i=0; i<inputDim; i++) { 
     HANDLE_ERROR(cudaMalloc((void **)&(gpu_reads[i]), (READS_LENGTH + 1) * sizeof(char))); 
    } 
    for(i=0; i<inputDim; i++) { 
     HANDLE_ERROR(cudaMemcpy(gpu_reads[i], reads[i], sizeof(char) * (READS_LENGTH + 1), cudaMemcpyHostToDevice)); 
    } 

Вторая строка возвращает «неизвестная ошибка». Я пробовал разное распределение в моей программе (это был первый), но никто из них не работал.

Цель этих строк просто выделить массив (длины, установленных пользователем, с помощью переменной inputDim строк (фиксированной длины).

Я пробовал различные версии (то есть, используя только 3 указатели, 1 указатель ...), но никто не похоже на работу ...

Любые идеи?

полный код доступен на моем GitHub repository, где многие выделения сделаны.

+0

Почему у меня такое же количество звезд на 4-й строке, что и на 2-ом в '(void **)'? –

+0

CUDA - это не C, а C++. – Olaf

+0

Выделите '(READS_LENGTH * inputDim)' байты в одном фрагменте, и вам никогда не придется бороться со сломанными циклами. – Drop

ответ

3

Что вы пытаетесь do не может работать, потому что ваш код пытается получить доступ к памяти, которую вы выделили на устройстве с хоста. Вы не можете получить доступ к элементам gpu_reads на хосте, поскольку это не допустимое распределение памяти хоста.

Сделайте что-нибудь, как это вместо:

char ** gpu_reads; 
    char ** gpu_reads_h = new char*[input_dim]; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_reads, inputDim * sizeof(char *))); 
    for(i=0; i<inputDim; i++) { 
     HANDLE_ERROR(cudaMalloc((void **)&(gpu_reads_h[i]), (READS_LENGTH + 1) * sizeof(char))); 
    } 
    for(i=0; i<inputDim; i++) { 
     HANDLE_ERROR(cudaMemcpy(gpu_reads_h[i], reads[i], sizeof(char) * (READS_LENGTH + 1), cudaMemcpyHostToDevice)); 
    } 

    HANDLE_ERROR(cudaMemcpy(gpu_reads, gpu_reads_h, inputDim * sizeof(char *), cudaMemcpyHostToDevice); 

т.е. построить копию возможного массива устройства указателей в хоста памяти, а затем скопировать его на устройство.

+0

Я пробовал этот код, но у меня такая же «неизвестная ошибка» ... Я также попытался выделить с помощью '(READS_LENGTH * inputDim)' like said @Drop, но он не работает либо – Cordaz

+0

@Cordaz: Если вы получив эту ошибку, у вас возникла другая проблема, не связанная с распределением и копированием памяти, например, с неработающей установкой CUDA или с предыдущим сломанным кодом, который вы нам не показали. [Здесь] (http://pastebin.com/VRy871fd) является полным примером из вашего фрагмента кода, который отлично работает для меня. Попробуйте это для себя – talonmies

+0

Я пробовал свой код, и я получаю ту же ошибку ... Я установил CUDA 7.5 o Ubuntu 16.04. Я попытался запустить его с 'sudo', и он вернулся строку: ' Modprobe: FATAL: Модуль-УВМ NVIDIA не найден в каталоге/Библиотека/модули/4.4.0-22-generic' Я уже пытался установите этот пакет, но после перезагрузки система запустилась в графическом режиме _low_, и мне пришлось восстановить предыдущий драйвер Nvidia ... – Cordaz

Смежные вопросы