memcpy의 다양한 버전의 속도차이 그리고 cpu prefetch
글쓴이: 익명 사용자 / 작성시간: 수, 2002/10/09 - 11:01오후
음 질문은 아니고요..
오늘 몇가지 실험과 그 데이터를 가지고 그래프 작업을 했는데
데이터가 잼있어서 공개합니다. ^^;
다양한 블럭 사이즈(혹은 정렬되고 안되고)와,
여러가지 방법으로 memcpy를 하면서 벤치마크를 해보았습니다.
제가 벤치마크 소스를 만든것은 아니고..
Martin Pool이란 사람이 한 테스트 인데,
mmx레지스터를 사용한 메모리 복사와,
cpu cache prefetch등을 사용해서 실험 결과가 여러가지를
생각하게 하는군요..
Forums:
심각하게 잘못된 벤치마크 결과
speed.c 소스를 보시면 아시겠지만 다른 테스트는 메모리복사를 2번 하
는 반면 arjanv의 테스트는 복사를 1번만 합니다. 그러니 결과도 arjanv
쪽이 월등하게 뛰어날 수 밖에 없죠. 게다가 복사를 2번하는 것도 의미
가 없는 것이, 현실 세계에서는 from에서 to로 뭔가를 복사했다가 다시
to에서 from으로 덮어씌울 일은 거의 없습니다. 거기다 mmx_memcpy()에
선 블럭 사이즈가 64의 배수일 때에도 무조건 memcpy()를 재호출함으로
써 작은 블럭 벤치마크에서 엄청난 손해를 보게 됩니다. 그외 다른 함수
에서는 그 부분이 누락되어 있어 그만큼 이득을 보게 되구요. 이 모든 점
을 다 수정하고 테스트하면 결과도 상당히 다르게 나옵니다.
이 벤치마크는 실수로 짠 거라고 보기엔 석연치 않은 점이 너무 많습니
다. 일부러 prefetch 성능을 과대 선전하기 위해 조작한 듯한 의도까지
느껴지는군요.
Re^2: 심각하게 잘못된 벤치마크 결과
벤치 마크 테스트에서 사용된 소스는 많은 비교거리를 제공하고 있습니다.
우선 mmx_memcpy()는 커널에서 사용되는 소스를 그대로 사용한 것으로
이것이 꼭 최대의 성능을 낸다는 의미가 아닙니다.
arjanv의 테스트 소스에서 한번만 복사하는 것은 사실입니다.
그런데 주목하셔야 할것이 정렬된 부분에만 이 벤치마크가 들어 있다는
것이죠.. 제가 평가한 부분은
한쪽 짜리 복사만 할때 각 prefetch의 상황의 성능 마크이지요..
복사를 from to에서 to from으로 한것은,
캐쉬가 적용되는 부분을 고려한 상황으로
빼고 싶으면 빼도 되겠죠.
저의 관점은 L1,L2 캐쉬의 사용과, mmx레지스터의 사용,
그리고 prefech겠죠.. prefetch도 타이밍이 중요한지라
arjanv의 경우엔 서로 다른 방법을 하는 거죠..
댓글 달기