cblas_dgemm-仅当(beta)为2的幂时有效

cblas_dgemm-仅当(beta)为2的幂时有效,c,blas,C,Blas,我完全被难住了。我有一个用c编写的相当大的递归程序,它调用cblas_ggemm()。结果由正确运行的程序独立验证 C = alpha*A*B + beta*C 在使用随机矩阵和所有可能参数组合的重复测试中,只有当abs(β)=2^n(1,2,4,8..)时,程序才能给出正确答案。任何值都适用于alpha。β的任何其他正/负、奇数/偶数值在10-30%的时间内给出正确答案 我使用的是Ubuntu10.04,GCC4.4.x,我试过系统安装blas/cblas/atlas以及手动编译的atla

我完全被难住了。我有一个用c编写的相当大的递归程序,它调用cblas_ggemm()。结果由正确运行的程序独立验证

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

我使用的是Ubuntu10.04,GCC4.4.x,我试过系统安装blas/cblas/atlas以及手动编译的atlas

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

提前感谢大家,


Russ

是的,一个完整的例子会很方便。这里有一个我使用GSL的
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 <stdio.h>      
#include <gsl/gsl_cblas.h> 

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 = A B */ 
  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;    
}          
/*来自节点“gsl cblas示例”中的gsl信息文档*/
/*通过“gcc-o$file$file.c-lgslcblas”编译*/
/*edd 2003年11月15日*/
#包括
#包括
int
主(空)
{     
int-lda=3;
浮动A[]={0.11,0.12,0.13,
0.21, 0.22, 0.23 };  
int-ldb=2;
浮点数B[]={1011011,1012,
1021, 1022,                                                      
1031, 1032 }; 
int ldc=2;
浮点数C[]={0.00,0.00,
0.00, 0.00 };     
/*计算C=ab*/
cblas_sgemm(CBLASROWMARY,
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]);
返回0;
}          

两个完全无关的错误合谋产生了一幅虚幻的画面。这让我在错误的地方寻找问题

(1) 调用dgemm的函数的逻辑中有一个简单错误。如果我没有追查错误的问题,问题很容易解决

(2) 我的双重比较函数:AlmostQual2SComplete()的双重版本使用了大小不正确的整数-在某些罕见的情况下导致不正确的TRUE。这是我第一次犯错误

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


Russ

您能提供您称之为cblas_dgemm的确切代码吗?另外,您是否尝试直接调用fortran例程DGEMM?我不记得以前在使用dgemm时遇到过问题……当我发布问题时,我意识到我需要确保直接调用cblas_dgemm()正确工作。因此,我尝试了一个类似您的示例,当直接调用dgemm(使用相同的include/link指令)时确实没有问题。这排除了blas/cblas链接错误等问题。这使得情况更加奇怪。调用gemm的函数选择各种参数(转置/lda/beta等)。好了,这些都被正确地挑选出来了-适用于测试版(0,1,2,4,8..)。我将设法进一步孤立这个问题。将发布结果。谢谢有时候,向别人展示你的问题会让你发现解决方案。