그 라인의 사본을 보유한 코어/캐시가 더 많은 경우 캐시 작성이 완료되는 데 더 오래 걸리는지 알아봐 주시겠습니까? 나는 또한 얼마나 오래 걸리는지 측정/정량화하려고합니다.무효화 할 캐시 쓰기가 더 많은 캐시에서 더 오래 걸립니까?
구글에서 유용한 것을 찾지 못했습니다. 직접 측정하는 데 문제가 있으며, 현대 프로세서에서 발생할 수있는 많은 것들 때문에 측정 한 것을 해석하는 데 어려움이 있습니다. (재정렬, 프리 페치, 버퍼링과 하나님을 알고 무엇을)
세부 사항 :이
을 측정 내 기본 프로세스는 것은 대략 다음과 같이
write soemthing to the cacheline on processor 0
read it on processors 1 to n.
rdtsc
write it on process 0
rdtsc
나는조차 확실하지 않다하는 지침 최종적으로 시간 측정 전에 쓰기/무효화가 완료되었는지 확인하기 위해 실제로 프로세스 0에서 읽기/쓰기에 사용하십시오.
원자 적 교환 (__sync_fetch_and_add())을 사용하는 순간 나는이 작업의 길이 (스레드를 무효로하는 수가 아님) 자체가 중요하다고 생각합니다. 내가 원하는 것을 측정하지 마라.
또한 읽기, 쓰기, 메모리 차단 (__sync_synchronize())을 시도했습니다. 이것은 내가 볼 것으로 기대하는 것보다 더 많이 보입니다. 하지만 마지막 rdtsc가 발생할 때 쓰기가 끝났는지 확실하지 않습니다.
내 생각에 CPU 내부에 대한 지식은 다소 제한적입니다.
어떤 도움을 주셔서 감사합니다.
ps : * 측정을 위해 linux, gcc 및 pthreads를 사용합니다. *이 알고리즘은 병렬 알고리즘을 모델링 할 때 유용합니다.
편집 : 때문에, 일주일 정도에서
이 (내일 휴가를가는) 나는 (경우 누군가가 관심에서) 좀 더 연구를하고 내 코드 및 메모를 게시 여기에 연결합니다 내가 쓸 수있는 시간은 제한적입니다.
gcc 버전이 최신 버전 인 경우 많이 개선 된 [__atomic] (http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html) 내장 함수를 사용할 수 있습니다. [MESI] (http://en.wikipedia.org/wiki/MESI) 캐시 통합 프로토콜을 읽어 볼 수도 있습니다. 유일한 프로토콜은 아니지만 원자 연산이 구현되는 방식에 대해 더 잘 이해할 수 있습니다. –