cblas_dgemm – 仅在(beta)为2的幂时起作用

我完全难过了。 我有一个用c编写的相当大的递归程序,它调用cblas_dgemm()。 结果由正常工作的程序独立validation。

C = alpha*A*B + beta*C 

在使用随机矩阵和所有可能的参数组合的重复测试中,程序仅在abs(beta)= 2 ^ n(1,2,4,8 ..)时给出正确的答案。 任何值都适用于alpha。 β的任何其他正/负,奇数/偶数值在10-30%的时间内给出正确的答案。

我正在使用Ubuntu 10.04,GCC 4.4.x,我已经尝试过系统安装的blas / cblas / atlas以及手动编译的图集。

任何提示或建议将不胜感激。 我对在这个网站潜伏的非常慷慨(和聪明)的人感到惊讶。

提前感谢你们,

拉斯

两个完全不相关的错误共同产生了一个虚幻的画面。 它让我在错误的地方寻找问题。

(1)调用dgemm的函数的逻辑有一个简单的错误。 如果我没有追逐错误的问题,本来很容易修复。

(2)我的双重比较函数:AlmostEqual2sComplement()的双版本( http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm )使用了不正确大小的整数 – 在某些罕见情况下导致错误的TRUE 。 这是第一次错误咬我!

再次感谢您在尝试调试程序时使用科学方法的有用建议。

拉斯

是的,一个完整的例子会很方便。 这是我使用GSL的sgemm变体sgemm一个旧例子; 应该很容易修复到double 。 请尝试查看是否给出了GSL手册中显示的结果:

 /* from the gsl info documentation in node 'gsl cblas examples' */ /* compile via 'gcc -o $file $file.c -lgslcblas' */ /* edd 15 Nov 2003 */ #include  #include  int main (void) { int lda = 3; float A[] = { 0.11, 0.12, 0.13, 0.21, 0.22, 0.23 }; int ldb = 2; float B[] = { 1011, 1012, 1021, 1022, 1031, 1032 }; int ldc = 2; float C[] = { 0.00, 0.00, 0.00, 0.00 }; /* Compute C = AB */ cblas_sgemm (CblasRowMajor, CblasNoTrans, CblasNoTrans, 2, 2, 3, 1.0, A, lda, B, ldb, 0.0, C, ldc); printf ("[ %g, %g\n", C[0], C[1]); printf (" %g, %g ]\n", C[2], C[3]); return 0; }