2014-09-22 2 views
1

여기에서 캐시가 작동하는 방식에 대한 기본적인 내용은 How and when to align to cache line size? 및 여기에 : What is "cache-friendly" code?이지만이 게시물 중 아무 것도 내 질문에 대답하지 않았습니다. 액세스를 사용하지 않고 즉, 전체를 캐시 내에서 실행하는 방법이 있습니까? (아마도 HDD에서 파일을 읽는 초기 프로세스 중에) RAM에 저장합니까? 지금까지 계산상의 병목 현상은 요즘 대부분 메모리 대역폭이며 "CPU가있는 한 당신은 괜찮습니다"라는 것을 알고 있습니다.캐시 미스를 피할 수있는 방법이 있습니까? _completely_?

프로그램을 캐시에로드하고 프로그램이 종료 될 때까지 계속 유지할 수 있습니까? 그래서 제가 1MB 컴파일 된 C 프로그램을 가지고 있다고 가정 해 봅니다.이 프로그램은 다른 1MB의 메모리 요구 사항으로 과학 계산을 수행하고 5 일 동안 실행됩니다. 이 코드에 플래그를 지정하여 평가 중에 캐시에서 빠져 나오지 않도록 할 수 있습니까? 이 코드의 우선 순위를 높이거나 실행 중에 비슷하게 생각하고 있습니다.

다른 말로하면, 유휴 컴퓨터가 OS를로드하는 데 사용되는 캐시 (우분투)는 아무 것도하지 않습니까? 공회전시 과도한 캐시 사용이 있습니까? 운영 체제가 실행 이외의 다른 작업을 수행하지 않으면 내 작은 프로그램이 일 때 항상 캐시에 있어야합니까? 5 분이 지나면 스크린 세이버가 시작됩니다. 이로 인해 캐시 공간에 대한 내 프로그램과 경쟁하기 때문에 대규모 캐시 미스가 발생합니다 (따라서 성능이 크게 저하됩니다)? 내 경험에 비추어 볼 때, 화면 보호기 나 간단한 오디오 플레이어, pdf 판독기와 같은 비 요구적인 여러 프로그램을 동시에 실행해도 내 과학 프로그램의 성능이 크게 떨어지지 않는다고해도, 항상 캐시에서 들어오고 나가십시오. 문제는 속도가 영향을받지 않는 이유는 무엇입니까? 계산의 속도를 향상 (또는 오히려 : 유지)하기 위해 절대 최소 시스템을 사용하는 것이 맞습니까?

그냥 명확하게하기 위해, 우리는 매우 간단 요점은이 작은 것을 모두 증가 변수는 97 모듈로는 가장 안쪽 부분을 요약 루프 중첩의 무리라고 코드가 뭔가 것을 가정 할 수있다 캐시에 넣고 실행하기에 충분합니다.

답변

1

아니요, 대부분의 표준 아키텍처에서 CPU 캐시를 처리 할 수 ​​없습니다. *

그리고 가능한 경우에도 어떤 성능 향상을 기대합니까? 주 메모리에서 (L3) 캐시로로드하는 데 프로그램 실행 시간의 몇 퍼센트를 소비한다고 생각합니까? 존재하지 않는 문제에 대한 해결책을 꿈꾸는 대신 프로그램이 실제로 시간을 보내고있는 곳을 결정해야합니다.


는 * 나는 86 CPU를 그들에게 부착 RAM없이 작동 할 수있는 하드웨어 구성을 가지고 있다고 생각하지만 기본적으로 무관합니다.

+0

그 때 나는 요점을 놓치고 있습니다, 나는 두렵습니다. 주 메모리에서 L3 캐시로 프로그램을로드하는 것이 프로그램 자체를 실행하는 것과 비교할 때 시간이 좀 걸린다 고 말하면 캐시 부족이 처음에는 어떻게 문제인지 이해할 수 없습니다. 두 번째 발언 : 프로그램이 매우 간단하므로이 경우 프로파일 링이 도움이되지 않을까 걱정됩니다. – Matsmath

+0

@Matsmath : 사실 그것이 요점입니다. 경우에 따라 프로그램이 대부분의 시간을 다른 일을하기 때문에로드 *는 중요하지 않습니다. 다른 경우에는 프로그램이 매우 큰 작업 세트로 쓰러져있을 수 있습니다.이 경우 주 메모리로드가 확실히 중요합니다 *. 당신의 예가 어떤 범주에 속하는지 짐작하십시오! (예, 하드웨어 성능 카운터 등으로 프로필을 작성할 수 있습니다.) –

+0

