2016-12-22 11 views
0

내 질문에 매우 간단합니다.왜 스레드 컨테이션이 증가합니까? 인터록이 느려지는 이유는 무엇입니까?

멀티 스레드에서 인터록 증가가 1 스레드보다 느린 이유는 무엇입니까?

캐시 라인 바운싱 (캐시 라인 경합) 때문인가요?

또 다른 이유가 있습니까?

저는 Intel i7, visual studio 2012를 사용하고 있습니다. 인터록 증가 함수를 사용하여 계산 숫자를 테스트했습니다. 테스트 결과가 그 것이다.

1 실 - 610,385,971

2 실 - 497,804,468

3 실 - 351,516,659

4 스레드 - 333,275,249

+0

귀하의 질문은 모호하고 답할 수 없습니다. 다른 이유로 인해 느릴 수있는 코드를 표시하지 않았습니다. 플랫폼/하드웨어 아키텍처가 어떤 플랫폼에서 실행되고 있는지 알려주지 않았습니다. 그리고 당신은 당신이보고있는 공연을 보여주는 어떤 숫자도 우리에게주지 않았습니다. 질문하는 법에 대한 정보는 [도움말 센터] (http://stackoverflow.com/help/how-to-ask)를 참조하십시오. – antiduh

+0

죄송합니다. Intel i7, visual studio 2012를 사용하고 있습니다. 연동 - 증가 함수를 사용하여 계산 숫자를 테스트했습니다. 및 테스트 결과가 그랬습니다. 1 실 - 610,385,971 2 실 - 497,804,468 3 실 - 351,516,659 4 스레드 -이 테스트에서 333,275,249 , 당신이 보는대로, 스레드 증가 성능으로가 다운되었습니다. 나는 성능 저하의 이유가 무엇인지 궁금합니다. 좋은 하루 되세요! – chfhrqnfRhc

+0

원래 노트에 노트를 넣으십시오. – antiduh

답변

2

내가 제대로, 당신의 구두 설명의 코드를 이해한다면 예, 성능 저하의 주요 원인은 서로 다른 코어 간의 동일한 캐시 라인에 대한 경쟁입니다. 즉, 연동 증가를 성공적으로 수행하려면 코어가 코어 간 조정을 필요로하고 단일 코어에서 연동 증가분을 실행하는 것과 비교하여 느리게 볼 수있는 https://en.wikipedia.org/wiki/MESIF_protocol과 같은 것을 사용하여 E로 캐시 라인을 가져와야합니다.

+0

정말 고마워요! 성능 저하의 또 다른 주된 이유가 있다고 생각했습니다. 나는 캐시를 더 공부해야한다. – chfhrqnfRhc

+0

@chfhrqnfRhc : CPU 구현 방법에 대한 저수준에 대한 자세한 내용은 http://stackoverflow.com/questions/39393850/can-num-be-atomic-for-int-num을 참조한다. x86 asm 명령'lock inc [mem]'내부적으로, 왜 원자 적이지만'inc [mem]'접두사가 없으며 (x86'lock' 접두사가없는), 이것이 C 원자학에서 어떻게 중요한지를 설명합니다. –