2013-06-12 1 views
1

현대 멀티 코어 프로세서에서는 일반적으로 로컬 L1 캐시이지만 공유 L2 캐시가 있습니다. L2 캐시를 사용하면서 메모리의 일부분을 위해 L1 캐시를 우회 할 수 있습니까? 성능 예측을 위해 타이밍 예측 가능성을 향상시키기 위해이 작업을 수행하려고합니다.멀티 코어 프로세서에서 L1 캐시를 우회 할 수 있습니까?

+0

실시간 OS를 사용합니까? –

+0

왜 나는 downvotes를 받고 있습니까? – MetallicPriest

+0

읽기 또는 쓰기 중 또는 둘 다에서 바이 패스 L1? – osgx

답변

0

내가 아는 한 주류 CPU의 L1 캐시를 우회 할 방법이 없습니다.

그러나 목표를 달성하려면 (즉, 타이밍 측정에 변동을 일으킬 수있는 캐시 누락을 방지하려면) 컴파일러에게 데이터를 캐시로 프리 페치하도록 요청할 수 있습니다.

GCC 또는 LLVM을 사용하는 경우 __builtin_prefetch을 참조하십시오.

그러나 귀하의 질문은 매우 모호합니다. 귀하의 제안이 귀하의 필요에 부합하지 않을지 확신 할 수 없습니다.

0

캐시

난 강력하게 당신이 캐시가 무엇을 잘못 이해 한 것으로 의심하고 그것이 무엇을위한 것입니다.

캐시는 메모리 내용의 관점에서 투명합니다. 하나의 코어가 메모리 위치에 쓰면 캐시 (L1, L2, L3 등)가 공유되거나 저장되지 않는 다른 모든 코어가 해당 위치를 캐시하여 우연히 업데이트됩니다.

이 아닌 것은이 아니기 때문에 코어가 값을 경쟁 할 수 없다는 것을 의미합니다. 다른 코어가 '잘못된 값을 얻는다.'전에 한 코어가 부분적으로 위치를 읽는 경쟁 조건을 여전히 가질 수 있습니다. 또한 CPU에 상관없이 모든 종류의 캐시가 있는지 여부가 발생합니다. '순서 지정'문제를 해결하려면 소스 코드에서 세마포어 또는 다른 IPC 기본 형식을 사용해야합니다.

일부 캐시 시스템에서는 '힌트를'드롭 할 수 있습니다. Matthieu Rouget은 __builtin_prefetch를 사용하여 그 예를 제시했습니다. 이러한 종류의 것들은 프로그래머가 캐시 시스템에 미리 데이터를 가져올만한 가치가 있다고 말할 수있게합니다. 일부 시스템 (예 : PowerPC 7450)을 사용하면 프로그래머가 캐시 대신 프로그래머 캐시 컨트롤의 일종 인 캐시 대신 메모리의 일부를 사용할 수있었습니다.

그러나 이러한 것들은 모든 캐시가 가지고있는 메모리보기에 어떤 변화도주지 않습니다. 한 캐시의 내용이 업데이트되면 나머지도 업데이트됩니다.

캐시 및 성능 프로그래밍

최고의 프로그래머는 캐시의 문제를 해결 코딩하여 CPU에서 최고의 성능을 추출 할 수 있습니다. 그 영역에서는 일반적으로 캐시가 전혀 존재하지 않기를 바랄 것입니다. 이것의 궁극적 인 구현은 PS3의 Cell 프로세서입니다. 수학 코어에는 캐시가 전혀 없습니다. 대신에 프로그램에서 요구할 데이터를 추측하기 위해 일부 캐시로 남겨두기보다는 자신의 모든 데이터를 가져 와서 소스 코드에 직접 작성해야합니다. 맞고 성과는 여전히 블리스 터로 좋다.

버스 스누핑

일부 CPU가 장치 드라이버를 작성할 때 특정 문제가 될 수 캐시 버스 스누핑을 필요가 없습니다. 버스 스누핑은 CPU 코어가 CPU 코어 이외의 다른 것으로 (예 : DMA 컨트롤러가 장치에서 데이터를 읽음으로써) 업데이트되는 메모리의 내용을 찾아내는 메커니즘입니다.그리고 다른 방법으로는 같은 - 메모리에서 DMA는 현재 캐시에 갇혀 값을 가져옵니다. 요즘 AFAIK 거의 모든 CPU가 버스 스누핑을하므로 문제가되지는 않습니다.

IO 및 메모리 주소 공간 (예 : Intel)을 사용하는 시스템에서 I/O 주소 공간이 어쨌든 캐시되지 않는다고 생각합니다. 메모리 매핑 장치가있는 시스템의 경우 메모리는 일반적으로 캐시되지 않으며 OS는 CPU를 그런 식으로 설정합니다 (this 참조).

귀하의 질문에 대한 이유로 돌아가려면 타이밍 예측 가능성 - 타이밍을 예측. 잘못된 기술을 사용하고있을 수 있습니다. 시스템에 타이밍 제약이있어 문제가 메인 메모리 쓰기 시간의 변동이라면 솔직히 멀티 코어 CPU를 사용하는 것이 처음부터 잘못된 것처럼 들립니다. @Griwes이 바로 그 시점에 있습니다 (실제로 전체 설명). 당신은 FPGA의 라인을 따라 무언가 순수한 하드웨어 설계에 의지 할 필요가있을 것입니다 (펌웨어가 정말로 소프트웨어인지에 대한 코멘트가 없습니다!).

의심 스럽지만 실제로는 세마포어와 다른 IPC 프리미티브를 사용하여 시스템의 두 스레드를 동기화하지 않으려 고하면 성공하지 못하고 공유 캐시를 만들지 못하게됩니다. 코드가 제대로 작동하려면 세마포어 등을 사용해야합니다.

관련 문제