【问题标题】:MKL CBlas errorMKL CBlas 错误
【发布时间】:2011-06-02 09:59:40
【问题描述】:

我尝试使用英特尔 MKL 提供的 cblas 将两个矩阵 A 和 B 的乘积转换为 C。 是否有任何原因导致错误?

double * A, *B, *C;

A = (double *) calloc(20 * 200, sizeof (double));
B = (double *) calloc(200 * 200, sizeof (double));
C = (double *) calloc(20 * 200, sizeof (double));

cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, 
     20, 200, 200,
     1.0, A, 20,
     B, 200,
     0.0, C, 20);

【问题讨论】:

  • 有错误吗?如果有,是什么?
  • 什么样的错误?汇编?运行? “错误”的结果?
  • 程序通过“进程意外终止”自行终止。但是,当我将 20 替换为 2 并将 200 替换为 3 时。程序运行良好;没有错误。
  • 我只是得到“分段错误”。
  • 这段代码对我来说看起来是正确的,即使在 valgrind 上运行它也不会给我任何错误。我怀疑问题出在其他地方。

标签: c matrix blas


【解决方案1】:

仔细检查 cblas_dgemm 的所有参数。如果您有错误,则该函数可能正在读取超出数组范围的内容。对于不会触发故障的小尺寸,因为坏地址仍将位于单个内存页面中。 (但数学会出错,你应该检查一下。)但是一个 200x200 的矩阵是 2.5 兆字节的数据,传递错误的大小肯定会触发 segfault。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多