2016-10-27 10 views
0

캐시 나는 그 알고리즘을 최적화 할 수 있지만 나는 또한 하드웨어 레벨에 최적화 원하는 물론 초 성능(읽기/쓰기) CPU는 L1, L2, L3

을 필요로하는 작업을 사용하는 방법.

최적화의 또 다른 종류는 CPU 캐시 (L1, L2, L3)을에 넣어 수

나는 물론 내 작업을 처리하는 스레드에 전체 코어를 할당하기 위해 CPU 선호도를 사용할 수 있습니다 가능한 한 멀리 "RAM 액세스"대기 시간을 피하기 위해 내 작업을 완료하는 데 필요한 데이터

이러한 개발에 어떤 API를 사용할 수 있습니까?

(즉, 내 질문 할 수있을 : "어떻게 캐시에 주어진 데이터 구조를 배치하는 CPU에 강제로?")

당신의 도움을

답변

1

음을 주셔서 감사합니다, 당신 저급 언어를 사용해야 할 것입니다 (이 경우 C가 아마도 사용 가능할 것입니다).

그러면 할 일이 있습니다 : What every programmer should know about memory. 특정 사용 패턴을 최적화하는 방법에 대한 매우 유용한 프로그래밍 조언이 포함 된 6 장에 특히주의하십시오.

2

일반적으로 CPU 캐시의 LRU 대체 정책을 무시할 수 없습니다. x86 CPU는 적어도 특정 주소 범위를 어떤 수준의 캐시에도 "고정"하는 방법을 지원하지 않습니다.

사용하기 전에 수행 할 수있는 작업은 "미리 가져 오기"입니다. "소프트웨어 프리 페치"는 거의 도움이되지 않습니다. 일반적으로 HW 프리 페치는 훌륭하게 수행되며, 캐시 공간이 충분히 작은 한 데이터는 캐시에 유지됩니다. Ulrich Drepper의 What every programmer should know about memory은이 내용을 다루고 있으며 여전히 관련이 있습니다. 그러나 소프트웨어 프리 페치 (특히 별도의 프리 페치 스레드)에 대한 강조는 P4에는 적합하지만 다른 CPU에는 적합하지 않습니다. 읽는 동안 그것을 명심하십시오.

데이터 구조와 액세스 패턴을 캐시 친화적으로 디자인하는 것은 매우 중요합니다. 인터넷 검색 "캐시 인식"알고리즘을 사용해보십시오 (아니면 Ulrich의 논문을 읽으십시오). 또는 성능 카운터를 사용하여 많은 실수로 캐시 미스가 발생했는지 확인하십시오. 당신은 인텔 하 스웰 제온 이상 (EXXX v3의 이상)에서이 작업을 실행하는 경우


, '핵심은 중요한 스레드 L3의 덩어리를 소유하고 실행 그래서 당신은 L3 캐시를 분할 할 수 있으며, 원 다른 코어에 의해 퇴거 당한다. 이를 CAT (Cache Allocation Technology)이라고합니다. 또한 this article by Dan Luu

2

피터 C의 선구자에 대한 훌륭한 코멘트. 이전 옵티마이 저는 코드 개선을 위해 가장 먼저해야 할 일은 모든 SW 프리 페치를 제거하는 것이 었습니다. 또한 전원 상태 등으로 주변을 공격하지 마십시오. 그들은 노력이 HPC에있는 이익이 가치가 있지 않는 지금 좋은 일입니다. 예외는 하이퍼 스레딩입니다. 당신이 거기에 가고 싶은 유일한 시간은 성능뿐만 아니라 일관성이 필요한 특정 벤치마킹 일 것입니다.

optimization guide과 같은 인텔 최적화 리소스를 살펴보십시오. 또한 좋은 프로파일 러를 얻으십시오. Intel's VTune은 정말 최고 중 하나입니다. 인텔의 정보를 얻으려면 bing (또는 google)을 사용하여 물건을 찾으십시오. 인텔의 사이트는 언제나 광택있는 엉망진창이었습니다. VTune에는 학생 및 교육자 라이센스가 있습니다.

다음은 성능 최적화를 위해 앱을 최적화하는 단계입니다. 우선, 더 높은 수준의 소프트웨어 변경 사항을 소진하십시오. 그런 다음 하드웨어 성능을 조정하십시오. 왜? 두 가지 이유 : (1) 코드 변경은 일반적으로 아키텍처에 독립적이며 다른 HW 플랫폼 및 세대로의 이전을 견딜 수있는 가능성이 더 큽니다. (2) 그들은 훨씬 더 간단하다. (재미는 아닐지라도).

코드 변경 :

  1. 모두 제거 SW 프리 페치.
  2. 어떤 검사 인터럽트가 적절한 간격
  3. 사용 포트란이 있는지 확인주기적인 인터럽트 어떤 폴링을 교체합니다. 정말. Fortran이 아직 살아있는 이유가 있습니다. 인텔 포트란 포럼을 살펴보십시오. 포럼의 모든 고전 HPC. 인텔의 포트란 컴파일러는 최고입니다.
  4. 좋은 최적화 컴파일러를 사용하고 컴파일러 설정 및 pragma/annotations (예 : #pragma loop count)로 재생합니다. 다시 말하지만, 인텔은 최고입니다. (나는 그것을 말하는 것이 싫지만 사실입니다.)
  5. 좋은 SW 프로파일 러를 사용하여 (대부분의 시간을 소비하는) 최적화 기회를 찾습니다. 프로파일 러가 다른 기능에서 보낸 시간을 확인하기 위해 소스 코드를 파헤칠 수 있는지 확인하십시오. 먼저 해당 기능을 최적화하십시오. 스레드 parallization (멀티 스레딩)에 대한
  6. 찾기 기회를 제대로
  7. 의 AoS (구조체의 배열)에서 소파로 변환 벡터화
  8. 을 위해 코어
  9. 찾기 기회의 수와 범위. 즉석에서 변환을 수행해야하는 경우 성능 비용의 가치가 없을 수 있습니다.
  10. 벡터화 기회를 찾는 컴파일러에 도움이되도록 루프를 구성하십시오. 이를 수행하는 방법에 대한 좋은 최적화 책을 참조하십시오. (좋은 HW-수준의 성능 분석기를 사용하여)/최적화

하드웨어 해킹은

  1. 캐시를 확인하고 TLB는 그리워하고, 구조 조정 코드입니다.
  2. 분기 오류 예측 및 코드 재구성을 식별하십시오.
  3. 파이프 라인 노점 및 코드 재구성을 확인하십시오.

마지막으로 한 가지 제안을 말씀드립니다. 이미 알고 계실 것입니다. 가장 인기있는 곳을 기억하십시오. 기회가 적을수록 시간이 오래 걸리고 성능이 향상되므로 전체 애플리케이션에 영향을 미치지 않습니다.

행운을 빈다. 최적화는 재미 있고 보람이있을 수 있습니다 (약간 미친 경우).