메모리 복사 루틴은 다음과 같은 포인터를 통한 단순한 메모리 복사보다 훨씬 더 복잡하고 빠를 수 있습니다.
void simple_memory_copy(void* dst, void* src, unsigned int bytes)
{
unsigned char* b_dst = (unsigned char*)dst;
unsigned char* b_src = (unsigned char*)src;
for (int i = 0; i < bytes; ++i)
*b_dst++ = *b_src++;
}
개량
첫 번째 개선 사항은 단어 경계에 포인터 중 하나를 정렬하고 (단어 단위는 기본 정수 크기, 일반적으로 32 비트 / 4 바이트를 의미하지만 최신 아키텍처에서는 64 비트 / 8 바이트 일 수 있음) 단어 크기 이동을 사용하는 것입니다. / 카피 지침. 이를 위해서는 포인터가 정렬 될 때까지 바이트 간 복사를 사용해야합니다.
void aligned_memory_copy(void* dst, void* src, unsigned int bytes)
{
unsigned char* b_dst = (unsigned char*)dst;
unsigned char* b_src = (unsigned char*)src;
// Copy bytes to align source pointer
while ((b_src & 0x3) != 0)
{
*b_dst++ = *b_src++;
bytes--;
}
unsigned int* w_dst = (unsigned int*)b_dst;
unsigned int* w_src = (unsigned int*)b_src;
while (bytes >= 4)
{
*w_dst++ = *w_src++;
bytes -= 4;
}
// Copy trailing bytes
if (bytes > 0)
{
b_dst = (unsigned char*)w_dst;
b_src = (unsigned char*)w_src;
while (bytes > 0)
{
*b_dst++ = *b_src++;
bytes--;
}
}
}
서로 다른 아키텍처는 소스 또는 대상 포인터가 적절하게 정렬되었는지에 따라 다르게 수행됩니다. 예를 들어 XScale 프로세서에서 소스 포인터가 아닌 대상 포인터를 정렬하여 더 나은 성능을 얻었습니다.
성능을 더욱 향상시키기 위해 일부 루프 언 롤링을 수행하여 더 많은 프로세서 레지스터에 데이터를로드 할 수 있습니다. 즉,로드 / 저장 명령을 인터리브 할 수 있고 추가 명령 (예 : 루프 카운팅 등)에 의해 지연 시간을 숨길 수 있습니다. 로드 / 저장 명령 지연 시간이 상당히 다를 수 있기 때문에 이것이 가져 오는 이점은 프로세서에 따라 상당히 다릅니다.
이 단계에서 코드는 C (또는 C ++)가 아닌 어셈블리로 작성됩니다. 대기 시간 숨김 및 처리량의 최대 이점을 얻으려면 수동으로로드 및 저장 명령을 배치해야하기 때문입니다.
일반적으로 데이터의 전체 캐시 라인은 언 롤링 된 루프의 한 반복에서 복사되어야합니다.
다음 개선 사항으로 프리 페치를 추가합니다. 이는 프로세서의 캐시 시스템에 메모리의 특정 부분을 캐시에로드하도록 지시하는 특수 명령입니다. 명령어를 발행하고 캐시 라인을 채우는 사이에 지연이 있기 때문에 데이터를 복사 할 때와 조만간 또는 나중에 사용할 수 있도록 명령어를 배치해야합니다.
이것은 프리 페치 명령어를 함수의 시작 부분과 메인 복사 루프 안에 넣는 것을 의미합니다. 여러 반복 시간에 복사 될 데이터를 가져 오는 복사 루프 중간에 프리 페치 명령어를 사용합니다.
기억이 나지 않지만 목적지 주소와 소스 주소를 미리 가져 오는 것도 도움이 될 수 있습니다.
요인
메모리 복사 속도에 영향을 미치는 주요 요인은 다음과 같습니다.
- 프로세서, 캐시 및 주 메모리 간의 대기 시간입니다.
- 프로세서 캐시 라인의 크기와 구조.
- 프로세서의 메모리 이동 / 복사 명령 (대기 시간, 처리량, 레지스터 크기 등).
따라서 효율적이고 빠른 메모리 대처 루틴을 작성하려면 작성중인 프로세서와 아키텍처에 대해 많은 것을 알아야합니다. 일부 임베디드 플랫폼에서 작성하지 않는 한 내장 메모리 복사 루틴을 사용하는 것이 훨씬 쉬울 것입니다.