static void memcpy_sse2(void* dst_ptr, void const* src_ptr, size_t size)

{

uint8_t* dst = (uint8_t*)dst_ptr;

const uint8_t* src = (const uint8_t*)src_ptr;


for (size_t i = 0; i < size; i+= 64)

{

auto s0 = _mm_loadu_si128((const __m128i*) (&src[i]));

auto s1 = _mm_loadu_si128((const __m128i*) (&src[i + sizeof(s0)]));

auto s2 = _mm_loadu_si128((const __m128i*) (&src[i + sizeof(s0) * 2]));

auto s3 = _mm_loadu_si128((const __m128i*) (&src[i + sizeof(s0) * 3]));

_mm_storeu_si128((__m128i*)(&dst[i]), s0);

_mm_storeu_si128((__m128i*)(&dst[i] + sizeof(s0)), s1);

_mm_storeu_si128((__m128i*)(&dst[i] + sizeof(s0) * 2), s2);

_mm_storeu_si128((__m128i*)(&dst[i] + sizeof(s0) * 3), s3);

}

}


대략 1G bytes/s 대역폭 이내의 메모리 복사량에서는 위코드처럼 SSE2 명령어를 사용하는게 유리함
그리고 반드시 512bits씩 load 하고 store하는식으로 짜야됨. 그러면 생각보다 많은 시간을 단축할 수 있다.

memcpy time : 0.00556780
memcpy_SSE time : 0.00391590
memcpy_AVX2 time : 0.00428250

대역폭이 커지면 상황이 역전된다.

memcpy time : 1.74631490
memcpy_SSE time : 2.60502870
memcpy_AVX2 time : 2.73842690


컴파일러는 요거다 : Microsoft (R) C/C++ 최적화 컴파일러 버전 19.32.31329(x64)