FLOPS (FLoating point OPeration per Second, 플롭스) 는 초당 부동소수전 연산 횟수라는 뜻으로, 컴퓨터의 성능을 평가하는 가장 대표적인 지표입니다.
슈퍼컴퓨팅 등에서는 절대적인 성능 지표이고, 개인용 컴퓨터에 있어서도 (플롭스가 체감성능으로 이어지는 것은 아니지만) 성능 평가에 있어서 참고가 됩니다.

부동소수점은 실수를 표시할 때, 소수점을 고정하지 않고, 소수점의 위치를 따로 표기하는 방식으로 복잡한 연산이 필요한 슈퍼컴퓨팅 등에 기본적으로 쓰이는 방식입니다.
전체 비트는 부호를 나타내는 sign bit, 소수점의 위치에 대한 정보인 지수부분(exponent), 유효숫자를 표시하는 가수부분(fraction/mantissa) 으로 구성되어 있습니다.

가장 널리쓰이는 표준은 IEEE 754 로
32비트 단정밀도(32bit single-precision),
64비트 배정밀도(64bit double-precision),
43 비트 이상의 확장단정도(거의 쓰이지 않음),
79 비트 이상의 확장배정도(일반적으로 80비트로 구현됨)에 대한 형식을 정의하고 있고,
32비트 단정밀도 만이 필수적으로 구현되어야하고 나머지는 옵션입니다.


일반적으로 말하는 FLOPS 성능은 32비트 단정밀도 기준이며, 배정밀도의 경우 따로 배정밀도라는 표기를 해줍니다.
드물게나마 16비트 반정밀도(16bit half-presicion) 을 표기하는 경우도 있는데 옛날 자료인 경우가 많고, 기준이 무엇인지 표기하지 않는 경우가 대부분이라서 상당히 짜증납니다.
(사람 헷갈리게 ㅡㅡ^)
최근에는 연산의 정밀도를 향상시키기위해서인지 배정밀도 성능도 상당히 중요시되고 있는듯.

그래픽카드를 통한 연산 기술을 GPGPU(General-Purpose computing on Graphics Processing Units) 라고하는데, 전통적인 방식인 CPU 를 통한 연산과 비교해서 장단점이 있습니다.

그래픽 연산이 주 목적이기때문에 구조적으로 부동소수점 연산에 특화되어 있으며, 병렬화(멀티코어화)가 쉽기때문에 높은 플롭스 성능을 얻을 수 있습니다.
단점은 GPU 구조에 적합한 연산이 제한적이고, 프로그래밍이 어렵다는 것.
데이터 크기가 클수록, 병렬도가 높을수록, 데이터간 의존도가 낮을수록 GPGPU에 적합한 연산이지만,
일반 유저들의 컴퓨터 이용에서 이런 경우는 극히 드물다고 봐야겠지요.

근본이 그래픽 연산을 위한 장치인 GPU가 범용 프로그램 연산을 하기위해서는 몇 가지 조건이 필요합니다.
크게보면 쉐이더 모델과 각 픽셀의 자료형(비트수)인데, 중구난방이던 GPU 스펙들이 공통적으로 이 조건을 충족시키기 시작한 것이 DirectX 10 의 등장, 지원 GPU의 출시입니다.
즉, 본격적으로 GPU의 플롭스 성능이 의미를 갖게되는건 통합쉐이더 방식의 GPU가 등장하면서부터라고 보면 됩니다.

배경 지식은 이 정도로 하고, 본론으로 넘어가지요.

각 GPU의 스펙을 파악해, 플롭스 성능을 계산해보겠습니다.
이번 편은 AMD GPU 를 다루고, 다음 편에서 Nvidia GPU 를 다루겠습니다.


(1) R600 계열
VLIW5 아키텍처.
HD2000, HD3000 계열에 사용.
32비트 단정밀도 지원.
64비트 배정밀도 지원. (HD3800 계열만 지원.)


(이하의 이런 류의 일러스트는 모두 後藤 弘茂(Hiroshige Goto)씨 출처입니다.)

