memcpy 관련 질문
안녕하세요
본사이트를 통해 많은 정보를 얻어가고 있는 한 개발자 입니다.
매번 다른 사람들이 남긴 글만 읽다가 뭔가 테스트를 하던 도중 궁금한 점이 있어서 글남깁니다.
제 질문은 아래의 간단한 test code에서 source영역(mp[0] ~ mp[3])의 data를 destination(mp[4]~mp[7])영역으로 mempcpy()를 수행할 때
왜 source영역을 1/4만 초기화 한 경우와 전체를 초기화 한 경우 memcpy의 수행 속도가 차이가 발생하는 걸까? 입니다.
========================================================================================
#include
#include
#include
#define EXESIZE (1*1024*1024)
unsigned long long getcurtime()
{
struct timespec tv;
clock_gettime(CLOCK_MONOTONIC, &tv);
return tv.tv_sec*1000000000+tv.tv_nsec;
}
int main(void)
{
char *mp[8]={0,};
int i;
unsigned long long st, et;
for(i=0;i<8;i++)
mp[i]=(char*)malloc(EXESIZE);
for(i=0;i<(EXESIZE/4);i++)
{
*(mp[0]+i) = rand() & 0xff;
*(mp[1]+i) = rand() & 0xff;
*(mp[2]+i) = rand() & 0xff;
*(mp[3]+i) = rand() & 0xff;
}
for(i=0;i<4;i++)
{
st = getcurtime();
memcpy(mp[4], mp[0], EXESIZE);
memcpy(mp[5], mp[1], EXESIZE);
memcpy(mp[6], mp[2], EXESIZE);
memcpy(mp[7], mp[3], EXESIZE);
et = getcurtime();
printf("loop[%d] : %llu\n", i, et-st);
}
return 0;
}
====================================================================================
위 코드에서 빨간색으로 표시된 부분이
for(i=0;i<(EXESIZE/4);i++) 일때
결과
sbhan@sbhan-linux:~/work/test$ ./mem_test
loop[0] : 1662264
loop[1] : 214857
loop[2] : 195523
loop[3] : 184252
sbhan@sbhan-linux:~/work/test$ ./mem_test
loop[0] : 1637931
loop[1] : 174388
loop[2] : 158827
loop[3] : 180694
sbhan@sbhan-linux:~/work/test$ ./mem_test
loop[0] : 1746765
loop[1] : 184685
loop[2] : 170903
loop[3] : 168586
위 코드에서 빨간색으로 표시된 부분이
for(i=0;i<(EXESIZE);i++) 일때
결과
sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop[0] : 1490597
loop[1] : 494506
loop[2] : 431065
loop[3] : 333235
sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop[0] : 1440975
loop[1] : 402830
loop[2] : 356930
loop[3] : 340288
sbhan@sbhan-linux:~/work/test$ ./mem_test_full
loop[0] : 1436795
loop[1] : 395757
loop[2] : 353843
loop[3] : 337860
위와 같은 결과가 나옵니다.
결과에서 첫번째 루프에서는 sorurce와 destination 모두에서 fault가 발생하기 때문에 시간이 오래 걸리는 것은 이해할 수 있지만
왜 loop 1,2,3에서 2가지 경우의 수행시간이 차이가 생기는 걸까요?
결과만 놓고 봤을 때 마치 1/4만 초기화한 code의 경우 실제로 memcpy가 1/4만 수행되는 것처럼 보이는데 정말 이게 맞는 걸까요?
위의 결과와 같은 패턴은 desk top 뿐만 아니라 android phone에서도 동일한 결과가 나옵니다.
혹시 위 결과에 대해 알고 계신분이 계시다면 설명 부탁드립니다. ^^
감사합니다.
.
잘못봐서 지웁니다.
본문 내용
본문 내용 ----------------------------------------------------------------------------------
결과만 놓고 봤을 때 마치 1/4만 초기화한 code의 경우 실제로 memcpy가 1/4만 수행되는 것처럼 보이는데 정말 이게 맞는 걸까요?
----------------------------------------------------------------------------------
이는 잘못 추측 하고 계신 사실일 듯 합니다.
저걸 확인해보려면
for(i=0;i<(EXESIZE/4);i++)
{
*(mp[0]+i) = rand() & 0xff;
*(mp[1]+i) = rand() & 0xff;
*(mp[2]+i) = rand() & 0xff;
*(mp[3]+i) = rand() & 0xff;
}
코드 위에서 모든 mp에 대해서 초기화를 수행 하고 해보세요
아마 초기화를 수행하는 루틴을 넣더라도 결과값은 비슷하게 나올듯 한데
조심스레 캐시의 영향이 아닐까 추측해봅니다.
gcc -S
gcc -S
댓글 달기