2012-05-06 6 views
3

함수를 사용하여 실시간으로 큰 숫자 배열 (~ 1Mb)을 처리해야합니다. void processData(char* data). 시험 다음이 Cortex-A8 강제 메모리 캐싱

는 대상 플랫폼에 runned했다 : 같은 데이터

int j = 10; 
while(j--) 
    processData(dataPtr); 

때마다. 그것은 다음과 같은 결과를 보여 주었다 : 그것은 사실에 의해 발생할 수 있습니다

  1. 첫번째 실행이됩니다 ~ 22.5ms
  2. 2를 실행하고 다른 사람이 가지고 ~ 12,5ms 제 생각에는

을 그 2 일 실행 데이터는 이미 프로세서 캐시에 있으므로 훨씬 빠르게 작동합니다.

문제 : 실제 경우에는 데이터가 항상 달라집니다.

캐시에 "미리로드"할 수있는 방법이 있습니까?

+1

이전에 캐시되지 않은 데이터에 액세스 할 때 적어도 한 번은 메모리 대역폭/대기 시간을 지불해야하므로 일반적으로 프리 페치 지침이나로드 지침을 통해로드하면 전반적인 차이가 발생하지 않습니다. –

+0

갑자기 이전에 사용했던 데이터를 실행하고 지금 결과를 얻지 못하는 경우를 제외하고 항상 여분의 CPU주기가 없으면 내용을 수동으로 미리로드하는 것이 좋습니다. 다른 데이터를 처리하는 동안 한 데이터 세트를 미리로드하는 경우 캐시의 현재 반복에 대한 데이터를 강제 종료하지 않도록주의하여 다음 작업 속도를 높일 수 있습니다. –

답변

3

프리 페치가 가능하지만 (gcc 사용, __builtin_prefetch 사용) 신중하게 사용해야하며 성능을 향상시키지 않고 성능을 저하시킬 수 있습니다.

하기 전에 함수의 메모리 액세스 패턴을 검사하고 가능하면 최적화해야합니다.
기본적으로 가능한 한 적은 메모리 액세스가 필요하며 가능한 한 직렬로 연결해야합니다.

프리 페치 작업이 있지만 전체 데이터 세트에 대해 수행하는 것은 좋지 않습니다.
루프의 모든 반복에서 다음 반복 (또는 루프가 매우 빠르게 실행되는 경우 그 이후의 루프)에 대한 데이터를 프리 페치합니다.

0

당신이 할 수있는 일은 전체 작업 세트가 LLC에 적합하다는 것을 명심하는 것입니다. 첫 번째 실행을 '예열 실행'이라고 부르면 타이밍이 고려되지 않습니다. 물론,이 접근법은 세 번째, 네 번째 및 이후 실행 타이밍이 두 번째 실행이 나타내는 것과 일치하는 경우 타당합니다. 그런 다음 벤치마킹 결과를보고 할 때 2N 번째 실행 시간의 평균을 보여 주지만 보고서에서 L3에 맞는 데이터를 언급하고 더 많은 세상적인 데이터로 인해 다른 결과가 예상됩니다. ' 나는 이것이 일반적으로 마이크로 벤치마킹이라고 불리는데, 당신이 잘 정의 된 동일한 상수 데이터 세트를 통해 특정 함수의 성능을 테스트 할 때라고 생각합니다.