BLAS

**BLAS**(Basic Linear Algebra Subprograms, 기본 선형대수 서브프로그램)은 벡터 덧셈, 스칼라배, 스칼라곱, 선형 결합, 행렬 곱셈과 같은 일반적인 선형대수학 연산을 수행하기 위한 저수준 루틴 세트를 규정하는 시방서이다. 이것들은 선형대수 라이브러리를 위한 데 팍토 표준 저수준 루틴이며, 이 루틴들은 C("CBLAS 인터페이스") 및 포트란("BLAS 인터페이스") 모두에 대한 바인딩을 가지고 있다. BLAS 시방서가 일반적이지만, BLAS 구현은 특정 머신에서 속도를 위해 최적화되어 있어 이를 사용하면 상당한 성능 이점을 얻을 수 있다. BLAS 구현은 벡터 레지스터 또는 SIMD 명령어와 같은 특수 부동 소수점 하드웨어를 활용한다.

BLAS는 1979년에 포트란 라이브러리로 시작되었으며 그 인터페이스는 BLAS 기술(BLAST) 포럼에 의해 표준화되었으며, 최신 BLAS 보고서는 넷립 웹사이트에서 찾을 수 있다. 이 포트란 라이브러리는 참조 구현(때로는 혼동되게 BLAS 라이브러리라고도 함)으로 알려져 있으며 속도를 위해 최적화되지는 않았지만 퍼블릭 도메인이다.

선형대수 루틴을 제공하는 대부분의 라이브러리는 BLAS 인터페이스를 준수하여 라이브러리 사용자가 사용되는 BLAS 라이브러리에 구애받지 않는 프로그램을 개발할 수 있도록 한다.

다양한 하드웨어 플랫폼을 목표로 하는 많은 BLAS 라이브러리가 개발되었다. 예를 들어 cuBLAS(엔비디아 GPU, GPGPU), rocBLAS(AMD GPU), OpenBLAS 등이 있다. CPU 기반 BLAS 라이브러리 브랜치의 예는 OpenBLAS, BLIS (BLAS와 유사한 라이브러리 인스턴스화 소프트웨어), Arm 퍼포먼스 라이브러리, ATLAS, 인텔 수학 커널 라이브러리(iMKL)가 있다. AMD는 AMD 플랫폼에 최적화된 BLIS 포크를 유지한다. ATLAS는 임의의 아키텍처에 자동으로 최적화되는 이식 가능한 라이브러리이다. iMKL은 x86 및 x86-64에 최적화된 프리웨어 및 독점 벤더 라이브러리로, 인텔 프로세서의 성능에 중점을 둔다. OpenBLAS는 인기 있는 많은 아키텍처에 대해 수동으로 최적화된 오픈 소스 라이브러리이다. LINPACK 벤치마크는 성능 측정을 위해 BLAS 루틴 `[[General Matrix Multiply|gemm]]`에 크게 의존한다.

많은 수치 소프트웨어 응용 프로그램은 LAPACK, LINPACK, 아르마딜로, GNU 옥타브, 매스매티카, 매트랩, NumPy, R, 줄리아, 리스프-스탯을 포함하여 BLAS 호환 라이브러리를 사용하여 선형대수 계산을 수행한다.

## 배경
수치 프로그래밍의 등장으로 정교한 서브루틴 라이브러리가 유용해졌다. 이러한 라이브러리에는 근 찾기, 행렬 역행렬 계산, 연립 방정식 해결과 같은 일반적인 고수준 수학 연산을 위한 서브루틴이 포함되었다. 선택된 언어는 포트란이었다. 가장 대표적인 수치 프로그래밍 라이브러리는 IBM의 과학 서브루틴 패키지(SSP)였다. 이러한 서브루틴 라이브러리는 프로그래머가 특정 문제에 집중하고 잘 알려진 알고리즘을 다시 구현하는 것을 피할 수 있도록 했다. 라이브러리 루틴은 또한 일반적인 구현보다 나았다. 예를 들어, 행렬 알고리즘은 더 나은 수치 정확도를 얻기 위해 전체 피벗팅을 사용할 수 있었다. 라이브러리 루틴은 또한 더 효율적인 루틴을 가졌다. 예를 들어, 라이브러리는 상삼각 행렬을 해결하는 프로그램을 포함할 수 있었다. 라이브러리는 일부 알고리즘의 단정밀도 및 배정밀도 버전을 포함했다.

