magma_dpotrf_gpu выдает ошибку сегментации

#cuda #lapack #magma #cblas

#cuda #lapack #magma #cblas

Вопрос:

У меня есть код cblas и lapack, который я пытаюсь «преобразовать» в код magma, чтобы использовать преимущества графического процессора. Это мой код процессора, который работает нормально:

 cblas_dsyrk(CblasColMajor,CblasUpper,CblasTrans,n,m,1.0,A2,m, 0.0,C_theta,n);
cblas_dsyrk(CblasColMajor,CblasUpper,CblasTrans,n,m,1.0,A1,m,-1.0,C_theta,n);
clapack_dpotrf(CblasColMajor,CblasUpper,n,C_theta,n);
  

Теперь, для версии magma GPU, я сделал это:

 magma_dmalloc(amp;d_A1, m*n);
magma_dmalloc(amp;d_A2, m*n);
magma_dmalloc(amp;d_C_theta, n*n);

magma_dsetmatrix(m ,n, A1, m, d_A1, m, queue);
magma_dsetmatrix(m ,n, A2, m, d_A2, m, queue);
magma_dsetmatrix(n ,n, C_theta, n, d_C_theta, n, queue);

magma_dsyrk(MagmaUpper, MagmaTrans, n, m, 1.0, d_A2, m, 0.0, d_C_theta, n, queue);
magma_dsyrk(MagmaUpper, MagmaTrans, n, m, 1.0, d_A1, m, -1.0, d_C_theta, n, queue);
magma_int_t *info_potrf; 
magma_dpotrf_gpu(MagmaUpper, n, d_C_theta, n, info_potrf);
  

И по какой-то причине последняя строка выдает ошибку сегментации. Что я здесь делаю не так? Все кажется правильным.

Комментарии:

1. вам необходимо иметь выделение памяти, поддерживающее этот info_potrf указатель. Вместо этого сделайте magma_int_t info_potrf; (т.Е. Удалите звездочку) и в последней строке измените info_potrf на amp;info_potrf

2. Спасибо @RobertCrovella! Теперь я понял это. Я пришел сюда, чтобы ответить на свой вопрос, и увидел ваш ответ. Это именно так! Я беспокоился о том, что что-то может быть не так в dsyrk, и проблема была намного проще. Большое спасибо, Роберт!

3. @thejoker: пожалуйста, ответьте на это самостоятельно, чтобы он мог выйти из очереди без ответа

4. Сделано @talonmies. Спасибо!

Ответ №1:

На решение ответил @RobertCrovella.

Звездочку необходимо удалить, чтобы выделить память для info_potrf переменной, а во второй строке amp; необходимо добавить, чтобы использовать адрес переменной. Это правильный путь:

 magma_int_t info_potrf; 
magma_dpotrf_gpu(MagmaUpper, n, d_C_theta, n, amp;info_potrf);
  

Комментарии:

1. Это не ответ. Пожалуйста, объясните, что вы сделали для решения проблемы. Тогда я с радостью поддержу его

2. Это исправлено @talonmies

3. Спасибо. Это гораздо полезнее