스트림 프로세서는 위와 같은 4+1 구조를 단위로 합니다.
4개는 32비트 FP MAD 를 지원합니다.
1개는 sin, cos 등의 특수 함수를 연산하며, 32비트 FP MAD 도 가능합니다.

MAD 는 Multiply-Add 로 한 사이클에 덧셈과 곱셈을 한다는 것.
즉, 2 OPerations/cycle 입니다.

각 스트림 프로세서는 단정밀도 기준으로 2 OP/cycle 입니다.
HD2000 계열의 최상위 제품인 HD2900XT 는 320개의 스트림 프로세서를 갖고 있고, 코어 클럭은 743MHz 입니다.
플롭스를 계산해보면,
2 OP/cycle x 320개 x 0.743GHz = 475.52 GFLOPS
약 476 GFLOPS 가 나옵니다.

물론 이 수치는 이론적인 최대치이기때문에 실성능은 이보다 낮게 나옵니다.


(위 이미지는 RV770 의 이미지인데, 기본적인 컨셉이 같아서 썼습니다.
RV670, RV680 이 FMAD 인지 MAD인지 정보가 없어서 같다고 확신할 수 없지만, 플롭스 성능 계산에는 관계가 없는 부분.)

배정밀도 지원이 추가된 것 말고는 기본적인 구조는 이전과 같습니다.
FMAD 는 Fused Multiply-Add 인데, MAD 가 연산 중에 정밀도에서 손실이 있는 반면 FMAD는 손실이 없다는 차이가 있습니다.
사실 플롭스 성능 따지는데 그런건 별로 중요하진 않고요.
(프로그래밍하는 입장도 아니니.)

단정밀도 계산은 이전과 같은 방식입니다.
배정밀도는 4개의 스트림 프로세서(SP)가 연산하는데, 3가지 경우가 있습니다.
한 사이클에 MADD 1회 or ADD 2회 or Multiply 2회.
어느 쪽이든 2 OP/cycle 입니다.

정리하면 다음과 같습니다.
32비트 단정밀도 - 1 SP당 2 OP/cycle
64비트 배정밀도 - 5 SP당 2 OP/cycle 
배정밀도 성능은 단정밀도 성능의 1/5 라는거지요.

HD3800 계열의 (단일) 최상위 제품인 HD3870 의 플롭스를 계산해보지요.
320SP, 코어클럭 775MHz

단정밀도 - 2 OP/cycle x 320개 x 0.775GHz = 496 GFLOPS
배정밀도 - 단정밀도 / 5 = 99.2 GFLOPS


(2) RV700 계열
VLIW5 아키텍처.
HD4000 계열에 사용.
32비트 단정밀도 지원.
64비트 배정밀도 지원. (HD4700, HD4800 계열만 지원.)



기본구조는 바로 이전과 동일합니다.

최상위 제품 HD4890
800SP, 코어클럭 850MHz

단정밀도 - 2 OP/cycle x 800개 x 0.85GHz = 1360 GFLOPS = 1.36 TFLOPS
배정밀도 - 단정밀도 / 5 = 272 GFLOPS


(3) 에버그린(Evergreen) 계열
VLIW5 아키텍처.
HD5000 계열에 사용.
32비트 단정밀도 지원.
64비트 배정밀도 지원. (Cypress 코어, HD5800 계열만 지원.)



기본 구조는 역시나 동일합니다.

최상위 제품 HD5870
1600SP, 코어클럭 850MHz

단정밀도 - 2 OP/cycle x 1600개 x 0.85GHz = 2720 GFLOPS = 2.72 TFLOPS
배정밀도 - 단정밀도 / 5 = 544 GFLOPS


(4) Northern Island 계열
VLIW4 아키텍처.
HD6000 계열에 사용.
32비트 단정밀도 지원.
64비트 배정밀도 지원. (Cayman 코어, HD6900 계열만 지원.)




VLIW5 에서 VLIW4 로 변경되면서 특수 함수를 처리하면 스트림 프로세서가 사라지고, 나머지 4개의 스트림 프로세서를 활용해 특수 함수를 처리합니다.
각 스트림 프로세서의 기능은 이전과 큰 차이가 없습니다.
다만, 배정밀도 연산 단위가 5SP 에서 4SP 로 바뀌었기때문에,
배정밀도 성능은 단정밀도 성능의 1/4 입니다.

