ARM Cortex A8 프로세서에서 작은 코드를 이식하려고합니다. L1 캐시와 L2 캐시는 모두 제한되어 있습니다. 내 프로그램에는 3 개의 배열이 있습니다. 그 중 두 개는 순서대로 액세스됩니다 (size> Array A : 6MB 및 Array B : 3MB). 세 번째 배열 (size> Array C : 3MB)에 대한 액세스 패턴은 예측할 수 없습니다. 계산은 매우 까다 롭지는 않지만 배열 C에 액세스하기위한 대용량 캐시 미스가 있습니다. 배열 C에 대해 더 많은 캐시 (L2) 공간을 할당하고 배열 A & B에 대해 할당하는 것이 하나의 해결책입니다. 그러나 저는 능력이 없습니다 이것을 달성 할 수있는 방법을 찾으십시오. ARM의 프리로드 엔진을 살펴 보았지만 유용한 것을 찾을 수 없었습니다.다른 배열에 대한 ARM 캐시 사용 최적화
답변
캐시를 분할하고 각 배열을 다른 부분에 할당하는 것이 좋습니다.
불행히도 그럴 수 없습니다. CortexA8의 캐시는 그다지 융통성이 없습니다. 오래된 StrongArm에는이 분할 목적을위한 2 차 캐시가 있지만 더 이상 사용할 수 없습니다. 우리는 L1을 가지고 L2는 (전체 좋은 변화 이럴.) 그러나
, 당신이 할 수있는 일이 아닌 캐시 :
CortexA8의 NEON SIMD 유닛은 약 10 범용 처리 장치에 뒤쳐프로세서 사이클. 영리한 프로그래밍을 통해 범용 유닛에서 캐시 프리 페치를 수행 할 수 있지만 NEON을 통해 액세스합니다. 두 파이프 라인 간의 지연으로 인해 캐시에 프리 페치를 수행하는 데 약간의 시간이 걸리므로 평균 캐시 누락 시간이 줄어들 수 있습니다.
단점은 계산 결과를 NEON에서 ARM 유닛으로 되돌려 보내지 않아야한다는 것입니다. NEON이 뒤쳐지면 전체 CPU 파이프 라인이 플러시됩니다. 캐시 미스만큼 비용이 많이 드는 경우는 거의 없습니다.
성능 차이가 클 수 있습니다. 파란색에서 나는 속도 향상의 20 %에서 30 % 사이를 기대합니다.
구글을 통해 찾을 수있는 것부터, Cortex A8이 지원하는 ISA 버전 인 ARMv7이 캐시 플러시 기능을 가지고 있지만 사용 방법에 대한 명확한 참조를 찾을 수는 없습니다. - 아마도 2 분보다 더 많은 시간을 할애하면 검색 상자에 "ARM cache flush"를 입력하고 결과를 읽는 데 더 많은 시간을 할애 할 수 있습니다.
어쨌든 "불필요한"지침을 주기적으로 발행하여 더 이상 필요하지 않은 A와 B의 부분을 없애면 원하는 근사치를 얻을 수 있어야합니다.