캐시 라인에 맞추고 캐시 라인 크기 파악
허위 공유를 방지하기 위해 배열의 각 요소를 캐시 라인에 맞추고 싶습니다. 따라서 먼저 캐시 라인의 크기를 알아야하므로 각 요소에 해당 바이트 수를 할당합니다. 둘째, 배열의 시작이 캐시 라인에 정렬되기를 원합니다.
Linux 및 8 코어 x86 플랫폼을 사용하고 있습니다. 먼저 캐시 라인 크기를 어떻게 찾습니까? 둘째, C에서 캐시 라인에 어떻게 정렬합니까? gcc 컴파일러를 사용하고 있습니다.
따라서 구조는 예를 들어 캐시 라인 크기가 64라고 가정하면 다음과 같습니다.
element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191
0-63이 캐시 라인에 정렬되어 있다고 가정합니다.
크기를 알기 위해서는 프로세서에 대한 문서를 사용하여 검색해야합니다. 프로그래밍 방식으로 수행 할 수있는 방법은 없습니다. 그러나 플러스 측면에서 대부분의 캐시 라인은 인텔 표준에 따라 표준 크기입니다. x86 캐시 라인은 64 바이트이지만 잘못된 공유를 방지하려면 대상 프로세서의 지침을 따라야합니다 (인텔은 넷 버스트 기반 프로세서에 대한 몇 가지 특별한 참고 사항이 있음). 일반적으로이를 위해 64 바이트로 정렬해야합니다. (인텔은 16 바이트 경계를 넘어서는 안된다고 말합니다.)
C 또는 C ++에서이 작업을 수행하려면하면 표준 사용해야 aligned_alloc
과 같은 기능 또는 컴파일러 특정 지정자 중 하나를 __attribute__((align(64)))
나 __declspec(align(64))
. 구조체의 멤버 사이를 패딩하여 다른 캐시 라인으로 분할하려면 다음 64 바이트 경계에 맞출 수있을만큼 큰 멤버를 삽입해야합니다.
Linux 및 8 코어 x86 플랫폼을 사용하고 있습니다. 먼저 캐시 라인 크기를 어떻게 찾습니까?
$ getconf LEVEL1_DCACHE_LINESIZE
64
값을 매크로 정의로 컴파일러에 전달하십시오.
$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...
런타임에 sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
L1 캐시 크기를 가져 오는 데 사용할 수 있습니다.
캐시 라인 크기를 가져 오는 완전히 이식 가능한 방법은 없습니다. 그러나 x86 / 64를 cpuid
사용하는 경우 명령을 호출 하여 크기, 캐시 라인 크기, 수준 수 등을 포함하여 캐시에 대해 알아야하는 모든 것을 얻을 수 있습니다.
http://softpixel.com/~cwright/programming/simd/cpuid.php
(조금 아래로 스크롤하면 페이지는 SIMD에 관한 것이지만 캐시 라인을 가져 오는 섹션이 있습니다.)
데이터 구조를 정렬하는 것과 관련하여 완전히 이식 가능한 방법도 없습니다. GCC와 VS10에는 구조체 정렬을 지정하는 다른 방법이 있습니다. "해킹"하는 한 가지 방법은 원하는 정렬과 일치 할 때까지 사용하지 않는 변수로 구조체를 채우는 것입니다.
mallocs ()를 정렬하기 위해 모든 주류 컴파일러는 해당 목적을 위해 malloc 함수도 정렬했습니다.
또 다른 간단한 방법은 / proc / cpuinfo를 분류하는 것입니다.
고양이 / proc / cpuinfo | grep cache_alignment
posix_memalign 또는 valloc 을 사용하여 할당 된 메모리를 캐시 라인에 정렬 할 수 있습니다.
C ++에서이 작업을 쉽게 수행하는 방법에 대해 궁금한 사람이 있다면 객체를 호출 하여 참조하는 객체 CacheAligned<T>
의 정렬과 캐시 라인 크기를 결정 하는 클래스가 있는 라이브러리를 구축했습니다 . 캐시 라인 크기를 미리 알고 있거나 64 (바이트)라는 매우 일반적인 값을 유지하려는 경우 에도 사용할 수 있습니다 .T
.Ref()
CacheAligned<T>
Aligned<typename T, size_t Alignment>
https://github.com/NickStrupat/Aligned
참고 URL : https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size
'Development Tip' 카테고리의 다른 글
Spinner 기본값을 null로 설정하는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
/// summary 생성 방법 (0) | 2020.12.14 |
git에서 매달린 Blob 복구 (0) | 2020.12.14 |
Java와 함께 Selenium WebDriver를 사용하여 탭 전환 (0) | 2020.12.14 |
세로로 사진을 찍도록 카메라를 제어해도 최종 이미지가 회전하지 않습니다. (0) | 2020.12.14 |