표준 매트릭스 곱셈 알고리즘의 효율성을 어떻게 향상시킬 수 있습니까? 이 방법에 관련된표준 행렬 곱셈 알고리즘의 효율성 향상?
주요 작업은 다음과 같습니다 C[i][j]+=A[i][p]*B[p][j]
?
표준 매트릭스 곱셈 알고리즘의 효율성을 어떻게 향상시킬 수 있습니까? 이 방법에 관련된표준 행렬 곱셈 알고리즘의 효율성 향상?
주요 작업은 다음과 같습니다 C[i][j]+=A[i][p]*B[p][j]
?
는 특히 인텔이 자신의 MKL here을 제공, AMD는이 자신의 ACML here과 (오픈 소스)도있다 고토 BLAS here.
(조밀 한) 행렬 - 행렬 곱셈 커널은 ?GEMM
호출이됩니다. 여기서 ?
은 부동 소수점 유형을 나타냅니다. 예를 들어 DGEMM
은 double
루틴을 호출합니다.
낮은 수준의 최적화로 무엇을하고 있는지 잘 알지 못하는 한이 라이브러리는 아마도 직접 코딩 할 수있는 것보다 우수한 성능을 제공 할 것입니다. 당신이 자신을이 코딩에서 이동을 할 경우
당신은 다음 고려할 수 있습니다 :
SSE, SSE2..4
명령어가 널리 지원되며, 일부 최신 버전 CPU
은 AVX
명령어도 지원합니다.고성능 구현 :
이 참조하면 사물의 현재 상태의 아이디어를 줄 수 있습니다.
희망이 도움이됩니다.
+1 행렬이 작 으면 DGEMM은 일반적인 목적으로 사용하기 위해 문자 인수를 검사하는 데 많은 시간을 소모 할 수 있음을 발견했습니다. 그래서 작은 행렬에 대해서 나는 평범한 손으로 코딩 된 방법으로 그것을 수행함으로써 많은 양의 실행 시간을 절약했다. 때로는 완전히 풀려났다. –
이 정확한 질문을 다루는 Golub and Van Loan의 1 장을 읽는 것이 좋습니다.
이러한 방법을 사용한다고해서 성능이 향상되는 것은 아닙니다. 상당한 속도 향상을 위해 많은 튜닝이 필요합니다. 주제에 대한 저널 기사의 부족이 없도록 행렬을 빠르게 곱하는 방법을 알아내는 데 많은 돈이 소요됩니다.
여러 행렬 곱셈 - M1 x M2 x ... x Mn -과 관련하여 동적 프로그래밍을 기반으로하는 또 다른 최적화 기술이 있습니다. 이는 다른 볼 게임의 일종입니다. 이것은 두 개의 행렬을 곱하는 효율성을 향상시키는 데는 적용되지 않는다는 점에 유의하십시오. 그러나 3 개 이상의 행렬을 한 쌍으로 곱하면 더 높은 수준에서 최적화 할 수 있습니다. 그냥 정보를 완성하기 위해이 답변을 힙에 던질 것이라고 생각했습니다.
가글쎄, 매트릭스의 크기에 따라 목록에있는 표준 알고리즘보다 약간 더 빠른 Strassen's Algorithm이 있습니다. 물론 even faster algorithms이 있지만 구현하기가 쉽지 않습니다.
표준 알고리즘은 O이다 (N은^3) 쉬트 라쎈의 ALGO은 O (N^2.8) 이고 카퍼 - Winograd은 O (N^2.3)
@xtremer이다 : 행렬의 종류는? 광장? 거의 사각형인가요? 힘의 측면? 키 크고 마른가? 부족한? – Mehrdad