我完全难过了。 我有一个用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()的双版本( )使用了不正确大小的整数 – 在某些罕见情况下导致错误的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, %gn", C[0], C[1]); printf (" %g, %g ]n", C[2], C[3]); return 0; }
以上就是c/c++开发分享cblas_dgemm – 仅在(beta)为2的幂时起作用相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522844.html