아래 그림은 c를 통해 SIMD 연산을 하는 구조를 보여준다
- 먼저 32 bit float array[4] 개를 만들어서 128 bit 로 Packing 한다
- 이후 패킹된 데이터를 xmm 레지스터에 넣어야 하는데 __m128 a 와 같이 만들어 a 에 넣으면 되는데
이떄 array 에 있는 값이 a 에 4사이클에 걸쳐서 복사되는 것이 아닌 1 사이클로 array 내용이 a 에 복사되게끔 한다(simd) - 그 이후 sqrt 하나의 명령어를(_mm_sqrt_ps) 실행 하여 1사이클로 4개의 수에 sqrt 를 적용한다
- 결과를 result 변수에 저장한다
성능적으로는 C,C++ 보다는 빠른 성능을 보인다
어셈블리어로 SIMD 를 사용하면 성능은 빠르다는 것은 당연한 것인데
Vector Class 로 가면 갈 수록 약간 느린 경향을 보이긴 하지만 느려지지 않게 잘 파악하면
(SIMD + 어셈)과 (Inteinsic 함수 ) 를 사용하는 것 못지 않게 거의 유사한 성능으로 프로그래밍 할 수 있다
잘만 지키면 3가지 모두 유사한 성능을 보임
하지만 Package 에 Pack 이 몇개 들어가느냐에 따라 성능의 차이는 존재 할 수 있다
어쩌면 당연한 결과..
현재 시대에서는 i7 이 많이 보급되어지는 추세라 위 표 보다는 성능이 더 높을 것이라 예상한다(표는 2005~6년 보급형 컴퓨터의 기준이다)
반응형
'운영체제 & 병렬처리 > TBB & SIMD' 카테고리의 다른 글
CPU 구조의 이해(명령어 처리의 이해) (0) | 2018.02.09 |
---|---|
Intel SSE(Streaming SIMD Extensions 기술[SSE,SSE2, SSE3, SSE4] (0) | 2018.02.09 |
Pack 과 Package (0) | 2018.02.09 |
SIMD - Single Instruction Multiple Data? 와 PADDW (0) | 2018.02.09 |
왜 스레딩 빌딩 블록인가 (0) | 2012.11.02 |