초기에는 이러한 서브루틴들이 저수준 연산을 위해 하드코딩된 루프를 사용했다. 예를 들어, 서브루틴이 행렬 곱셈을 수행해야 한다면, 서브루틴은 세 개의 중첩 루프를 가졌다. 선형대수학 프로그램은 많은 공통적인 저수준 연산(이른바 "커널" 연산으로, 운영체제와는 관련이 없다)을 가지고 있다. 1973년에서 1977년 사이에 이러한 커널 연산 중 몇 가지가 식별되었다. 이러한 커널 연산은 수학 라이브러리가 호출할 수 있는 정의된 서브루틴이 되었다. 커널 호출은 하드코딩된 루프에 비해 장점이 있었다: 라이브러리 루틴이 더 읽기 쉬워지고, 버그 발생 가능성이 줄어들며, 커널 구현이 속도에 최적화될 수 있었다. 스칼라 및 벡터를 사용하는 이러한 커널 연산에 대한 시방서인 레벨-1 기본 선형대수 서브루틴(BLAS)은 1979년에 발표되었다. BLAS는 선형대수 서브루틴 라이브러리 LINPACK을 구현하는 데 사용되었다.

BLAS 추상화는 고성능을 위한 맞춤화를 허용한다. 예를 들어, LINPACK은 수정 없이 다양한 머신에서 사용할 수 있는 범용 라이브러리이다. LINPACK은 BLAS의 일반 버전을 사용할 수 있다. 성능을 높이기 위해 다른 머신은 BLAS의 맞춤형 버전을 사용할 수 있다. 컴퓨터 아키텍처가 더욱 정교해지면서 벡터 프로세서가 등장했다. 벡터 머신용 BLAS는 머신의 빠른 벡터 연산을 사용할 수 있었다. (벡터 프로세서는 결국 인기를 잃었지만, 현대 CPU의 벡터 명령어는 BLAS 루틴에서 최적의 성능을 위해 필수적이다.)

다른 기계 기능도 사용 가능하게 되었고 활용될 수 있었다. 따라서 1984년부터 1986년까지 BLAS는 벡터-행렬 연산과 관련된 레벨-2 커널 연산으로 확장되었다. 메모리 계층 구조도 활용될 수 있는 것으로 인식되었다. 많은 컴퓨터에는 주 메모리보다 훨씬 빠른 캐시 메모리가 있다. 행렬 조작을 지역화하면 캐시 사용을 개선할 수 있다. 1987년과 1988년에 행렬-행렬 연산을 수행하는 레벨 3 BLAS가 식별되었다. 레벨 3 BLAS는 블록 분할 알고리즘을 장려했다. LAPACK 라이브러리는 레벨 3 BLAS를 사용한다.

원래 BLAS는 밀집하게 저장된 벡터와 행렬만을 다루었다. 성긴 행렬과 같은 BLAS에 대한 추가 확장이 다루어졌다.

## 기능
BLAS 기능은 "레벨"이라고 불리는 세 가지 루틴 집합으로 분류된다. 이는 정의 및 발행의 연대기적 순서와 알고리즘 복잡성의 다항식 차수에 모두 해당한다. 레벨 1 BLAS 연산은 일반적으로 선형 시간 이 걸리고, 레벨 2 연산은 이차 시간이, 레벨 3 연산은 삼차 시간이 걸린다. 최신 BLAS 구현은 일반적으로 세 가지 레벨을 모두 제공한다.

