linux memcpy 독특하게 구현돼있네요.. 이유가 뭘까요?

won1596의 이미지

아래와 같이 되어있습니다. 보니까 8의 배수로 복사를 하고 남은걸 4, 2, 1개단위로 복사하는 모양이네요
그러니까 사이즈가 37이면 8 8 8 8 4 1 이렇게 복사하는것 같습니다.
이유가 뭘까요? 8인걸로봐서 캐시나 1byte와 관련이 있을것 같은데..

char* memcpy(char* dest, char* src, int size)
{
	int i = 0;
	unsigned char *d = (unsigned char *)dest, *s = (unsigned char *)src;
 
	for (i = size >> 3; i > 0; i--) {
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
	}
 
	if (size & 1 << 2) {
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
		*d++ = *s++;
	}
 
	if (size & 1 << 1) {
		*d++ = *s++;
		*d++ = *s++;
	}
 
	if (size & 1)
		*d++ = *s++;
 
	return dest;
}

실제로 실행결과도 단순히 for문으로 복사한것보다 20%정도는 빠르네요.

File attachments: 
첨부파일 크기
Image icon 23.png10.54 KB
yukariko의 이미지

대표적인 loop 최적화 방식입니다.
저렇게 처리해주면 i > 0의 조건문이 8배 적게 동작하기때문에 수행시간이 빨라지게됩니다.
한번에 8바이트씩도는데 8의 의미는모르겠으나
뒤따라오는 4 2 1또한 조건을 적게 사용하기위한
최적화 테크닉으로 보이네요.
저렇게하기위해 8바이트씩 처리하는것일수도 있어보입니다.

익명 사용자의 이미지

loop unrolling 을 찾아보세요.

won1596의 이미지

감사합니다