2016-07-02 2 views
3

Fortran BLAS gemm 함수를 사용하여 행렬 곱셈을 수행하려고합니다. 자세한 내용은 here을 참조하십시오.C- 연속 행렬의 Fortran gemm 함수

이 함수의 서명은 위의 링크에서 모든 매개 변수의 의미를 찾을 수 있습니다.

call sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc) 

내 문제는 내가 대신 포트란 연속 사람의 C-연속 배열을 사용하려면, 나는 몹시 혼란 여전히 꽤 동안 위 sgemm와 함께 놀았 던 점이다.

몇 가지 구체적인 예를 살펴 보겠습니다.

모든 입력 배열은 C 연속입니다.

a = [[0,1], 
    [2,3]] 
b = [[0,1,2], 
    [3,4,5]] 
# pre-alloc memory for c 
c = [[0,0,0], 
    [0,0,0]] 

# compute c = a * b, which should be as follows 
# c = [[3,4,5], 
#  [9,14,19]] 

# since sgemm assumes Fortran-contiguous, so I thought it would be 
sgemm('T', 'T', 2, 3, 2, 1.0, a, 2, b, 3, 0, c, 2) 
     ~~~~~~~ ~~~~~~~   ~~~ ~~~  ~~~ 
    trans both m,n,k   lda ldb  ldc 

# HOWEVER, c is not what I expected, 
c = [[3,9,4], 
    [14,5,19]] 

분명히 sgemm은이 문제를 해결하는 방법으로 포트란 인접 순서로 요소를 저장합니까? 또한 나는 그 방법이 매우 이해가 안되는 가 결정되는 경우 transa/transb='T' or 'N', 당신이 나에게 상세한 설명을 줄 수 있기를 바랍니다.

참고

내가 의미 scipy.linalg.cython_blas에서 내 보낸이 gemm 기능을 사용하고, 내가 대신 포트란 주문 물건을 재생 다른 선택의 여지가 없다.

답변

2

포트란 스타일 col-major 대신 행 메이저 매트릭스를 사용하려면 CBLAS API gemm을 사용할 수 있습니다. 첫 번째 매개 변수를 사용하여 행렬 저장 레이아웃을 선택할 수 있습니다.


https://software.intel.com/en-us/node/520775 또는 당신은 아직도 포트란 API를 사용할 수 있습니다. 행렬 레이아웃 변경은 행렬 전치와 동일합니다. 그러나 잘못 배치 된 C를 잘못 계산하고 있습니다.

귀하의 코드는 C에서 col-major를 계산하지만 행 - 전공에 C가 필요합니다. 따라서 행렬에서 C와 동등한 Fortran API로 col-major로 C^T를 계산해야합니다.

C^T = B^T * A^T 

은 기본적으로 당신이 A와 B, 및 해당 매개 변수를 교환 할 필요가 있어야한다. 이러한 매개 변수에 대한 자세한 내용은이 답변을 참조하십시오.

Transpose matrix multiplication in cuBLAS howto

+0

나는 C^T = B^T의 * A를^T''당신의 관점을 가지고,하지만 난이'M, N, k는, LDA는, LDB는, ldc'이 있어야 할 것을 몹시 혼란 스러워요 내가 transa를 사용하면 transb = 'T'또는 'N'? – avocado

+0

@loganecolss 링크를 추가했습니다. – kangshiyin

+0

네, 확실히'numpy.dot'에 대해서 알고 있습니다 만,'C' 배열을 다루고 있기 때문에 Cython과 저수준 젬을 사용합니다. – avocado