### 레벨 1
이 레벨은 BLAS의 원본 발표(1979)에 설명된 모든 루틴으로 구성된다. 이 루틴은 스트라이드 배열에 대한 벡터 연산만 정의했다: 스칼라곱, 벡터 노름, 일반화된 벡터 덧셈 (형식:

:\boldsymbol{y} \leftarrow \alpha \boldsymbol{x} + \boldsymbol{y}

("`axpy`", 즉 "a 곱하기 x 더하기 y"라고 불림) 및 기타 여러 연산.

### 레벨 2
이 레벨은 일반화된 행렬-벡터 곱셈(`gemv`)을 포함하는 행렬-벡터 연산을 포함한다:

:\boldsymbol{y} \leftarrow \alpha \boldsymbol{A} \boldsymbol{x} + \beta \boldsymbol{y}

뿐만 아니라 선형 방정식

:\boldsymbol{T} \boldsymbol{x} = \boldsymbol{y}

에서 에 대한 해법도 포함한다. 여기서 는 삼각 행렬이다. 레벨 2 BLAS의 설계는 1984년에 시작되어 1988년에 결과가 발표되었다. 레벨 2 서브루틴은 특히 벡터 프로세서에서 BLAS를 사용하는 프로그램의 성능을 향상시키는 것을 목표로 한다. 레벨 1 BLAS는 "컴파일러로부터 연산의 행렬-벡터 특성을 숨기기" 때문에 최적이 아니다.

### 레벨 3
1990년에 공식적으로 발표된 이 레벨은 다음 형태의 "일반 행렬 곱셈"(`gemm`)을 포함한 행렬-행렬 연산을 포함한다.

:\boldsymbol{C} \leftarrow \alpha \boldsymbol{A} \boldsymbol{B} + \beta \boldsymbol{C},

여기서 와 는 루틴 내부에서 선택적으로 전치 행렬되거나 에르미트 켤레될 수 있으며, 세 행렬 모두 스트라이드될 수 있다. 일반적인 행렬 곱셈 는 를 1로 설정하고 를 적절한 크기의 모든 0 행렬로 설정하여 수행할 수 있다.

레벨 3에는 다음을 계산하는 루틴도 포함된다.

:\boldsymbol{B} \leftarrow \alpha \boldsymbol{T}^{-1} \boldsymbol{B},

여기서 는 삼각행렬이며, 다른 기능도 포함된다.

많은 과학 응용 프로그램에서 행렬 곱셈이 보편적으로 사용되고, 나머지 레벨 3 BLAS의 구현에도 포함되며, 행렬-벡터 곱셈의 명백한 반복을 넘어 더 빠른 알고리즘이 존재하기 때문에 `gemm`은 BLAS 구현자의 최적화의 주요 대상이다. 예를 들어,  또는  중 하나 또는 둘 모두를 블록 행렬로 분해하여 `gemm`은 재귀적으로 구현할 수 있다. 이는  매개변수를 포함하는 동기 중 하나이므로 이전 블록의 결과를 누적할 수 있다. 이 분해는 의 특수 사례를 필요로 하며, 많은 구현에서 이를 최적화하여 의 각 값에 대한 곱셈을 하나씩 제거한다. 이 분해는 곱셈에 사용되는 데이터의 공간과 시간 모두에서 더 나은 참조 국부성을 허용한다. 이는 다시 시스템의 캐시를 활용한다. 캐시 수준이 두 개 이상인 시스템의 경우, 블록을 계산에 사용하는 순서에 두 번째로 차단(blocking)을 적용할 수 있다. 이러한 최적화 수준은 ATLAS와 같은 구현에서 사용된다. 최근에는 고토 가즈시게의 구현이 L2 캐시에만 블록킹을 적용하고, TLB 미스를 줄이기 위해 연속 메모리로 복사하는 것을 신중하게 분할 상환하는 것이 ATLAS보다 우수하다는 것을 보여주었다. 이러한 아이디어를 기반으로 한 고도로 튜닝된 구현은 고토BLAS, OpenBLAS 및 BLIS의 일부이다.

의 일반적인 변형은 으로, "기존의 네 번의 실수 행렬 곱셈과 두 번의 실수 행렬 덧셈 대신 세 번의 실수 행렬 곱셈과 다섯 번의 실수 행렬 덧셈"을 사용하여 복소 곱을 계산하는 알고리즘이다. 이는 슈트라센 알고리즘과 유사하며 피터 운가르가 처음 설명했다.

## 구현
; Accelerate: 애플의 macOS 및 iOS용 프레임워크로, 튜닝된 BLAS 및 LAPACK 버전이 포함되어 있다.
; Arm Performance Libraries: Arm Performance Libraries는 Arm 64비트 AArch64 기반 프로세서를 지원하며 Arm에서 사용할 수 있다.
; ATLAS: 자동 튜닝 선형 대수 소프트웨어는 C 및 포트란 77용 BLAS API의 오픈 소스 구현이다.
; BLIS: 빠른 인스턴스화를 위한 BLAS와 유사한 라이브러리 인스턴스화 소프트웨어 프레임워크. 대부분의 최신 CPU에 최적화되어 있다. BLIS는 특정 플랫폼에 작성되어야 하는 코드의 양을 줄이는 고토BLAS의 완전한 리팩토링이다.
; C++ AMP BLAS: C++ AMP BLAS 라이브러리는 비주얼 C++용 마이크로소프트 AMP 언어 확장을 위한 BLAS의 오픈 소스 구현이다.
; cuBLAS: 엔비디아 기반 GPU 카드에 최적화된 BLAS로, 추가 라이브러리 호출이 거의 필요 없다.
; NVBLAS: 엔비디아 기반 GPU 카드에 최적화된 BLAS로, 레벨 3 기능만 제공하지만 다른 BLAS 라이브러리에 대한 직접적인 드롭인 대체품으로 사용될 수 있다.
; clBLAS: AMD의 OpenCL 기반 BLAS 구현. AMD 컴퓨트 라이브러리의 일부이다.
; clBLAST: 대부분의 BLAS API에 대해 튜닝된 OpenCL 구현이다.
; Eigen BLAS: MPL 라이선스 Eigen 라이브러리 위에 구현된 포트란 77 및 C BLAS 라이브러리로, x86, x86-64, ARM (NEON), 파워PC 아키텍처를 지원한다.
; ESSL: IBM의 엔지니어링 및 과학 서브루틴 라이브러리로, AIX 및 리눅스에서 파워PC 아키텍처를 지원한다.
; 고토BLAS: 고토 가즈시게의 BSD 라이선스 BLAS 구현으로, 특히 인텔 네할렘/아톰, 비아 나노프로세서, AMD 옵테론에 최적화되어 있다.
; GNU 사이언티픽 라이브러리: 많은 수치 루틴의 멀티플랫폼 구현. CBLAS 인터페이스를 포함한다.
; HP MLIB: HP의 수학 라이브러리로, HP-UX 및 리눅스에서 IA-64, PA-RISC, x86 및 옵테론 아키텍처를 지원한다.
; 인텔 MKL: 인텔 수학 커널 라이브러리로, x86 32비트 및 64비트를 지원하며 인텔에서 무료로 제공한다. 펜티엄, 코어 및 인텔 제온 CPU와 인텔 제온 파이에 대한 최적화를 포함하며, 리눅스, 윈도우 및 macOS를 지원한다.
; MathKeisan: NEC의 수학 라이브러리로, SUPER-UX에서 NEC SX 아키텍처를, 리눅스에서 아이테니엄을 지원한다.
; 넷립 BLAS: 넷립의 공식 참조 구현으로, 포트란 77로 작성되었다.
; 넷립 CBLAS: BLAS에 대한 참조 C 인터페이스. C에서 포트란 BLAS를 호출하는 것도 가능하며 (인기가 많다).
; OpenBLAS: 고토BLAS를 기반으로 최적화된 BLAS로, x86, x86-64, MIPS 및 ARM 프로세서를 지원한다.
; PDLIB/SX: NEC의 NEC SX-4 시스템용 공용 도메인 수학 라이브러리.
; rocBLAS: ROCm을 통해 AMD GPU에서 실행되는 구현.
;SCSL
: SGI의 과학 컴퓨팅 소프트웨어 라이브러리에는 SGI의 이릭스 워크스테이션용 BLAS 및 LAPACK 구현이 포함되어 있다.
; Sun Performance Library: 솔라리스 8, 9, 10 및 리눅스에서 SPARC, 코어 및 AMD64 아키텍처에 최적화된 BLAS 및 LAPACK.
; uBLAS: BLAS 기능을 제공하는 일반 C++ 템플릿 클래스 라이브러리. 부스트 라이브러리의 일부이다. 통일된 표기법으로 많은 하드웨어 가속 라이브러리에 대한 바인딩을 제공한다. 또한 uBLAS는 고급 C++ 기능을 사용하여 알고리즘의 정확성에 중점을 둔다.

### BLAS를 사용하는 라이브러리

; 아르마딜로: 아르마딜로는 속도와 사용 편의성 사이의 균형을 잘 맞추는 것을 목표로 하는 C++ 선형대수 라이브러리이다. 템플릿 클래스를 사용하며, BLAS/ATLAS 및 LAPACK에 대한 선택적 링크를 제공한다. NICTA(호주)의 후원을 받으며 무료 라이선스로 배포된다.
; LAPACK: LAPACK은 BLAS를 기반으로 구축된 고수준 선형대수 라이브러리이다. BLAS와 마찬가지로 참조 구현이 존재하지만 libFlame 및 MKL과 같은 많은 대안이 있다.
; Mir: D로 작성된 과학 및 기계 학습을 위한 LLVM 가속 일반 수치 라이브러리. 일반 선형 대수 서브프로그램(GLAS)을 제공한다. CBLAS 구현을 기반으로 구축할 수 있다.

## 유사 라이브러리 (BLAS와 호환되지 않음)

; Elemental: Elemental은 분산 메모리 조밀 및 희소-직접 선형 대수 및 최적화를 위한 오픈 소스 소프트웨어이다.
; HASEM: 선형 방정식을 풀고 고윳값을 계산할 수 있는 C++ 템플릿 라이브러리이다. BSD 라이선스로 배포된다.
; LAMA: 가속 수학 응용 프로그램 라이브러리(LAMA)는 분산 메모리 시스템에서 다양한 종류의 하드웨어(예: CUDA 또는 OpenCL을 통한 GPU)를 대상으로 하는 수치 솔버를 작성하기 위한 C++ 템플릿 라이브러리로, 프로그램 개발자에게 하드웨어별 프로그래밍을 숨긴다.
; MTL4: 매트릭스 템플릿 라이브러리 버전 4는 희소 및 밀집 BLAS 기능을 제공하는 일반 C++ 템플릿 라이브러리이다. MTL4는 직관적인 인터페이스(매트랩과 유사)와 제네릭 프로그래밍 덕분에 폭넓은 적용 가능성을 제공한다.

## 희소 BLAS
라이브러리 역사 동안 성긴 행렬을 처리하기 위한 BLAS의 몇 가지 확장이 제안되었다. 2002년에 작은 성긴 행렬 커널 루틴 세트가 마침내 표준화되었다.

## 배치 BLAS
기존 BLAS 함수는 GPU와 같이 대규모 병렬 처리를 지원하는 아키텍처에도 이식되었다. 여기서 기존 BLAS 함수는 일반적으로 대규모 행렬에 대해 좋은 성능을 제공한다. 그러나 GEMM 루틴을 사용하여 많은 작은 행렬의 행렬-행렬 곱을 계산할 때는 이러한 아키텍처에서 상당한 성능 손실을 보인다. 이 문제를 해결하기 위해 2017년에 BLAS 함수의 배치 버전이 지정되었다.

위의 GEMM 루틴을 예로 들면, 배치 버전은 많은 행렬에 대해 다음 계산을 동시에 수행한다:

\boldsymbol{C}[k] \leftarrow \alpha \boldsymbol{A}[k] \boldsymbol{B}[k] + \beta \boldsymbol{C}[k] \quad  \forall k 

대괄호 안의 인덱스 k는 스택의 모든 행렬 k에 대해 연산이 수행됨을 나타낸다. 종종 이 연산은 모든 행렬이 배열 A, B, C에 연결되어 있는 스트라이드 배치 메모리 레이아웃에 대해 구현된다.

배치 BLAS 함수는 다목적 도구가 될 수 있으며, 예를 들어 많은 시간 단계를 가진 긴 통합 기간을 처리하는 지수 적분기 및 매그너스 적분기의 빠른 구현을 허용한다. 여기서 계산적으로 비싼 부분인 행렬 지수 함수는 배치 BLAS 함수를 사용하여 모든 시간 단계에 대해 병렬로 구현할 수 있다.

## 같이 보기
* 수치 라이브러리 목록
* 수학 커널 라이브러리, 인텔 아키텍처에 최적화된 수학 라이브러리; BLAS, LAPACK 포함
* 수치선형대수학, BLAS가 해결하는 문제 유형

## 각주

## 더 읽어보기
* 
* 
* 
* J. J. Dongarra, J. Du Croz, S. Hammarling, and R. J. Hanson, Algorithm 656: An extended set of FORTRAN Basic Linear Algebra Subprograms, ACM Trans. Math. Softw., 14 (1988), pp.&nbsp;18&ndash;32.
* J. J. Dongarra, J. Du Croz, I. S. Duff, and S. Hammarling, A set of Level 3 Basic Linear Algebra Subprograms, ACM Trans. Math. Softw., 16 (1990), pp.&nbsp;1&ndash;17.
* J. J. Dongarra, J. Du Croz, I. S. Duff, and S. Hammarling, Algorithm 679: A set of Level 3 Basic Linear Algebra Subprograms, ACM Trans. Math. Softw., 16 (1990), pp.&nbsp;18&ndash;28.
; New BLAS
* L. S. Blackford, J. Demmel, J. Dongarra, I. Duff, S. Hammarling, G. Henry, M. Heroux, L. Kaufman, A. Lumsdaine, A. Petitet, R. Pozo, K. Remington, R. C. Whaley, An Updated Set of Basic Linear Algebra Subprograms (BLAS), ACM Trans. Math. Softw., 28-2 (2002), pp.&nbsp;135&ndash;151.
* J. Dongarra, Basic Linear Algebra Subprograms Technical Forum Standard, International Journal of High Performance Applications and Supercomputing, 16(1) (2002), pp.&nbsp;1&ndash;111, and International Journal of High Performance Applications and Supercomputing, 16(2) (2002), pp.&nbsp;115&ndash;199.

## 외부 링크
* BLAS 홈페이지 Netlib.org
* BLAS FAQ
* LAPACK 사용자 가이드의 BLAS 빠른 참조 가이드
* 로슨 구술 역사 BLAS의 원작자 중 한 명인 찰스 L. 로슨이 구술 역사 인터뷰에서 BLAS의 생성에 대해 논의한다. 찰스 L. 로슨 구술 역사 인터뷰, 토머스 헤이그, 2004년 11월 6일, 7일, 캘리포니아 샌 클레멘테. 산업 및 응용 수학회, 필라델피아, PA.
* 동가라 구술 역사 구술 역사 인터뷰에서 잭 동가라는 BLAS와 LINPACK의 초기 관계, 새로운 아키텍처를 위한 고수준 BLAS 버전 생성, 그리고 특정 기계에 BLAS를 자동 최적화하기 위한 ATLAS 시스템에 대한 후기 작업에 대해 설명한다. 잭 동가라, 구술 역사 인터뷰, 토머스 헤이그, 2005년 4월 26일, 테네시 대학교, 녹스빌 TN. 산업 및 응용 수학회, 필라델피아, PA
* BLAS는 어떻게 그렇게 극단적인 성능을 내는가? 순진한 1000×1000 행렬 곱셈 10개(10^10 부동 소수점 곱셈-덧셈)는 2.6 GHz 프로세서에서 15.77초가 걸리지만, BLAS 구현은 1.32초가 걸린다.
* An Overview of the Sparse Basic Linear Algebra Subprograms: The New Standard from the BLAS Technical Forum 

분류:수치선형대수학
분류:수치 해석 소프트웨어