2012-11-27 2 views
2

프로그램은 sbrk( 함수를 사용하여 큰 배열을 선언합니다. Sbrk은 데이터 세그먼트 크기를 지정된 증가분만큼 변경합니다. 표준 라이브러리 함수는 내가 사용하고 예 :캐시 블록의 크기를 측정하는 C 프로그램을 만듭니다.

#include <stdio.h> 
#include <sys/time.h> 
#include <unistd.h> 

내 main() 함수는 변수를 선언하여 시작합니다 레지스터 *는; 내 목표는 배열에있는 메모리 액세스가 유일한 이기 때문에 레지스터에 메모리 액세스 중에 사용할 모든 변수를 넣으려고하는 것입니다. 지역 변수가 메모리에 상주 할 경우 에 액세스하면 측정에 영향을 미칠 수 있습니다. 다음은 약 4 백만 개의 정수 배열 인 배열을 할당하는 것입니다.이 배열은 32 비트의 컴퓨터에서 16MB입니다.

a=sbrk(4*1024*4096+8192); 
a=(int *)((((int)a>>13)<<13)+8192); 

프로그램이 시작되면 일부 메모리가 할당됩니다. sbrk() 함수는이 메모리를 주어진 값만큼 증가시킵니다. 함수 호출 후에 "a"는이 거대한 배열의 시작 부분을 가리 킵니다.

이제는 내가 알고있는 이러한 조각이 있습니다. 캐시 블록 크기를 얻으려면 어떻게해야할지 모릅니다.

+0

이 모든 것을 달성하기 위해 무엇을하려고합니까? – NPE

+0

메신저 캐시 블록의 크기를 찾으려고합니다 – Nabmeister

+0

정확히 원하는 것은 무엇입니까? 프로세서의 캐시 크기를 알고 싶습니까? x86 기반 프로세서입니까? 일반적으로 캐시가 두 개 이상 있다는 것을 알고 있습니다. –

답변

2

캐시 라인 크기를 얻는 것을 알고있는 스트레이트 C를 사용하는 방법은 없습니다. x86 프로세서를 사용하는 경우 캐시 라인 크기에 대해 cpuid를 사용하여 CPU를 쿼리 할 수 ​​있습니다.

This page에는 이렇게하는 방법에 대한 설명이 나와 있습니다. CPUID — Detecting Cache Line Sizes까지 아래로 스크롤하십시오. 프로세서의 캐시 라인 크기를 찾기

는 프리 페치 및 CLFLUSH 같은 지침 를 사용하여 캐시에 적극적으로 플러시 및 프리 페치 데이터를 원하는 경우에 유용합니다. CPU를 만드는 사람은 에 따라 다릅니다.

Intel 마이크로 프로세서의 경우 캐시 라인 크기는 에 의해 계산 될 수 있으며 cpuid 함수 0x1을 호출 한 후 bh에 8을 곱합니다.

AMD 마이크로 프로세서의 경우 cpuid 함수 0x80000005를 호출 한 후 데이터 라인 캐시 크기는 cl이고 명령어 캐시 라인 크기는 dl입니다. 캐시 라인 크기를 알고

는 프리 페치 및 플러시 효과적인 파견 할 수 있고, 또한 성능에 영향을 줄 수있는 분할 캐시 라인에서 로딩을 피하기 위해 캐시 라인에 경계를 데이터를 정렬 할 수 있습니다.

관련 문제