memcpy 관련 질문

itdream81의 이미지

안녕하세요

본사이트를 통해 많은 정보를 얻어가고 있는 한 개발자 입니다.

매번 다른 사람들이 남긴 글만 읽다가 뭔가 테스트를 하던 도중 궁금한 점이 있어서 글남깁니다.

제 질문은 아래의 간단한 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에서도 동일한 결과가 나옵니다.

혹시 위 결과에 대해 알고 계신분이 계시다면 설명 부탁드립니다. ^^

감사합니다.

klara의 이미지

잘못봐서 지웁니다.

taesaza0의 이미지

본문 내용 ----------------------------------------------------------------------------------
결과만 놓고 봤을 때 마치 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.