2013-04-21 2 views
1

C/C++에서 배열에 대한 메모리 블록을 동적으로 할당하려고하는데이 배열은 높은 빈도로 액세스됩니다. 따라서이 배열을 칩에 , 즉 캐시에 머무르게하고 싶습니다. C/C++에서이 코드를 명시 적으로 어떻게 수행 할 수 있습니까?메모리 블록을 할당하고 캐시에 저장하는 방법은 무엇입니까?

+1

어떤 환경? C 및 C++은 표준 형식에서 실제로 캐시를 인식하지 못합니다. –

+3

하드웨어와 O/S를 정의해야하며 모든 메커니즘은 완벽하게 O/S에만 해당되며 L1 또는 L2 캐시에서는 수행 할 수 없으므로 아마도 원하지 않을 것입니다. 메모리가 실제로 빈도가 높으면 사용 빈도가 높기 때문에 캐시에 보관됩니다. 충분히 자주 사용하지 않을 경우에는 캐시를 파괴 할 수있는 방법을 찾기 위해 관리하는 경우 다음 당신은 당신의 시스템의 전반적인 성능을 아프게 할 것, 어쨌든 캐시에 보관합니다. –

답변

3

이렇게 할 수있는 표준 C++ 언어 기능은 없습니다. 않는

T* p = new T(...); 
size_t n = sizeof(T); 
asm { 
    "CACHE n bytes at address p" 
} 

... 또는 일부 내장 컴파일러 기능 ("고유") :

컴파일러 및 CPU에 따라, 당신은 ASM 블록에 아치 특정 CPU 명령을 사용할 수 있습니다 이.

CPU 매뉴얼 및/또는 컴파일러 설명서를 참조하십시오.

예를 들어, x86 CPU는 PREFETCH으로 시작하는 명령어 세트를 가지고 있습니다.

또 다른 예에서, GCC는 __builtin_prefetch이라는 기능을 갖는다. GCC Data Prefetch Support

+1

니스,이 기본 제공 함수를 알지 못했습니다 :) 이제 사용하기에 유혹입니다.) – Caladan

2

나는 그렇게 생각하지 않는다. 첫째, 어떤 캐시? L3, L2, L1? prefetchalign을 사용할 수 있으므로 액세스가 최적화되어 있습니다. 주기적으로 쿼리하여 LRU가 아닌 상태로 유지할 수 있지만 실제로 캐시에 머물러있게 할 수는 없습니다.

+0

당신이 맞을 수도 있지만 OP가 일부 라인을 잠글 수있는 환경에서 작동하고 있거나 모든 캐시. –

+0

@CarlNorum : 동의합니다. 단지 C++ 또는 C를 의미한다고 생각합니다. –

+0

아키텍처에 따라 다릅니다. 예를 들어 일부 ARM CPU에서는 "캐시"가 수동으로 제어되며 수정 된 새 연산자를 사용하여 메모리를 할당/할당 취소합니다. 'T * t = new (fastmem) T();' –

1

먼저 코드를 실행하려는 시스템의 아키텍처가 무엇인지 알아야합니다. 그런 다음 그 종류의 일을하는 지시가 있는지 확인해야합니다.

실제로 메모리를 많이 사용하면 캐시 컨트롤러가이 영역을 캐시에 저장하도록합니다.

및 최적화의 세 가지 규칙이 먼저 그들을 알고 할 수 있습니다 :) http://c2.com/cgi/wiki?RulesOfOptimization

3

나는 조금 다른 관점에서이 질문에 대답하려고합니다. 이 일을 정말로해야합니까? 그렇게 할 수있는 방법이라 할지라도 그만한 가치가 있습니까? "마법"void * malloc_and_lock_in_cache (int cacheLevel) 함수가 있다고 상상해보십시오. 이 데이터로 무엇을 할 것입니까? 단일 스레드에서 무작위 배열 액세스로 while (1) 루프로 제한된 응용 프로그램 인 경우 최적화 및 CPU 아키텍처로 인해 이러한 동작이 발생합니다. 보다 현실적인 솔루션에 대해 생각해 보면 항상 접근에 대한 논리가 있습니다. 예를 들어 멀티 스레딩, 특정 조건 등을위한 잠금. 응용 프로그램 알고리즘의 나머지 부분은 너무 완벽하므로 캐시에 배열을 할당하는 것만 남았습니다.

다른 모든 액세스/정렬/조회 기능은 CPU 최적화를 덮어 쓰려고하는 대신 매우 제한된 성능 반동을 얻지 않고 검토 할 수없는 최첨단 논리입니다.

또한 원시 하드웨어에서 모든 운영 체제없이 응용 프로그램을 실행하는 것을 고려합니까? 할당이 OS 동작, 응용 프로그램의 나머지 부분에 어떻게 영향을 미치는지 신경 쓰지 않아도됩니까?

그리고 애플리케이션이 가상 시스템이나 XEN과 같은 환경에서 실행되는 경우 어떻게해야합니까?

물리적 메모리 사용 및 디스크 캐싱 유틸리티에 대해 15-18 년 전에 비슷한 주제가 많이 있습니다.실제로 MS-DOS를 SMARTDrive 또는 유사한 유틸리티와 같은 도구는 정말 유용했다 것들을 많이 속도를. Usenet은 write-through/write-back 설정과 같은 사항에 대한 '조언 조정'및 성능 분석으로 가득했습니다.

특히 DOS 응용 프로그램이 많은 양의 데이터를 처리하고 일부 메모리 스왑 논리를 구현 한 경우 (나는 4MB RAM이 고급 스러웠던 시대에 대해 말하고 있습니다) 이것이 대부분 드라마가되어 한 관점에서 볼 때 많은 메모리가 필요합니다

하지만 다음에 무슨 일이 있었 .. 당신은 할 수 있지만, 실제로 교환 할 필요가 있으므로 다른 관점에서 당신은 교환 필요는 없지만 스와핑 캐시 등을 통해 간다. 우리는 VM386 모드, 디스크 캐시/OS에 통합 메모리 스왑을 가지고, 및 관리는 튜닝 SMARTDrive에/램 디스크와 같은 것들에 대해 더 이상 누구인지. 일반적으로 당신이 VM 다음 (이 기능은 WinAPI를 여전히 있지만) 물리적 메모리 블록을 교환하기 위해 자신의 부두 알고리즘을 구현해야 할만큼 할당 '저렴'입니다.

그래서 새로운 마이크로 커널 OS를 개발하지 않을 때까지는 예측할 수없는 결과가 나오는 매우 낮은 수준의 기능을 사용하는 대신 알고리즘 및 응용 프로그램 디자인에 집중하는 것이 좋습니다.

관련 문제