잘못된 공유
False sharing컴퓨터 과학에서 거짓 공유는 캐싱 메커니즘에 의해 관리되는 최소 리소스 블록 크기로 분산되고 일관된 캐시가 있는 시스템에서 발생할 수 있는 성능 저하 사용 패턴입니다.시스템 참가자가 다른 참가자에 의해 변경되지 않은 데이터에 정기적으로 액세스하려고 하지만 데이터가 변경된 데이터와 캐시 블록을 공유하는 경우, 캐싱 프로토콜은 논리적 필요성이 [1]없음에도 불구하고 첫 번째 참가자가 캐시 블록 전체를 다시 로드하도록 강제할 수 있습니다.캐싱 시스템은 이 블록 내의 액티비티를 인식하지 못하고 자원의 진정한 공유 액세스에 필요한 캐싱 시스템의 오버헤드를 첫 번째 참가자가 부담하도록 강제합니다.
멀티프로세서 CPU 캐시
지금까지 이 용어의 가장 일반적인 용도는 현대의 멀티프로세서 CPU 캐시입니다.여기서 메모리는 2개의 워드사이즈(64개의 정렬 바이트, 연속 바이트 등)의 작은 파워의 행으로 캐시됩니다.2개의 프로세서가 1개의 회선에 격납 가능한 같은 메모리주소 영역내의 독립된 데이터상에서 동작하는 경우, 시스템의 캐시 일관성 메커니즘에 의해서, 회선 전체가 버스상에서 강제적으로 행해지거나, 데이터 기입 마다 상호 접속되어 시스템 대역폭의 낭비에 가세해 메모리의 정지가 필요하게 되는 일이 있습니다.경우에 따라서는 허위 공유를 제거함으로써 성능 수준이 [2]향상될 수 있습니다.잘못된 공유는 자동으로 동기화된 캐시 프로토콜의 고유한 아티팩트이며 분산 파일 시스템이나 데이터베이스와 같은 환경에도 존재할 수 있지만, 현재 널리 사용되는 것은 RAM 캐시로 제한됩니다.
예
#실패하다 <blocks> #실패하다 <신규> #실패하다 <원자성> 사용. 네임스페이스 표준; 콘스펙트 부울 FALSE_공유 = 진실의; 콘스펙트 size_t #정의되어있는경우(_cpp_lib_interference_size) 캐시_라인_사이즈 = hardware_destructive_interference_size, #실패하다 캐시_라인_사이즈 = 64, #엔디프 세컨드 얼라인먼트 = FALSE_공유 ? 크기(인트) : 캐시_라인_사이즈; 사용. atomic_type = 원자핵의< >인트>; 구조 shared_or_not { atomic_type a 얼라인먼트(캐시_라인_사이즈); atomic_type b 얼라인먼트(세컨드 얼라인먼트); }; 인트 주된() { shared_or_not shared OrNot; 자동 스레드 = []( atomic_type *atomic Value(원자값) ) { 위해서( size_t r = 100'000'000; r--; ) ++*atomic Value(원자값); }; 실 스레드 A( 스레드, &shared OrNot.a ), 스레드 B( 스레드, &shared OrNot.b ); 스레드 A.합류하다(); 스레드 B.합류하다(); }
이 C++20 코드는 잘못된 공유의 영향을 나타냅니다.shared_or_not의 첫 번째 멤버a는 데이터 구조가 캐시라인을 가로지르는 것을 방지하기 위해 항상 캐시라인에 정렬되어 있기 때문에 a와 b가 실수로 분할되어 잘못된 공유의 효과를 나타낼 수 없습니다.두 번째 멤버 b는 FALSE_SHARING이 true로 설정되어 있는지 false로 설정되어 있는지에 따라 같은 캐시라인 또는 다음 캐시라인에 직접 배치됩니다.FALSE_SHARING 이 false 로 설정되어 있는 경우, 통상, 코드는 몇 배 고속으로 실행됩니다.
경감
잘못된 공유의 영향을 완화하는 방법들이 있다.예를 들어 CPU 캐시의 잘못된 공유는 변수 순서를 변경하거나 변수 사이에 패딩(미사용 바이트)을 추가하는 것으로 방지할 수 있습니다.그러나 이러한 프로그램 변경 중 일부는 개체의 크기를 증가시켜 메모리 [2]사용량을 증가시킬 수 있습니다.컴파일 시 데이터 변환을 통해 잘못된 [3]공유를 줄일 수도 있습니다.다만, 이러한 변환의 일부가 항상 허가되고 있는 것은 아닙니다.예를 들어 C++23의 C++ 프로그래밍 언어 표준 초안에서는 데이터 멤버는 나중에 더 높은 [4]주소를 가질 수 있도록 배치해야 합니다.
잘못된 [5][6]공유를 탐지하는 도구가 있습니다.또한 프로그램을 실행할 때 잘못된 공유를 탐지하고 복구하는 시스템도 있습니다.그러나 이러한 시스템에서는 일부 [7][8]실행 오버헤드가 발생합니다.
레퍼런스
- ^ Patterson, David (2012). Computer organization and design: the hardware/software interface. Waltham, MA: Morgan Kaufmann. p. 537. ISBN 978-0-12-374750-1. OCLC 746618653.
- ^ a b Bolosky, William J.; Scott, Michael L. (1993-09-22). "False sharing and its effect on shared memory performance". Sedms'93: USENIX Systems on USENIX Experiences with Distributed and Multiprocessor Systems. 4. Retrieved 11 July 2021.
- ^ Jeremiassen, Tor E.; Eggers, Susan J. (1995). "Reducing false sharing on shared memory multiprocessors through compile time data transformations". ACM SIGPLAN Notices. Association for Computing Machinery (ACM). 30 (8): 179–188. doi:10.1145/209937.209955. ISSN 0362-1340.
- ^ "Working Draft, Standard for Programming Language C++ [class]". eel.is. Retrieved 2021-07-11.
- ^ "perf-c2c(1)". Linux manual page. 2016-09-01. Retrieved 2021-08-08.
- ^ Chabbi, Milind; Wen, Shasha; Liu, Xu (2018-02-10). Featherlight on-the-fly false-sharing detection. New York, NY, USA: ACM. doi:10.1145/3178487.3178499.
- ^ Nanavati, Mihir; Spear, Mark; Taylor, Nathan; Rajagopalan, Shriram; Meyer, Dutch T.; Aiello, William; Warfield, Andrew (2013). Whose cache line is it anyway?. New York, New York, USA: ACM Press. doi:10.1145/2465351.2465366.
- ^ Liu, Tongping; Berger, Emery D. (2011-10-18). "SHERIFF: precise detection and automatic mitigation of false sharing". ACM SIGPLAN Notices. Association for Computing Machinery (ACM). 46 (10): 3–18. doi:10.1145/2076021.2048070. ISSN 0362-1340.