我有一個使用cblas的sgemm函數的問題。Cblas_sgemm產生錯誤的結果
下面是代碼:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cblas.h>
#define MATRIX_DIM 5
int main(){
float *a_mat = calloc(MATRIX_DIM*MATRIX_DIM, sizeof(float));
float *b_mat = calloc(MATRIX_DIM, sizeof(float));
float *c_mat = calloc(MATRIX_DIM, sizeof(float));
int i,j;
for(i=0; i<MATRIX_DIM*MATRIX_DIM; i++) {
a_mat[i] = 1.0f;
b_mat[i] = 1.0f;
c_mat[i] = 0.0f;
}
cblas_sgemm(CblasRowMajor, CblasNoTrans,
CblasNoTrans, MATRIX_DIM, MATRIX_DIM,
MATRIX_DIM, 1.0, a_mat,
MATRIX_DIM, b_mat, MATRIX_DIM,
1.0, c_mat, MATRIX_DIM);
//RESULT PRINTING
printf("Printing A MATRIX: \n");
for(i=0; i<MATRIX_DIM; i++) {
for(j=0; j<MATRIX_DIM; j++){
printf("%0.1f ", a_mat[i*MATRIX_DIM+j]);
}
printf("\n");
}
printf("Printing B MATRIX: \n");
for(i=0; i<MATRIX_DIM; i++) {
for(j=0; j<MATRIX_DIM; j++){
printf("%0.1f ", b_mat[i*MATRIX_DIM+j]);
}
printf("\n");
}
printf("\nPrinting the Results: \n");
for(i=0; i<MATRIX_DIM;i++){
for(j=0; j<MATRIX_DIM; j++){
printf("%0.1f ", c_mat[i*MATRIX_DIM+j]);
}
printf("\n");
}
free(a_mat);
free(b_mat);
free(c_mat);
return 0;
}
我相當一些我把是錯誤的觀點,但我真的不知道是哪個。結果應該是填充5.0的5x5矩陣。相反,程序與此迴應:
6.0 6.0 6.0 16.0 86.0
6.0 6.0 6.0 16.0 86.0
16.0 36.0 6.0 46.0 86.0
16.0 36.0 5.0 45.0 85.0
20.0 80.0 5.0 45.0 85.0
我知道rowmajor訂單或轉置參數可能是錯誤的,以後我會弄清楚的,但是在這個特殊的乘法答案應該是5.0兩種方式。
嗯...你不應該爲'sizeof(float)'調用''calloc'嗎? sizeof(* a_mat)'甚至有效嗎?而且你的結果不應該是長度爲5的*向量*,所有元素等於5?並且不應該將結果寫入矢量*'c_mat'中?你怎麼沒有得到任何segfaults? –
@AndrasDeak好吧,你可能對'sizeof(float)'部分是正確的,但由於某種原因,它的工作原理就好了。不過,我會改變它。由於它是矩陣 - 矩陣乘法,所以結果應該是M×N的矩陣(M是第一個矩陣的行,N是第二個矩陣的列),在這種情況下它將是一個5×5矩陣。我想你是指矩陣向量乘法。 – kmentis
我在哪裏可以看到第二個矩陣有5列? 'float * b_mat = calloc(MATRIX_DIM,sizeof(* b_mat));'只是分配的一列值。因此,我驚訝的是,你稍後不會收到段錯誤。一種可能性就是'sizeof(* a_mat)'(不管那是什麼)比'float'有更大的空間。而你的問題正是它*不*工作正常:) –