![]() ![]() ![]() |
제목 | [가마수트라] 고속 크로스 플랫폼 SIMD 벡터 라이브러리 설계 | ||||||
---|---|---|---|---|---|---|---|
분류 | 게임 | 등록일 | 10.06.18 | ||||
출처 | 한국콘텐츠진흥원 | 조회수 | 0
|
||||
※ 본 아티클은 CMP MEDIA LLC 와의 라이선스 계약에 의해 국문으로 제공됩니다.
고속 크로스 플랫폼 SIMD 벡터 라이브러리 설계 (Designing Fast Cross-Platform SIMD Vector Libraries)
구스타브 올리베이라(Gustavo Oliveira) 가마수트라 등록일(2010. 1. 20.)
http://www.gamasutra.com/view/feature/4248/designing_fast_crossplatform_simd_.php
도입
대부분의 3D 애플리케이션 내부에는 벡터 산술, 논리 회로, 비교, 교차 프로덕트 등 과 같은 루틴 계산을 수행하기 위한 벡터 라이브러리가 있다. 이런 형태의 라이브러리를 설계하는 데에는 수없이 많은 방법이 있지만, 개발자들은 종종 벡터 라이브러리가 가능한 가장 빠른 방법으로 이러한 계산을 수행할 수 있는 핵심 요소들을 간과한다. 2004년 말경, “벡터 수학”을 의미하는 VMath로 명명된 벡터 라이브러리 코드 개발직에 임명되었다. VMath의 주요 목적은 가장 빠르고 다른 플랫폼을 쉽게 가로지르는 휴대용이었다. 2009년 놀랍게도, 컴파일러 기술이 크게 변하지는 않았다. 실제로, 이 시기에 나의 연구 결인 본 기사에서 제시한 결과는 약간의 예외는 있지만, 내가 5년 전에 Vmath를 작업했던 때와 거의 동일하다.
“가장 빠른” 라이브러리
이 기사는 대부분 C++로 씌어져 주로 실행에 초점이 맞춰져 있기 때문에, 때로 가장 빠른 라이브러리를 규정하는 오류를 범할 수 있다. 따라서, 여기에서 설명하고 있는 가장 빠른 라이브러리는 동일한 설정을 이용하여 동일한 코드를 컴파일할 때 다른 라이브러리와 비교할 경우 가장 작은 어셈블리 코드를 생성시키는 것이다 (과정의 해제 모드 가정). 이것은 가장 빠른 라이브러리가 동일하게 정확한 계산을 실행하기 위한 더 적은 도구를 만들기 때문이다. 즉, 다르게 표현하자면, 가장 빠른 라이브러리는 최소한으로 코드를 팽창시키는 것이다.
SIMD 명령
현대의 프로세서 주위의 단일 명령 다중 데이터 처리 (SIMD)의 광범위한 전개로 벡터 라이브러리 개발의 업무는 더욱 쉬워지게 되었다. SIMD 연산은 정확하게 FPU 등록기의 FPU 연산처럼 SIMD 레지스터를 작동시킨다. 하지만, 장점은 SIMD 레지스터는 통상 쿼드 워드, 즉, 각각 32 비트짜리 4개의 “floats”나 “ints”는 128비트 너비이다. 이는 개발자들이 단일 명령으로 4D 벡터 계산의 실행을 가능하게 한다. 이것 때문에, 벡터 라이브러리가 가질 수 있는 최상의 특징은 그 안에서 SIMD 명령을 이용하는 것이다. 그럼에도 불구하고, SIMD 명령을 가지고 수행할 때, 여러분은 라이브러리가 코드를 팽창시킬 수 있는 일반적인 오류를 경계해야 한다. 사실, SIMD 벡터 라이브러리의 코드 팽창은 단순하게 FPU 명령을 사용하는 것이 더 나을 수 있다는 점에서 철저할 수 있다.
벡터 라이브러리 인터페이스
벡터 라이브러리의 고수준 인터페이스를 설계할 때 SIMD 명령에 대하여 가장 좋은 방법으로 말할 수 있는 것은 내인자의 활용에 의한 것이다. 이들은 SIMD 명령을 가지고 프로세서를 목표로하는 대부분의 컴파일러로부터 이용 가능하다. 또한, 각 내인자는 단일 SIMD 명령으로 번역한다. 하지만 직접적으로 어셈블리를 기록하는 대신 내인자를 이용하는 장점은 컴파일러가 일정계획과 표식 최적화의 실행을 가능하게 하는 것이다. 이는 코드 팽창을 상당하게 최소화시킬 수 있다. 아래는 내인자의 예이다:
1. 값에 의한 결과 복귀 내인자 인터페이스의 관찰을 통하여, 벡터 라이브러리는 실행을 극대화할 수 있는 인터페이스를 모방해야 한다. 따라서, 여러분은 다음과 같이 참조가 아니라 값에 의하여 결과를 복귀시켜야 한다:
한편으로 참조에 의하여 데이터를 복귀시킨다면, 인터페이스는 코드 팽창을 생성시킬 것이다. 아래는 부정확한 버전이다:
여러분이 값에 의하여 데이터를 복귀시켜야 하는 이유는 쿼드 워드 (128 비트)는 하나의 SIMD 레지스터 내부에 잘 맞기 때문이다. 그리고, 벡터 라이브러리의 주요 요소 중 하나는 가능한 많이 이들 레지스터내부에 데이터를 유지하는 것이다. 그렇게 함으로써, SIMD 레지스터로부터 메모리나 FPU 레지스터까지 불필요한 하중과 저장 연산을 피할 수 있다. 다중 벡터 연산을 결합시킬 때, “값에 의한 반환” 인터페이스는 FPU나 메모리 이송에 대하여 SIMD를 최소화시킴으로써 이 적재와 기억장치의 최적화를 가능하게 한다...(중략)
* 자세한 내용은 첨부(PDF)화일을 참고하시기 바랍니다.
|
|||||||
첨부파일 |