2007/08/20

솔라리스에서 성능 향상을 위한 컴파일

솔라리스에서는 다양한 형태의 성능 개선 방안이 있습니다.
사실 컴퓨팅 환경에서는 너무나 많다보니, 일일히 언급하기도 어렵습니다만,
일반적으로 간과되는 것 중 하나는 애플리케이션을 개발할때 사용했던 시스템
과 컴파일러와의 조함입니다.

솔라리스는 새버젼에서 조차 옛버젼에 대한 이진 화일 호환을 유지하다 보니,
구형 플랫폼을 위해서 컴파일된 이진 화일을 그대로 새 플랫폼으로 가져와서
(복사해서) 실행해도 전혀 문제가 없다 보니 간혹 새 플랫폼에 맞추어 컴파일
되어 있지 않은 경우가 왕왕 있습니다.

만약, 기존에 사용하던 플랫폼이 U-II 400Mhz를 가지고 있던 E450 장비였는
데, 32비트 애플리케이션을 개발해서 사용했다면, 기존에 개발된 애플리케이
션은 SparcV8+에 디폴트로 최적화 되었을 수 있습니다. 컴파일시 특별한 지정
이 업스면 32비트이면서 썬의 가장 최후 32비트 머신에 최적화된 구조로 컴파
일합니다.

그러나, 이후 CPU가 발전함과 동시에 이에 맞추어 최적화할 수 있도록 컴파일
러도 발전되었으므로, 구형 플랫폼에 솔라리스를 버젼업 했거나, 새로운 플랫
폼으로 완전히 이전하는 경우에, 하드웨어를 위한 최적의 튜닝을 원한다면 새
로 컴파일하는 것도 매우 훌륭한 방법이라고 할 수 있습니다.

현재 내가 가지고 있는 이진 화일의 속성을 알기 위해서는 다음과 같이 명령
을 내립니다.

$file /usr/sfw/bin/gs
> file /usr/sfw/bin/gs
/usr/sfw/bin/gs: ELF 32-bit MSB executable SPARC Version 1,
dynamically linked, stripped

위의 gs는 별 최적화 없이 32비트 구형 머쉰을 위한 구조로 컴파일되어 있음
을 알 수 있습니다. 만약 컴파일시 최적화 옵션을 제공했으면 달라지게 됩니다.

> file `which xine`
.../bin/xine: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+
Required, UltraSPARC1 Extensions Required, dynamically linked, not stripped

위의 명령어는 32비트 머쉰중 가장 최신 기종인 SPARC32+ V1을 모델로 컴파일
되어 있으며, UltraSPARC 1 extensions을 사용한다는 것을 알 수가 있습니
다. 따라서, 컴파일시 어떤 최적화 컴파일을 제공했느냐에 따라서 성능에 차
이를 가져올 수 있으며, 이러한 차이는 '캐쉬'의 영향을 많이 받는 애플리케
이션과 '수학'과 '멀티미디어' 라이브러리를 사용하는 애플리케이션에서 두
드러진 차이를 보입니다.

따라서, 새로운 솔라리스 10에서 컴파일을 다시 해야 하는 경우, 사용하는 컴
파일에 따라서 다음과 같은 컴파일 옵션으로 시도해는 것은 상당히 가치있는
일입니다.

SunStudio 12 를 사용하는 경우
$cc -fast a.c

참고로 -fast는 다음과 같은 옵션의 매크로입니다.
-fns
-fsimple=2
-fsingle
-nofstore (x86)
-xalias_level=basic
-xbuiltin=%all
-xdepend
-xlibmil
-xlibmopt
-xmemalign=8s (SPARC)
-xO5
-xprefetch=auto,explicit (SPARC)
-xregs=no%frameptr (x86)
-xtarget=native

만약, -fast 옵션에 의해 임의의 리덕션이 수행되어서, 수행시 비정상 종료되
는 일이 발생한다면 최적화 레벨을 낮추어서 컴파일을 시도해볼 필요가 있습
니다. -fast의 옵션중 유효한 것만 재조합해서 테스트해보는 것도 중요합니다.

$cc -xO3 -xtarget=native a.c

만약, 수학 함수를 사용하는 경우에는 UltraSPARC의 VIS 인스트럭션과 강력한
썬의 수학 라이브러리를 사용하는 것을 시도해보는 것도 좋은 방법입니다.

$cc -xO3 -xtarget=native -xvis a.c -I/opt/SUNWspro/lib -lsunmath

gcc로 컴파일하는 경우에는 대개 머쉰 컴파일 옵션(-m)으로 최적화를 우선적
으로 시도해볼 수가 있습니다.
$gcc -mcpu=v9 a.c
$gcc -mtune=v9 a.c ; Sun compiler와는 달리 -mcpu, -mtune은 64비트 이진
화일 생성을 유도하지 않습니다.

gcc에서 빠른 수학 연산 및 멀티미디어 연산을 위해서는 다음과 같은 옵션을
사용해 볼 수 있습니다.

$gcc -ffast-math -mcpu=v9 -mvis a.c -I/opt/SUNWspro/lib -lsunmath

컴파일시 이렇게 튜닝한 애플리케이션은 특정 CPU 인스트럭션(특히, vis)를
사용할 수 있도록 되어 있을 수 있으며 이 경우에는 대상 이진 화일을 카피해
서 사용하는 플랫폼에도 해당 인스트럭션을 지원하는 CPU를 가지고 있어야만
합니다.

위의 예는 sparc 시스템을 예로 들었으며, 두 경우 모두 x86 플랫폼용 솔라리
스에서는 약간 다를 수 있습니다. -fast 옵션은 두 플랫폼 모두 공통이나 vis
옵션(-xvis, -mvis)이나 CPU 구조 옵션(-mcpu=v9)은 x86/amd64의 경우 먹지
않으므로 적용되지 않습니다.

김봉환/