좋은 출발점은 Robert A. van de Geijn과 Enrique S. Quintana-Ortí 의 훌륭한 책 The Science of Programming Matrix Computations 입니다. 그들은 무료 다운로드 버전을 제공합니다.
BLAS는 세 가지 수준으로 나뉩니다.
수준 1은 벡터에서만 작동하는 선형 대수 함수 집합을 정의합니다. 이러한 함수는 벡터화 (예 : SSE 사용)의 이점을 얻습니다.
레벨 2 함수는 행렬-벡터 연산입니다 (예 : 일부 행렬-벡터 곱). 이러한 기능은 Level1 기능으로 구현할 수 있습니다. 그러나 공유 메모리와 함께 일부 다중 프로세서 아키텍처를 사용하는 전용 구현을 제공 할 수 있다면이 함수의 성능을 높일 수 있습니다.
레벨 3 함수는 행렬-행렬 곱과 같은 연산입니다. 다시 레벨 2 기능으로 구현할 수 있습니다. 그러나 Level3 함수는 O (N ^ 2) 데이터에 대해 O (N ^ 3) 연산을 수행합니다. 따라서 플랫폼에 캐시 계층이있는 경우 캐시 최적화 / 캐시 친화적 인 전용 구현을 제공하면 성능을 높일 수 있습니다 . 이것은 책에 잘 설명되어 있습니다. Level3 기능의 주요 향상은 캐시 최적화에서 비롯됩니다. 이 향상은 병렬 처리 및 기타 하드웨어 최적화로 인한 두 번째 향상을 훨씬 능가합니다.
그건 그렇고, 고성능 BLAS 구현의 대부분 (또는 전부)은 Fortran에서 구현되지 않습니다. ATLAS는 C로 구현됩니다. GotoBLAS / OpenBLAS는 C로 구현되고 성능에 중요한 부분은 Assembler에서 구현됩니다. BLAS의 참조 구현 만 Fortran에서 구현됩니다. 그러나 이러한 모든 BLAS 구현은 LAPACK에 연결할 수있는 Fortran 인터페이스를 제공합니다 (LAPACK은 BLAS에서 모든 성능을 얻음).
최적화 된 컴파일러는이 점에서 사소한 역할을합니다 (GotoBLAS / OpenBLAS의 경우 컴파일러는 전혀 중요하지 않습니다).
IMHO no BLAS 구현은 Coppersmith–Winograd 알고리즘 또는 Strassen 알고리즘과 같은 알고리즘을 사용합니다. 나는 그 이유에 대해 정확히 확신하지 못하지만 이것은 내 추측입니다.
- 이러한 알고리즘의 캐시 최적화 구현을 제공하는 것이 불가능할 수도 있습니다 (즉, 이길 것보다 더 많이 느슨해 질 것입니다).
- 이러한 알고리즘은 수치 적으로 안정적이지 않습니다. BLAS는 LAPACK의 계산 커널이기 때문에 이것이 불가능합니다.
편집 / 업데이트 :
이 주제에 대한 새롭고 획기적인 논문은 BLIS 논문 입니다. 그들은 매우 잘 쓰여졌습니다. "고성능 컴퓨팅을위한 소프트웨어 기초"강의에서 나는 그들의 논문에 따라 매트릭스 매트릭스 제품을 구현했습니다. 사실 저는 매트릭스 매트릭스 제품의 여러 변형을 구현했습니다. 가장 단순한 변형은 전적으로 일반 C로 작성되었으며 450 줄 미만의 코드가 있습니다. 다른 모든 변형은 루프를 최적화 할뿐입니다.
for (l=0; l<MR*NR; ++l) {
AB[l] = 0;
}
for (l=0; l<kc; ++l) {
for (j=0; j<NR; ++j) {
for (i=0; i<MR; ++i) {
AB[i+j*MR] += A[i]*B[j];
}
}
A += MR;
B += NR;
}
매트릭스 매트릭스 제품의 전반적인 성능은 이러한 루프 에만 의존합니다. 약 99.9 %의 시간이 여기에서 소비됩니다. 다른 변형에서는 성능을 향상시키기 위해 내장 함수와 어셈블러 코드를 사용했습니다. 여기에서 모든 변형을 다루는 자습서를 볼 수 있습니다.
ulmBLAS : GEMM (Matrix-Matrix 제품)에 대한 자습서
BLIS 문서와 함께 인텔 MKL과 같은 라이브러리가 이러한 성능을 얻을 수있는 방법을 이해하는 것은 상당히 쉽습니다. 그리고 행 또는 열 주요 스토리지를 사용하는지 여부가 왜 중요하지 않습니다!
최종 벤치 마크는 다음과 같습니다 (프로젝트 ulmBLAS라고 함).
ulmBLAS, BLIS, MKL, openBLAS 및 Eigen에 대한 벤치 마크
다른 편집 / 업데이트 :
또한 선형 방정식 시스템을 푸는 것과 같은 수치 선형 대수 문제에 BLAS를 사용하는 방법에 대한 자습서를 작성했습니다.
고성능 LU 분해
(이 LU 분해는 예를 들어 Matlab에서 선형 방정식 시스템을 해결하는 데 사용됩니다.)
PLASMA 에서와 같이 확장 성이 뛰어난 LU 분해의 병렬 구현을 실현하는 방법을 설명하고 시연하기 위해 자습서를 확장 할 시간을 찾고 싶습니다 .
자, 시작합니다 : 캐시 최적화 병렬 LU 분해 코딩
추신 : 또한 uBLAS의 성능을 개선하기위한 몇 가지 실험을했습니다. 실제로 uBLAS의 성능을 높이는 것은 매우 간단합니다 (예, 단어로 재생 :)).
uBLAS에 대한 실험 .
여기에 BLAZE 와 유사한 프로젝트가 있습니다 .
BLAZE에 대한 실험 .