2011-11-26 4 views
0

사용자 공간 프로그램의 변수가 캐시 위치로 고정 될 수 있습니까?메모리 위치를 캐시에 고정시킬 수 있습니까?

+1

"캐시 위치에 고정"이란 무엇을 의미합니까? (커널 코드에서 참조하는 것을 가리킬 수 있습니까?) – Mat

+0

변수가 항상 캐시에 있음을 의미합니다. – MetallicPriest

+2

일부 CPU는 특정 영역의 캐시를 잠글 수 있지만 CPU 관련 하드웨어 기능이며 대부분의 데스크탑/서버 CPU는이를 지원하지 않습니다. 필자는 x86 CPU가 없다고 생각하지만, 예를 들어 일부 PowerPC 임베디드 CPU가 있다는 것을 알고 있습니다. –

답변

3

@MetallicPriest, 당신은 동기를 부여하지 않고 신비한 질문을 계속 그들에게 당신은 여기에 질문을 할 때, - 당신이 할 짧은 & 정확한 문구 질문을을 시도해야 충분히 ..... 그 다음에 매우 잘 - 그리고 동기 부여하고 귀하의 질문의 맥락을 전체 단락 (당신은 절대 그렇게하지, 당신은 정말로해야한다). 가능한 경우 신비한 소프트웨어의 현재 상태 (예 : 공용 GIT 저장소)에 대한 정보도 제공하십시오.

AFAIK는 Linux (최소한 x86 또는 AMD64)의 응용 프로그램에서 프로세서 캐시 (해당 캐시 인 경우)가 거의 존재하지 않습니다 (즉, 응용 프로그램 관점에서 볼 수 없음).).

그러나 프로세스는 캐시를 처리 할 수있는 기계 명령어가 있거나 없을 수 있습니다. AFAIK, 모델에 따라 다릅니다 (즉, AMD Phenom 프로세서는 Intel i7과 다르게 동작 할 수 있음). 다행히 당신을 위해

, 최신 GCC 컴파일러는 (최적화) 캐시 관련 지침을 생성 할 수 있습니다. 또한 cache related builtins (__builtin___clear_cache 또는 __builtin_prefetch)을 제공합니다.그러나 이러한 내장 매크로가 부정확 한 의미를 가지고, 다양한 방법으로 구현되며, 아마 당신이 w.r.t. 도움이 될 수 있습니다 아마 gcc

그리고 GCC의 volatile 속성을 부여하여 optimization optionstarget specific options의 의존한다는 인식 캐싱 ("제거").

결국 (Linux의 응용 프로그램에서) 변수가 항상 캐시에 남아있을 수는 없습니다. 예를 들어, 컨텍스트 스위치는 커널에 의해 시작되기 때문에, 캐시 라인은 때때로 다른 프로세스 (및 그 데이터)에 의해 사용됩니다. 사실, 커널은 때로는 활성 프로세스를 멀티 코어 데스크탑 프로세서의 한 코어에서 다른 코어로 옮기고 있습니다!

+0

이 답변 중 일부는 속합니다 의견에. 코멘트와 대답은 같은 것이 아닙니다. – SoapBox

+1

동의하지만, 주석은 너무 작아서 @MetallicPriest가 읽지 못할 수도 있습니다. 그리고 그는 동기 부여가 충분하지 않고 (때로는 모호함이있는) 흥미롭고 기괴한 질문을 실제로합니다. –

-1

죄송 합니다만, 내가 아는 한 사용자 공간에서는 수행 할 수 없지만 커널 공간에서만 수행 할 수 있습니다.

+2

실행 영역과는 아무런 관련이 없습니다. 이 기능을 사용하는 CPU의 간단한 문제입니다. –

+0

@VioletGiraffe "할 일이 없다"와 "간단하다"? 예를 들면 : 명령문 wbinvd를 알았습니까? INTEL 아키텍처 참조를 확인하십시오. 커널 공간에서만 실행될 수 있거나 멋진'SIGSEGV'가 있습니다. – starrify

+0

그래서 사용자 공간에서 대화 할 수있는 커널 공간 드라이버를 작성하십시오. 메모리 고정! 이것은 실제적으로 더 나은 최적화가있는 것처럼 들리지만 OP는 자신의 CPU 캐시 메커니즘을 추측하기 전에 시도해야합니다. –

2

일반적으로 대부분의 최신 CPU에서 어떤 방식 으로든이를 수행 할 수 있습니다. CPU (80x86은 지원하지 않음)에서 명백한 지원을 사용하거나, 해킹 (예 : 캐시에로드 한 다음 최신 80x86에서 캐시 라인 채우기를 사용 불가능하게 함) 또는 다른 데이터가 캐시 라인/경유로 퇴거 당한다. 다른 수단 (예 : "CLFLUSH"로 정기적으로 주광을 CPU에서 빼내십시오).

그러나 "일반적으로"는 "특히 Linux의 경우"를 의미하지 않습니다. 필자는 Linux가 이러한 것들을 지원하는지, 특히 사용자 공간 프로세스를 지원하는지 의심 스럽다.

Linux가 Linux를 지원한다고 의심하는 이유는 Linux (또는 다른 범용 OS)가이를 지원할 정상적인 이유가 없다는 것입니다. 무언가가 정기적으로 사용된다면 어쨌든 CPU 캐시에있게됩니다. 그리고 무언가가 정기적으로 사용되지 않는다면 캐시에서 공간을 낭비하고 다른 모든 것을 느리게하기를 원하지는 않을 것입니다.

정말 3 가지 이유 만 있습니다. 첫 번째는 RAM 칩이 초기화되기 전에 실행되는 펌웨어 코드입니다. 두 번째 이유는 캐시 미스의 여분의 대기 시간이 용인 될 수없는 극단적 인 "하드 실시간"입니다 (여기서는 적용 할 수 없으며 다른 어느 곳에도 적용되지 않을 수도 있음). 세번째 이유는 캐시의 정상적인 "가장 최근에 사용 된"퇴거 정책이 이러한 문제를 수정/피하는 더 나은 방법이있는 곳 (예 : 불필요한 데이터가 캐싱되지 않도록하는 것, 캐시에 들어간 직후에 플러시).

기본적으로 나는 무언가를 캐시에 유지하려고 할 수도 있다고 생각하지만 실제로 무언가를 캐시에 유지하고 싶지는 않습니다.

+0

대부분의 L1/L2 캐시는 LRU가 아니며 연관성이 있으므로 오염이 많이 다르게 작동합니다 (훨씬 더 가능성이 높습니다). – SoapBox

+0

@SoapBox, 저도 알아요. 4-way 연관 캐시와 같이 특정 캐시 라인이 갈 수있는 곳이 4 개 밖에 없습니다. CPU는 "가장 최근에 사용 된"퇴거 정책을 사용하여 새로운 캐시 라인을위한 공간이 필요할 때 4 개의 가능한 스팟 중 어느 것을 제거할지 결정합니다. 물론 지나친 일반화와 지나치게 복잡한 것 사이에는 미세한 선이 있으며 무작위로 구경꾼에게 적합한 균형 인 원래 포스터에 적합한 균형을 찾기가 어려울 수 있습니다 ...-) – Brendan

관련 문제