아래 그림은 c를 통해 SIMD 연산을 하는 구조를 보여준다






  1. 먼저 32 bit float array[4] 개를 만들어서 128 bit 로 Packing 한다
  2. 이후 패킹된 데이터를 xmm 레지스터에 넣어야 하는데 __m128 a   와 같이 만들어 a 에 넣으면 되는데
    이떄 array 에 있는 값이 a 에 4사이클에 걸쳐서 복사되는 것이 아닌 1 사이클로  array 내용이 a 에 복사되게끔 한다(simd)
  3. 그 이후 sqrt 하나의 명령어를(_mm_sqrt_ps) 실행 하여 1사이클로 4개의 수에 sqrt 를 적용한다
  4. 결과를 result 변수에 저장한다







성능적으로는 C,C++ 보다는 빠른 성능을 보인다


어셈블리어로 SIMD 를 사용하면 성능은 빠르다는 것은 당연한 것인데 

Vector Class 로 가면 갈 수록 약간 느린 경향을 보이긴 하지만 느려지지 않게 잘 파악하면

(SIMD + 어셈)과 (Inteinsic 함수 ) 를 사용하는 것 못지 않게 거의 유사한 성능으로 프로그래밍 할 수 있다

잘만 지키면 3가지 모두 유사한 성능을 보임


하지만 Package 에 Pack 이 몇개 들어가느냐에 따라 성능의 차이는 존재 할 수 있다

어쩌면 당연한 결과.. 


현재 시대에서는 i7 이 많이 보급되어지는 추세라 위 표 보다는 성능이 더 높을 것이라 예상한다(표는 2005~6년 보급형 컴퓨터의 기준이다)







반응형

+ Recent posts