2010-06-23 1 views
2

선형 배열을 취하고 각 요소를 임의의 위치 (CPU의 관점에서 보면 임의의 위치)에 다른 배열에 쓰는 방법으로 프로그램을 최적화 할 생각입니다. 나는 단지 간단한 글을 쓰고 있고, 다시 요소를 읽지 않는다.현대 인텔 또는 AMD CPU에서 분산 쓰기 속도 대 분산 읽기 속도?

나는 각 액세스가 캐시 미스를 일으키고 따라서 프로세서가 대기하므로 고전적인 CPU에 대한 scatted 읽기가 상당히 느릴 수 있다는 것을 알고 있습니다. 하지만 프로세서가 결과를 기다리고 있지 않기 때문에 흩어져있는 쓰기가 기술적으로 빠르다는 생각 때문에 트랜잭션이 완료 될 때까지 기다릴 필요가 없습니다.

저는 불행히도 고전적인 CPU 메모리 아키텍처의 모든 세부 사항에 익숙하지 않으므로이 문제도 상당히 느려질 수 있습니다.

아무도 시도해 봤습니까?

(나는 내가 가지고있는 문제를 뒤집어 씌우려 고하고있다. 나는 현재 임의의 값 - 흩어져있는 읽기 -에서 선형 배열을 가지고있다. 그리고 모든 캐시 미스 때문에 엄청나게 느리다. 내 생각에이 작업을 흩어져서 쓸데없는 속도로 처리 할 수 ​​있습니다.)

+0

흩어져있는 글이 빠르면 놀랄 것입니다. 그러나 항상 그렇듯이 테스트하고 측정해야합니다. –

답변

3

일반적으로 캐시에 저장되어 있지 않은 주소에 흩어져있는 쓰기에 대해서는 높은 벌금을 부과합니다. 각 쓰기에 대해 전체 캐시 라인을 저장하므로 FSB 및 DRAM 대역폭 요구 사항은 순차 쓰기보다 훨씬 높습니다. 그리고 물론 모든 쓰기 (일반적으로 최신 CPU의 경우 2 백 사이클)시 캐시 미스가 발생하며 자동 선 인출 메커니즘의 도움이 없습니다.

+0

부동 특정 SSE 지침이 특히 float 데이터의 경우 _mm_stream_ps에 도움이된다고 생각하십니까? MSDN 설명서에이 명령은 "캐시를 오염시키지 않고 주소 p에 데이터를 저장합니다."라고 명시되어 있습니다. http://msdn.microsoft.com/en-us/library/78x83000(v=VS.80).aspx – bhouston

+0

방금 ​​요청한 _mm_stream_ps 질문에 대한 답변입니다. http://www.gamedev.net /community/forums/topic.asp?topic_id=532112&whichpage=1� – bhouston

+0

당신은 일을 조금 조정할 수도 있지만 순차적으로 쓰도록 알고리즘을 다시 구조화하는 데 그 노력을 투자하는 것이 좋습니다. (또는 적어도 합리적인 지역과 함께) 가능하다면. –

2

나는 이것이 하드 코어라고 들린다. 그러나 나는 어쨌든 위험을 무릅 쓰고 대답한다.

입력 배열을 페이지로 나누고 각 페이지를 여러 번 읽거나 스캔 할 수 있습니까? 페이지를 통과 할 때마다 제한된 페이지에 속한 데이터 만 처리 (또는 출력)합니다. 이렇게하면 각 입력 페이지 루프가 시작될 때만 캐시 미스가 발생합니다.

+0

그래, 그 소리는 가능해. 하위 범위로 나눌 수 있으며 해당 범위 내의 데이터 만 읽을 수 있습니다. 어떤 페이지 크기를 권하고 싶습니까? 내 입력과 출력 날짜 세트는 모두 크기가 10MB입니다. 입력과 출력을 페이지로 분리하는 것이 가장 좋습니다. 따라서 M 개의 패스가있는 N 개의 파티션이 있습니다. 한 번에 여러 코어에 걸쳐 각각의 패스를 수행 할 수있었습니다. – bhouston