【问题标题】:double free or corruption (out) on ipiv magma_getrs_gpuipiv magma_getrs_gpu 上的双重释放或损坏(输出)
【发布时间】:2019-09-21 09:16:44
【问题描述】:

我有以下代码:

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 的数组,它们似乎是正确的。尺寸也是正确的,因为我在 cpu lapack 版本上有这个代码,它们是一样的。所以错误似乎在h_ipiv 上,但我不知道h_ipiv 有什么问题。

有什么想法吗?

【问题讨论】:

  • 为什么你在h_ipiv 的长度为k 的元素上做一个malloc,而k 在你对magma_dgetrs_gpu 的调用中没有出现在任何地方? h_ipiv 的长度的预期值是 Ngaps,与 used in the 2nd parametermagma_dgetrs_gpu 调用的 Ngaps 相同。如果k Ngaps,那可能就是问题所在。您应该在矩阵中的每一行都有一个枢轴条目。
  • 嗨@RobertCrovella,感谢您的回答。这里没有写,但 k 与 Ngaps 的值相同。所以这不是问题。

标签: c++ lapack magma


【解决方案1】:

我终于找到了解决办法。与 lapack 不同,在岩浆中,要为 dgetrs_gpu 创建 ipiv,我们必须在 dgetrf_gpu 之前使用。

所以解决方案只是在函数 dgetrs_gpu 之前添加以下行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多