1

私は完全に困惑しています。私はcblas_dgemm()を呼び出すcで書かれたかなり大きな再帰プログラムを持っています。結果は、正しく動作するプログラムによって個別に検証されます。

C = alpha*A*B + beta*C 

ランダム行列と可能なすべてのパラメーターの組み合わせを使用した繰り返しテストでは、abs(beta)= 2 ^ n(1,2,4,8 ..)の場合にのみ、プログラムは正解を返します。任意の値がアルファに対して機能します。ベータのその他の正/負、奇数/偶数の値は、10〜30%の確率で正解を示します。

Ubuntu 10.04、GCC4.4.xを使用しています。システムにインストールされたblas/cblas / atlasと、手動でコンパイルされたatlasを試しました。

ヒントや提案をいただければ幸いです。私はこのサイトに潜んでいる素晴らしく寛大な(そして賢い)人々に驚いています。

よろしくお願いします。

ラス

4

2 に答える 2

2

まったく関係のない 2 つのエラーが共謀して、幻想的なイメージを生み出しました。間違った場所で問題を探すようになりました。

(1) dgemm を呼び出す関数のロジックに単純なエラーがありました。間違った問題を追っていなければ、簡単に修正できたでしょう。

(2) 私の double-compare 関数: 倍精度バージョンのAlmostEqual2sComplement() ( http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm ) は、不正なサイズの整数を使用しました - 特定のまれな状況下で不正な TRUE をもたらします. エラーが私を襲ったのはこれが初めてでした!

プログラムをデバッグしようとするときに科学的方法を使用するという有用な提案をありがとう。

ラス

于 2010-09-20T01:00:43.477 に答える
1

はい、完全な例が便利です。sgemmこれは、GSLのバリアントを使用してぶらぶらしていた古い例です。に簡単に修正できるはず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;    
}          
于 2010-09-19T22:33:59.697 に答える