티스토리 뷰

PS/Algorithm

SIMD

Aaron 2020. 4. 8. 19:33
반응형

## 영상 표현 방법
- 영상의 기본 단위를 픽셀 (pixel)
- 그레이 스케일 영상에서 하나의 픽셀은 0부터 255 사이의 정숫값을 갖음
  - 하나의 픽셀을 표현하기 위해 컴퓨터에서 1 byte 의 메모리 공간을 사용
  - 픽셀 값이 0이면 검정색, 255면 흰색
  - 중간값은 검정색과 흰색 사이의 회색
  - 0부터 255 사이의 정숫값의 범위를 그레이스케일 범위(grayscale level)
- 트루컬러 영상의 각 픽셀은 각각 0~255 범위를 갖는 R, G, B 세 성분으로 구성

 

 

## 영상의 1차원 배열 표현
[ 회색조 영상 ] 
 - g(x,y) = g"[y]"[x]"

 - BYTE g[4*8]
 - g(x,y) = g[y*8 + x]

[ 컬러 영상 ]

 - B(x, y) = c"[y]"[3 X x]"
 - G(x, y) = c"[y]"[3 X x + 1]"
 - R(x, y) = c"[y]"[3 X x + 2]"

 - BYTE c[4*20]
 - B(x, y) = c[y*20 + 3*x]
 - G(x, y) = c[y*20 + 3*x + 1]
 - R(x, y) = c[y*20 + 3*x + 2]



## SIMD
- SSE 는 128bit 레지스터 사용, 4픽셀씩 처리(픽셀 하나가 32bit)
- AVX 는 256bit 레지스터 사용
  

```c++

// 지정한 배열 할당 시, 16바이트 단위로 정렬

__declspec(align(16)) float arr[4] = { }

 

// 부동 소수점 값 a를 dst의 모든 요소에 브로드캐스트(32비트)

// 32bit 부동 소수점 값을 브로드캐스트(8칸)

__m256 _mm256_set1_ps (float a)

 

// 메모리에서 dst로 256비트(포장된 단일 정밀도(32비트) 부동 소수점 요소 8개)를 로드

__m256 _mm256_load_ps (float const * mem_addr)

 

// a 와 b에 있는 포장된 단일 정밀도(32비트) 부동 소수점 요소들의 합

__m256 _mm256_add_ps (__m256 a, __m256 b)

 

// a 와 b에 있는 포장된 단일 정밀도(32비트) 부동 소수점 요소들의 곱

__m256 _mm256_mul_ps (__m256 a, __m256 b)

 

// 포장된 단일 정밀도(32비트) 부동 소수점 요소에서 b의 단일 정밀도(32비트) 부동 소수점 요소를 추출

__m256 _mm256_sub_ps (__m256 a, __m256 b)

 

// packing 된 32bit 부동 소수점 요소를 32bit 정수로 변환 후 결과 저장 (__m236i)

 

__m256i _mm256_cvttps_epi32 (__m256 a)

 

// packing 된 32bit 부동 소수점 요소를 packing 된 32bit 정수로 변환 후 결과 저장 (__m236i)

 

__m256i _mm256_cvtps_epi32 (__m256 a)

 

// packing 된 32bit 정수 요소를 32bit 부동 소수점으로 변환 후 결과 저장

__m256 _mm256_cvtepi32_ps (__m256i a)

 

/////

 

// 모든 요소를 0으로 설정

__m256 _mm256_setzero_ps (void)

 

// 메모리에서 256비트(패킹된 단일정밀(32비트) 부동 소수점 요소 8개) 저장

void _mm256_store_ps (float * mem_addr, __m256 a)

```

> Refer
> https://thebook.io/006796/

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday