<aside> ๐ผ๏ธ
์์ํ ํ๋์จ์ด์ ๋ถ์คํธ ์์ญ
์ค๋ช
ํ๋์ ์ค๋ ๋์์์ for๋ฌธ์ ์ชผ๊ฐ์ ๋์์ ์ฐ์ฐํ๋ ๊ธฐ๋ฅ
๋์์ฑ ๋ณด์ฅ์๋จ : ๋ง๊ทธ๋๋ก ๋ฐ๋ณต์ด ์๋๋ผ ๋์์ ์ฒ๋ฆฌ๋๋ฏ๋ก, ์ํธ ์์กด์ฑ์ด zero์ฌ์ผํจ
int sum = 0;
std::for_each(std::execution::par_unseq, v.begin(), v.end(),
[&](int n) { sum += n; }); // ์ํ!!
C++ ํ์ค ๋ฒ์ ๊ณผ๋ ๋ฌด๊ด,2000๋ ๋ ์ค๋ฐ ์ดํ ์ปดํ์ผ๋ฌ๋ผ๋ฉด ๋๋ถ๋ถ ์ง์!
๋ฒกํฐ ๋ํ๊ธฐ, ๊ณฑํ๊ธฐ, ๋น๊ต ๋ฑ ๊ณ ์ฑ๋ฅ ๋์ ์ฐ์ฐ์ ๋ช ์์ ์ผ๋กย ์ฌ์ฉ
cpp์์ ๋ช ์์ ์ผ๋ก ์ปดํ์ผ๋ฌ์๊ฒ ์์ฒญ ๊ฐ๋ฅ
SIMD intrinsics๋ SSE/AVX(์ธํ ), NEON(ARM) ๋ฑ CPU ๋ช ๋ น์C/C++์์ ์ง์ ํธ์ถํ๋ ํจ์๋ค โ C/C++ ์ฝ๋์์ SIMD ๋ ์ง์คํฐ์ ๋ช ๋ น์ด๋ฅผย ์ง์ ย ์ปจํธ๋กค ๊ฐ๋ฅ
์)ย _mm_add_ps()(SSE),ย _mm256_add_ps()(AVX) ๋ฑ
โ ๊ทธ๋ฅ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋ ๊ฒ๊ณผ ๋์ผ, ๋จ ํ๋ซํผ๊ณผ ์ํคํ
์ณ ์ข
์์ ์ฝ๋๊ฐ ๋จ
#include <immintrin.h> // AVX header
float a[8] = {1,2,3,4,5,6,7,8};
float b[8] = {10,20,30,40,50,60,70,80};
float c[8];
__m256 va = _mm256_loadu_ps(a);
__m256 vb = _mm256_loadu_ps(b);
__m256 vc = _mm256_add_ps(va, vb);
_mm256_storeu_ps(c, vc);
// c = {11,22,33,44,55,66,77,88}
์์: OpenCV ๋ด๋ถ SIMD ์ฝ๋ (๊ฐ๋จํ)
#ifdef CV_ENABLE_AVX2
__m256 mA = _mm256_loadu_ps(a);
__m256 mB = _mm256_loadu_ps(b);
__m256 mC = _mm256_add_ps(mA, mB);
_mm256_storeu_ps(c, mC);
#else
// ์ผ๋ฐ for๋ฌธ fallback
for (int i = 0; i < 8; ++i) c[i] = a[i] + b[i];
#endif
SIMD์ ์ค๋ฒํค๋
_mm_loadu_psย vsย _mm_load_ps)์ฐธ๊ณ
<xmmintrin.h>,ย <emmintrin.h>ย ๋ฑ<immintrin.h>msse,ย mavxย ๋ฑ ๋ช
์์ ์ผ๋ก ์ต์
์ ์ค์ผ ํ ์ ์์์ ๊ณต ํจ์
| ๋ช ๋ น์ด ์งํฉ | ๋ ์ง์คํฐ ํฌ๊ธฐ | ์ฃผ์ ์ฐ์ฐ/ํน์ง | ์ง์ CPU ์์ |
|---|---|---|---|
| MMX | 64๋นํธ | ์ ์ | ํํฐ์ MMX ๋ฑ (๊ตฌํ) |
| SSE | 128๋นํธ | float, double, int | ์ธํ /AMD ๋๋ถ๋ถ |
| AVX | 256๋นํธ | float, double | 2011๋ ์ดํ ์ธํ /AMD |
| AVX2 | 256๋นํธ | int ํฌํจ, gather | 2013๋ ์ดํ ์ธํ /AMD |
| AVX-512 | 512๋นํธ | ๋๊ท๋ชจ ์ฐ์ฐ, ๋ง์คํฌ, FMA | ์๋ฒ, ์ต์ ์ธํ ์ผ๋ถ |
| FMA | 128/256/512 | ๊ณฑ์ +๋ง์ ํ ๋ฒ์ | AVX2, AVX-512 ํฌํจ |
| NEON (ARM) | 64/128๋นํธ | float, int, ๋ฑ | ARM Cortex, M1, M2 ๋ฑ |
| SVE (ARM) | ๊ฐ๋ณ(128~2048) | ARM ์๋ฒ, ์ด๋ํ ๋ฒกํฐํ | ARM Neoverse ๋ฑ |
์ค์ ์ ์ฉ
์ฌ๋ก projAVX2
์ฌ๋ก cv::reduce
cis์นด๋ฉ๋ผ io์ด๋ฏธ์ง memcopy๋ถ๋ถ ์ง์ ์ ์ฉํ๋ฉด์, ๋ณต์ฌ์ฐ์ฐ โ ๊ฐ๊ฐ์ฐ์ฐ์ฐ โ ์ฌ์น์ฐ์ฐ โ ๋น๊ต์ฐ์ฐ ์์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌํ ํ๋ฉด ์์ฒญ ์ข์๋ฏ


</aside>