2012-11-29 2 views
1

int의 두 행렬에 대해 빠른 행렬 곱셈을 수행하기 위해 cblas_sgemm을 사용하려고합니다.cblas_sgemm에 ints의 입력 행렬이 모두 0을 반환합니다.

지금은 모두 0을 반환합니다.

예상되는 출력 데이터를 두 번 확인하기 위해 빠른 순진 행렬 곱하기를 실행했으며 그 값은 0이 아닌 것으로 가정합니다.

본래의 접근법은 작업 :

typedef int mm_data_t; 

void func1(mm_data_t *in1, mm_data_t *in2, mm_data_t *out, int N){ 
    int i, j, k; 

    for(i=0; i<N; i++){ 
     for(k=0; k<N; k++){ 
      int temp = in1[i*N+k]; 
      for(j=0; j<N; j++){ 
       out[i*N+j] += temp * in2[k*N+j]; 
      } 
     } 
    } 
} 

을 그리고 cblas_sgemm를 사용 : 나는 최적화를위한 한 차원 배열을 사용하고

void func2(mm_data_t *in1, mm_data_t *in2, mm_data_t *out, int N){ 

    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N, N, N, 1.0, (float*)in1, N, (float*)in2, N, 0.0, (float*)out, N); 

} 

.

입력 데이터는 검정 상자이지만 일정합니다.

답변

0

cblas_sgemm()은 정수가 아닌 부동 소수점 값의 행렬을 곱하도록 설계되었습니다.

정수가 부동 소수점 값으로 해석됩니다. 작은 양의 정수는 subnormal numbers으로 처리 될 수 있습니다. 이들 쌍을 곱하면 결과는 0이됩니다. 따라서 입력 값이 모두 음수가 아닌 작은 정수이면 결과는 모두 0입니다.

그리고 당신의 입력이 작은 음의 정수를 포함하는 경우, 귀하의 출력은 아마 매우 큰 정수 모양을 NaN의 많은, 포함 (긍정적 또는 부정적 일 수 있음을.)

당신이 정말로 곱해야하는 경우 부동 소수점에서 &으로 변환하거나 정수 행렬을 곱할 수있는 라이브러리를 사용해야합니다 (BLAS는 할 수 없습니다).