문제

DDR3 듀얼 채널 메모리가있는 코어 2 프로세서의 이론적 최대 메모리 대역폭은 인상적입니다. 위키 백과 기사 아키텍처에서는 초당 10+ 또는 20+ 기가 바이트. 그러나 stockcpy () 호출은 이것을 얻지 못합니다. (3GB/s는 그러한 시스템에서 본 것 중 가장 높습니다.) 아마도, 이는 프로세서의 특성을 기반으로 모든 프로세서 라인에 대해 Memcpy ()를 조정해야하기 때문에 OS 벤더 요구 사항 때문일 것입니다. 다양한 브랜드와 라인에서 합리적이어야합니다.

내 질문 : C 프로그램에서 활용할 수있는 Core 2 또는 Core I7 프로세서에 대한 자유롭게 사용 가능한 고도로 조정 된 버전이 있습니까? 나는 내가 필요한 유일한 사람이 아니라고 확신하며, 모든 사람들이 자신의 memcpy ()를 미세 최적화하기위한 큰 노력의 낭비 일 것입니다.

도움이 되었습니까?

해결책

/아치 : SSE2에서 MSVC를 지정하면 튜닝 된 memcpy를 제공해야합니다 (적어도 내 것).

실패하면, SSE 정렬로드/저장 내입 소재를 직접 사용하여 큰 청크로 메모리를 복사하여 Duff의 단어 장치를 사용하여 데이터의 헤드 및 꼬리를 처리하기 위해 필요한 경우 정렬 된 경계로 가져옵니다. 우수한 성능을 얻으려면 캐시 관리 고입품을 사용해야합니다.

제한 요인은 아마도 CPU 사이클이 아닌 캐시 미스 및 사우스 브리지 대역폭 일 것입니다. 메모리 버스에 항상 다른 많은 트래픽이있을 것이라는 점을 감안할 때, 나는 일반적으로 그러한 작업에서 이론적 메모리 대역폭 처리량의 약 90%를 얻게되어 기쁩니다.

다른 팁

대역폭을 측정 할 때 Memcpy는 읽기와 글을 모두 고려 했으므로 복사 된 3GB/s의 메모리는 실제로 6GB/s의 대역폭입니다.

대역폭은 이론적 인 최대 값입니다. 실제 세계 사용은 훨씬 낮습니다. 예를 들어, 한 페이지 결함과 대역폭이 MB/s로 떨어집니다.

Memcpy/Memmove는 컴파일러 고입재이며 일반적으로 반복 MOVSD (또는 컴파일러가 타겟팅 할 수있는 경우 적절한 SSE 지침)에 감소됩니다. Modern CPU가 이와 같은 REP 지침을 매우 잘 처리하기 때문에 Codegen을 개선하는 것은 불가능할 수 있습니다.

직접 쓸 수 있습니다. 사용해보십시오 인텔 최적화 컴파일러 아키텍처를 직접 타겟팅하려면?

인텔은 또한 불리는 것을 생산합니다 vtune 응용 프로그램 최적화를위한 (컴파일러 및 언어 독립).

여기에 있습니다 기사 게임 엔진 최적화.

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