문제

C++ 프로그램을 설계할 때 가능한 캐시 누락 수를 줄이는 방법은 무엇입니까?

인라인 기능이 항상 도움이 되나요?아니면 프로그램이 CPU 제한적일 때만 좋은가요?(예:프로그램은 I/O 지향이 아닌 계산 지향적입니까?

도움이 되었습니까?

해결책

다음은 이런 종류의 코드를 작업 할 때 고려해야 할 사항이 있습니다.

  • "배열 구조"또는 "구조의 배열"을 원하는지 고려하십시오. 사용하려는 것은 데이터의 각 부분에 따라 다릅니다.
  • 캐시 라인을 고르게 포장하여 구조물을 32 바이트의 배수로 유지하십시오.
  • 핫 및 콜드 요소로 데이터를 분할하십시오. 클래스 O의 배열이 있고 황소, Oy, Oz를 자주 사용하지만 때때로 OI, OJ에 액세스 해야하는 경우 OI, OY 및 OZ를 함께 넣고 i, j를 움직이고 이동하는 것이 좋습니다. k 병렬 겨드랑이 데이터 구조로의 부품.
  • 다차원 데이터의 데이터 배열이있는 경우 일반적인 행 주문 레이아웃을 사용하면 선호하는 차원을 따라 스캔 할 때 액세스가 매우 빠르고 다른 차원을 따라 매우 느리게 액세스 할 수 있습니다. a 우주 채취 곡선 대신, 모든 차원에서 가로 질 때 액세스 속도의 균형을 맞추는 데 도움이됩니다. (차단 기술은 비슷합니다. 더 큰 라디습니다.)
  • 캐시 미스를 발생시켜야한다면 비용을 상각하기 위해 해당 데이터로 최대한 많은 작업을 수행하십시오.
  • 멀티 스레드가있는 일을하고 있습니까? 캐시 일관성 프로토콜의 둔화를 조심하십시오. 별도의 캐시 라인에 있도록 패드 플래그 및 작은 카운터.
  • SSE On Intel은 미리 충분히 액세스 할 수있는 것을 알고 있다면 Prefetch Intrinsics를 제공합니다.

다른 팁

이 주제를 언급하는 Herb Sutter의 아주 멋진 비디오가 있습니다. 여기

데이터 바운드 작업의 경우

  1. 목록,지도 및 세트 위의 배열 및 벡터 사용

  2. 열에 따라 행으로 처리합니다

CPU가 데이터를 효율적으로 프리페치하도록 허용합니다.예를 들어 열이 아닌 행, 언롤 루프 등을 기준으로 다차원 배열을 처리하는 캐시 누락 수를 줄일 수 있습니다.

이러한 종류의 최적화는 하드웨어 아키텍처에 따라 다르므로 Intel VTune과 같은 일종의 플랫폼별 프로파일러를 사용하여 캐시에 발생할 수 있는 문제를 감지하는 것이 좋습니다.

인라인 함수 실행은 명령 캐시에 해를 끼칠 수 있습니다. 그리고 메모리가 페치 한 적이 없다면, 많은 차이를 만들지 않을 것입니다.

항상 그렇듯이 모든 최적화는 직감보다는 프로파일 링으로 정보를 제공해야합니다. 어셈블리 언어에 대한 친숙 함과 최적화하는 Plaftorm의 특정 특성을 암시하는 Profiler가 무엇을 말하는지 이해해야한다는 것은 말할 것도 없습니다.

조금 오래되었지만 Mike Abrash의 "Graphic 's Programming Black Book"에는 여전히 좋은 일반적인 조언이 많이 있습니다.

또한 C ++ 및 멀티 스레딩을 수행하는 경우 각 프로세서의 캐시에 대한 허위 공유, 지역 및 데이터의 뜨거운 성을 고려해야합니다. 그것은 큰 차이를 만들 수 있습니다. 또한 특히 멀티 스레딩에서 Lifo 방식으로 물건을 컴퓨팅하는 것은 FIFO 방식으로 컴퓨팅보다 효율적이지만 단일 프로세서 아키텍처에서도 유효합니다.

필요하지 않은 경우 동적 메모리를 사용하지 마십시오. 새로운 삭제, 똑똑한 포인터 등을 사용하여 프로그램 데이터를 메모리에 전파하는 경향이 있습니다. 그 좋지 않다. 예를 들어 대부분의 데이터를 함께 유지할 수 있다면 (예를 들어 스택에서 객체를 선언하여) 캐시가 훨씬 더 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top