プロが教えるわが家の防犯対策術!

今、BLASを使って行列ベクトル積を計算するのにどれくらい時間がかかるか計測しようとしています。
しかし、短いプログラムにも関わらずC用インターフェースのスレッド並列版BLASを呼び出す部分でFloating point exceptionエラーが出てしまいます。
なぜエラーが出るのか全く分からないので、どなたか分かる方ご意見いただけないでしょうか?



#define SEED 1
#define N 100

/*
extern void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy);
*/

int main( int argc, char *argv[] ){
 char TRANS = 'T';
 int INC = 1;
 double ALPHA = 1.0;
 double BETA = 0.0;

 int i, j, n1, n2;
 double **matrix;
 double *vector;
 double *result;
 double start_time;
 double end_time;

 fprintf( stdout, "____performance evaluation start____\n" );
 srand(SEED);

 matrix = Malloc2DDouble( N, N );
 vector = (double *) malloc ( sizeof(double) * N );
 result = (double *) malloc ( sizeof(double) * N );

 n1 = N; n2 = N;

 #pragma omp parallel
 {
  #pragma omp for private(j)
  for( i=0; i<n1; i++ ){
   for( j=0; j<n2; j++ ){
    matrix[i][j] = ( ( rand() / (double)RAND_MAX ) - 0.5 );
   }
   vector[i] = ( ( rand() / (double)RAND_MAX ) - 0.5 );
   result[i] = 0.0;
  }
 }

 start_time = GetTime();

 dgemv( TRANS, n2, n1, ALPHA, matrix[0], n2, vector, INC, BETA, result, INC );

 end_time = GetTime();

 return EXIT_SUCCESS;
}

A 回答 (1件)

とりあえず Malloc2DDouble ってなに?

この回答への補足

すみません、書き忘れてました
他所で定義した二次元配列の動的メモリ確保用の関数です

a = (double **) malloc ( sizeof(double *) * N );
a[0] = (double *) malloc ( sizeof(double) * N * N );
for( i=1; i<N; i++ ){
a[i] = a[i-1] + N;
}

だと思ってください
GetTimeは時間の取得です

補足日時:2012/07/05 12:17
    • good
    • 0
この回答へのお礼

追記になりますが、acmlのライブラリを使ってます
つまり、インクルードは以下の通りです

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<sys/time.h>
#include<sys/resource.h>
#include"acml.h"
#include"omp.h"

お礼日時:2012/07/05 12:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!