CUDA программа выдает ошибку утечки памяти - PullRequest
0 голосов
/ 15 августа 2011

Я не понимаю, почему приведенный ниже простой код не работает при c [0] = d

void test(char **a){
char **c;
cudaMemcpy(c,a, sizeof(char*), cudaMemcpyDeviceToHost);
char temp[2];
for(int i  = 0 ; i< 2; i++){
        temp[i ] = temp[i] & 0 ;
}
char *d;
cudaMalloc((void**)&d, 2*sizeof(char));
cudaMemcpy(d, temp, 2 * sizeof(char), cudaMemcpyHostToDevice);
c[0] = d;


}
void main(){

     char **a ;
    cudaMalloc((void**)&a, sizeof( char*));
    test(a);
}

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Вы забыли выделить память для char **c. Следовательно, в строке, вызывающей ошибку, c является «мертвым указателем», т. Е. Либо равным NULL, либо ссылается на раздел памяти, который не принадлежит вашей программе. Другими словами, c указывает на пустой нераспределенный массив из C-строк. Адресация элемента c[0] (предположительно, первая строка в массиве, которая не существует) является недопустимой и приводит к ошибке сегментации, поскольку вы пытаетесь записать что-то (значение d) в местоположение, которое вы не владею.

Решение состоит в том, чтобы выделить память перед записью в c[0]:

c = new char *; //or "c = new char [5]"  if you want it to hold more strings
c[0] = d;

Помните, как вы вызывали CudaMalloc () для выделения памяти на GPU для переменных a и d? Вы просто должны сделать то же самое для c, но в основном ОЗУ (т.е. на хосте)

Надеюсь, это поможет.

0 голосов
/ 16 августа 2011

Во-первых, из кода не совсем понятно, что вы пытаетесь сделать, поэтому, возможно, добавление этого в Q поможет. Во-вторых, что именно такое сообщение об ошибке вы получаете от компилятора?

Что касается ошибки, возможно, компилятору не нравится, когда вы пытаетесь получить доступ к c с использованием [], поскольку он не был объявлен как массив. Я знаю, что в принципе это должно работать, но попробуйте использовать *c = d. Это помогает?

P.s. Лично я всегда использую номенклатуру devFoo для любых указателей на память устройства, поэтому я не путаюсь, в более крупном проекте легко потерять отслеживание того, указывают ли a, b или c на хост или память устройства.

...