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)
코세임?
코팁정도?