이 모든 것이 의미가 있습니다. 그래서 제가 정말로 찾던 대답은 "프로그램이 간단하다면 RAM에서로드하는 것이 순간적으로 (거의) 항상 캐시에 있다고 가정 할 수 있습니다. 따라서 캐시에 영구히 보관하는 멋진 방법이 필요하지 않습니다. ''정확히 내가 찾고있는 것. 나는 이것을 (짧지 만 설득력있는) 대답으로 받아들이려고 노력할 것이다. 감사! – Matsmath

1

짧은 대답 : 아니오. 캐시는 OS/CPU에 의해 유지 관리되고 있으며, 프로그램이 캐시에 남아 있도록 강제하는 것은 좋지 않은 생각입니다. 동시에 2 개의 프로그램이 실행 중이며 둘 다 캐시에 남아 있으려고 시도하고 혼란은 발생하지 않을까요?

+0

물론 좋은 지적입니다. 그래서 다른 사람들보다 코드의 특정 부분에 "우선 순위를 매기고"제안했습니다. – Matsmath

+0

@Matsmath 글쎄, CPU 생산자/OS가 당신이 해내 지 못하게하는 방법. 그래서 대답은 당신이 할 수 없다는 것입니다 – Steve

1

different types of CPU cache misses : 필수, 충돌, 용량, 일관성이 있습니다.

강제 누락 은 메모리의 위치에 대한 첫 번째 참조에서 발생하므로을 피할 수 없습니다. 따라서 캐시 미스를 완전히 피할 수는 없습니다. .

게다가 일반적인 L1 캐시 크기는 코어 당 32KB/64KB이고 L2 캐시 크기는 코어 당 256KB입니다. 따라서 1MB의 데이터는 캐시의 연관성에 따라 용량 또는 충돌 손실을 발생시킵니다.

+0

흥미로운 링크; 나는이 분류에 대해 들어 본 적이 없다. 최근의 제온은 코어 당 256kb의 L2 캐시를 보유하고 있으며, 구형 모델은 1-3MB를 사용하는 것으로 나타났습니다. L2는 작지만 L3이 클수록 요즘에는 '추세'라고 생각합니다. 감사. – Matsmath

+0

강제 누락은 하드웨어 또는 소프트웨어에서 수행되는 프리 페치로 다소 숨길 수 있습니다.메모리에서 캐시로 데이터로드를 유도하는 명령어는 결과 메모리 버스 트랜잭션에서 멈추지 않습니다. 이것은 물론 이것이 캐시 미스인지 아닌지에 대한 두 가지 질문을 제기합니다. 즉, 의미 상으로, 어떤 목적 으로든 캐시 미스를 논의하는 것입니다. 주어진 CPU 마이크로 아키텍처가 관련 성능 카운터로 증가할지 여부를 기계적으로 결정합니다. 물론 CPU는 디자이너가 대개 카운터에서 제공하는 매우 제한된 정도에 따라 달라질 수 있습니다. – Novelocrat

0

귀하의 질문에 만족하는지 확신 할 수 없습니다.

은 RAM에 대한 액세스를 사용하지 않고 캐시 내에서 일부 코드를 완전히 실행할 수있는 방법입니까? 프로그램을 캐시에로드하고 프로그램이 종료 될 때까지 계속 유지할 수 있습니까?

싱글 사이클 액세스 시간을 갖는 완전 연관 캐시 (예 : 밀 결합 메모리)를 사용할 수 있습니다 (이것은 매우 작은 임베디드 시스템에서만 현실입니다). 임베디드 시스템에서 TCM을 사용하는 일반적인 방법입니다 시간 결정적 코드의 경우 예측 가능성을 제공합니다.

부분적으로 연관 캐시의 경우 축출 알고리즘이 캐시 채우기의 희생자로 간주하지 않도록 캐시 행 또는 방식을 잠글 수 있습니다 (예 : ARM에서 CP15 사용).

참고로 캐시가 디버그 모드 일 때 비 부팅 보드를 가져 오기 위해 Cache as Ram을 사용하는 것이 때때로 유용합니다. (http://www.asset-intertech.com/Products/Processor-Controlled-Test/PCT-Software/Cache-as-RAM-for-board-bring-up-of-non-boothing-ci)

1

최신 Intel CPU는 Resource Director Technology의 일반적인 루틴하에 "캐시 할당 기술"(CAT)을 추가했습니다. 이를 통해 소프트웨어 지시문은 특정 계산 단위 (응용 프로그램, 컨테이너, VM 등)에 대한 특정 캐시 (및 기타) 리소스를 예약 할 수 있습니다. 따라서 문제의 프로세스가 CAT에서 충분한 캐시 공간을 확보 한 경우 초기 강제 실패 (코드 및 데이터를 캐시로 가져 오기) 및 자체 유도 충돌 충 돌만 발생하여 용량 부족 및 충돌 충돌을 방지해야합니다 다른 프로세스에 의해.

+0

Intel이 내 질문에 흥미를 갖은 것처럼 보입니다 :-). – Matsmath

관련 문제