двойное освобождение или коррупция (выход) на ipiv magma_getrs_gpu - PullRequest
0 голосов
/ 02 мая 2019

У меня есть следующий код:

magma_int_t *h_ipiv;
magma_imalloc_cpu( &h_ipiv,  k);

for (i=0;i<k;i++){
    h_ipiv[i] = i;
}
magma_dgemm(MagmaTrans, MagmaNoTrans, N, n, m, 1.0, d_G2, m, d_A2, m, 0.0, d_QA, N, queue);

magma_dgemm(MagmaTrans, MagmaNoTrans, N, n, m, 1.0, d_G1, m, d_A1, m, -1.0, d_QA, N, queue);

magma_int_t info_getrs;
magma_dgetrs_gpu(MagmaTrans, Ngaps, n, d_M, N, h_ipiv, d_QA, N, &info_getrs);

В последней строке я получаю сообщение об ошибке double free or corruption (out): 0x000000001dd18540. Я проверил массивы из magma_dgemm, и они кажутся правильными. Размеры также являются правильными, потому что у меня был этот код на версии процессора Lapack, и они были одинаковыми. Таким образом, ошибка, кажется, на h_ipiv, но я понятия не имею, что не так с h_ipiv.

Есть идеи?

1 Ответ

0 голосов
/ 03 мая 2019

Я наконец нашел решение.В отличие от lapack, в магме, чтобы создать ipiv для dgetrs_gpu, мы должны использовать раньше dgetrf_gpu.

Так что решение заключается в добавлении следующих строк перед функцией dgetrs_gpu:

magma_int_t info_getrf;
magma_dgetrf_gpu(Ngaps, Ngaps, d_M, Ngaps, h_ipiv, &info_getrf);
...