최상위 제품 HD6970
1536SP, 코어클럭 880MHz

단정밀도 - 2 OP/cycle x 1536개 x 0.88GHz = 2703.36 GFLOPS = 2.7 TFLOPS
배정밀도 - 단정밀도 / 4 = 675.84 GFLOPS

HD5870과 비교해 SP가 줄어들어서 다이사이즈, 소비전력이 줄어들었음에도 플롭스 성능은 큰 차이가 없고 배정밀도 성능은 25% 정도 상승했지요.


(5) Southern Island 계열
GCN (Graphics Core Next) 아키텍처.
HD7000 계열에 사용.
32비트 단정밀도 지원.
64비트 배정밀도 지원. (Tahiti, Pitcairn, Cape Verde 코어, HD7900, 7800, 7700 계열 지원.)


아키텍처가 혁신적으로 바뀌었지만 플롭스 성능에 한해서는 이전과 큰 차이가 없습니다.

단정밀도 기준에서는 코어당 2 OP/cycle
Tahiti 코어(HD7900)의 배정밀도 성능은 단정밀도 성능의 1/4
Pitcairn, Cape Verde(HD7800, 7700) 코어의 배정밀도 성능은 단정밀도 성능의 1/16
왜 1/4 이 아닌 1/16 인지는 모르겠네요.
일부러 성능을 제한한건지, 아키텍처적으로 알려지지 않은 차이가 있는건지.

HD7970 GHz edition
2048SP, 코어클럭 1GHz (부스트 클럭 1.05GHz)

단정밀도 - 2 OP/cycle x 2048개 x 1.05GHz = 4300.8 GFLOPS = 4.3 TFLOPS
배정밀도 - 단정밀도 / 4 = 1075.2 GFLOPS = 1.075 TFLOPS

HD7870 GHz edition
1280SP, 코어클럭 1GHz

단정밀도 - 2 OP/cycle x 1280개 x 1GHz = 2560 GFLOPS = 2.56 TFLOPS
배정밀도 - 단정밀도 / 16 = 160 GFLOPS


- 엔비디아 GPU는 다음 편에.



Posted by gamma0burst Trackback 0 : Comment 4

댓글을 달아 주세요

  1. addr | edit/del | reply jhj 2013.07.23 18:39 신고

    마지막 7870 /4아닌가요? 이해를잘못햇나요?

    • addr | edit/del Favicon of https://gamma0burst.tistory.com BlogIcon gamma0burst 2013.07.23 20:22 신고

      Pitcairn, Cape Verde(HD7800, 7700) 코어의 배정밀도 성능은 단정밀도 성능의 1/16 입니다.

  2. addr | edit/del | reply shd 2013.10.10 22:15 신고

    좋은 정보 감사합니다. 이해가 잘 안되어서 질문 드립니다.

    R600 계열을 예로 들었을때...
    1) 배정밀도가 단정밀도 성능의 1/5라는 것은 이해했습니다. 하지만 단정밀도가 1SP당 2 OP/cycle이라고 하셨는데, 이 경우에 놀고있는 다른 4개 SP의 연산능력을 고려 안하는게 맞는 건가요?

    2) 마지막에 배정밀도 성능이 1/16이라는 정보는 어디서 확인할 수 있을까요?


    잘 정리된 글과 지식에 감탄하고 갑니다

    • addr | edit/del Favicon of https://gamma0burst.tistory.com BlogIcon gamma0burst 2013.10.11 00:47 신고

      감사합니다.

      1. 1SP가 2 OP/cycle건 말 그대로의 의미입니다.
      다른 4개의 SP도 같은 식으로 각각 2 OP/cycle입니다.
      연산단위인 5SP 기준으로보면 5SP가 10 OP/cycle인거지요.

      2. AMD의 배정밀도 성능 발표치를 근거로 한 것입니다.
      구조적으로 왜 그런지는 정확히 모르겠습니다.