2014-10-28 7 views
0

CS 학생으로서 나는 컴퓨터의 기초를 이해하려고 노력하고 있습니다. 내가 this website을 우연히 만났을 때, 나는 그 성능 처벌을 혼자서 테스트하려고했습니다. 나는 그가 무슨 말을하는지, 왜 이런 일이 일어나야하는지 이해해야한다. 내 CPU & RAM이 너무 엄청나게 빠른 경우잘못 정렬 된 데이터의 성능 저하

int main(void) 
{ 
    int i = 0; 
    uint8_t alignment = 0; 
    uint8_t size = 1024 * 1024 * 10; // 10MiB 
    uint8_t* block = malloc(size); 

    for(alignment = 0; alignment <= 17; alignment++) 
    { 
     start_t = clock(); 
     for(i = 0; i < 100000; i++) 
      Munge8(block + alignment, size); 

     end_t = clock(); 
     printf("%i\n", end_t - start_t); 
    } 
    // Repeat, but next time with Munge16, Munge32, Munge64 
} 

잘 모르겠지만, 4 개 기능의 출력 (Munge8 : 어쨌든

, 여기 내 나는 그가 쓴 그 함수를 호출하는 데 사용되는 코드입니다 , Munge16, Munge32 및 Munge64)은 항상 3 또는 4 (임의, 패턴 없음)입니다.

이것이 가능합니까? 100000 회 반복해야 할 일이 많이 있어야합니다, 아니면 내가 잘못입니까? 저는 Windows 7 Enterprise x64, Intel Core i7-4600U CPU @ 2.10GHz에서 작업하고 있습니다. 모든 컴파일러 최적화가 해제됩니다 (예 :/Od).

그래서 모든 관련 질문에 대답하지 않았다 내 솔루션가 작동하지 않습니다.

내가 뭘 잘못하고 있니? 어떤 도움이라도 대단히 감사합니다.

편집 : 우선 : 정말 고마워요.

while(data32 != data32End) 
{ 
    data32++; 
    *data32 = -(*data32); 
} 

지금, 12 25/26 상대적으로 안정적인 출력을 받고 있어요 : uint32_tuint8_t에서 크기의 종류를 변경 한 후 나는 두 개의 별도의 줄에 테스트 함수의 정의되지 않은 동작을 일으키는 모든 내부 루프를 변경/13, 6 및 3 틱으로 100 회 반복의 평균을 계산합니다. 이것은 논리적 인 결과입니까? 이는 내 아키텍처가 정렬 된 액세스를 정렬 된 액세스와 같이 빠르게 (또는 느리게) 처리한다는 의미입니까? 부정확하게 시간을 측정합니까? 또는 10으로 나눌 때 정확도에 문제가 있습니까? 새로운 코드 :

int main(void) 
{ 
    int i = 0; 
    uint8_t alignment = 0; 
    uint64_t size = 1024 * 1024 * 10; // 10MiB 
    uint8_t* block = malloc(size); 


    printf("%i\n\n", CLOCKS_PER_SEC); // yields 1000, just for comparison how fast my machine 'ticks' 
    for(alignment = 0; alignment <= 17; alignment++) 
    { 
     start_t = clock(); 
     for(i = 0; i < 100; i++) 
      singleByte(block + alignment, size); 

     end_t = clock(); 
     printf("%i\n", (end_t - start_t)/100); 
    } 
    // Again, repeat with all different functions 
} 

일반 평론은 물론 인정 받고 있습니다. :)

+11

'uint8_t size = 1024 * 1024 * 10; // 10MiB' : uint8_t의 범위 : 0 - 255. – BLUEPIXY

+2

링크 된 아티클을 보면, 함수는 모두'* data8 ++ = - * data8; '와 같은 라인으로 정의되지 않은 동작을 포함합니다. 또한 호출하는 방법은 할당 된 블록의 끝을 지나서 메모리에 액세스하게합니다. – interjay

+1

@interjay 왜'* data8 ++ = - * data8'가 정의되지 않은 행동입니까? –

답변

0

이 때문에 정수 오버 플로우에 실패

uint8_t size = 1024 * 1024 * 10; // 10MiB 

그것은해야한다 : 만약 당신이 8 비트의 양을 사용하는 거라고 왜

const size_t size = 1024 * 1024 * 10; // 10MiB 

어떤 생각이 뭔가를 보유하지 대형 것을.

컴파일러에 대한 모든 경고를 활성화하는 방법을 조사하십시오.

+0

BLUEPIXY는 이미 내 질문에 대한 언급에서 이것을 언급했다. 편집은이 변경 사항에 관한 것입니다 (이는 답변 한 시간에 가까워졌습니다 :)). – Ophidian

0

시계 기능에 문제가있는 것 같습니다. () CPU 조절이 활성화되어 있어도 CLOCKS_PER_SEC은 처리기에 비해 너무 낮습니다 (주파수 조정이 해제 된 경우 2100000 주위에 있어야합니다). cycle.h을 사용하여 각각의 평균 측정치에 대해 얼마나 많은 사이클을 얻습니까?