sourcecode

캐시 라인에 대한 정렬 및 캐시 라인 크기 파악

copyscript 2022. 8. 21. 19:51
반응형

캐시 라인에 대한 정렬 및 캐시 라인 크기 파악

잘못된 공유를 방지하기 위해 배열의 각 요소를 캐시 라인에 정렬합니다.먼저 캐시 라인의 크기를 알아야 하기 때문에 각 요소에 해당 바이트 양을 할당합니다.두 번째로 어레이의 시작을 캐시 라인에 맞추고 싶습니다.

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이 캐시 라인에 맞춰져 있다고 가정합니다.

Linux 및 8코어 x86 플랫폼을 사용하고 있습니다.첫 번째로 캐시 라인사이즈를 찾으려면 어떻게 해야 하나요?

$ getconf LEVEL1_DCACHE_LINESIZE
64

값을 매크로 정의로 컴파일러에 전달합니다.

$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...

실행 시sysconf(_SC_LEVEL1_DCACHE_LINESIZE)를 사용하여 L1 캐시 크기를 가져올 수 있습니다.

사이즈를 확인하려면 , 프로세서의 메뉴얼을 참조할 필요가 있습니다.프로세서를 참조할 수 있는 방법은 없습니다.단, 장점으로는 대부분의 캐시 라인은 intel 표준을 기반으로 한 표준 크기입니다.x86 캐시 행은 64바이트이지만 잘못된 공유를 방지하기 위해 대상 프로세서의 가이드라인을 따라야 합니다(인텔에서는 NetBurst 기반 프로세서에 대해 특별한 주의사항을 기재하고 있습니다).일반적으로 64바이트에 맞출 필요가 있습니다(인텔에서는 16바이트 경계를 넘지 않도록 합니다).

이것을 C 또는 C++ 로 실행하려면 , 표준 을 사용할 필요가 있습니다.aligned_alloc다음과 같은 컴파일러 고유의 지정자 중 하나 또는 함수__attribute__((align(64)))또는__declspec(align(64))다른 캐시 라인으로 분할하기 위해 구조 내의 멤버 사이에 패드를 넣으려면 다음 64바이트 경계에 맞출 수 있을 만큼 큰 멤버를 삽입해야 합니다.

또 다른 간단한 방법은 /proc/cpuinfo를 저장하는 것입니다.

grep cache_alignment /proc/cpuinfo

여기 대부분의 Arm/Intel 프로세서가 탑재된 표가 있습니다.상수를 정의할 때 참조용으로 사용할 수 있으므로 모든 아키텍처의 캐시 라인 크기를 일반화할 필요가 없습니다.

C++의 경우 하드웨어 인터페이스 사이즈가 곧 나타나기 때문에 이 정보를 정확하게 취득할 수 있습니다(컴파일러에 타겟아키텍처를 통지하는 것을 전제로 하고 있습니다).

캐시라인 크기를 완전히 휴대할 수 있는 방법은 없습니다.를 사용하고 있는는, x86/64 에 할 수 .cpuid크기, 캐시라인 크기, 레벨 수 등 캐시에 대해 알아야 할 모든 정보를 얻기 위한 지침입니다.

http://softpixel.com/~cwright/programming/simd/cpuid.disc

(조금 아래로 스크롤하면 이 페이지는 SIMD에 관한 것이지만 캐시라인을 취득하는 섹션이 있습니다.)

데이터 구조의 정렬에 대해서도 완전히 휴대할 수 있는 방법은 없습니다.GCC와 VS10에는 구조물의 정렬을 지정하는 방법이 다릅니다."해킹"하는 한 가지 방법은 원하는 선형과 일치할 때까지 사용되지 않는 변수로 구조를 채우는 것입니다.

malloc()를 정렬하기 위해 모든 메인스트림 컴파일러에는 malloc 함수도 정렬되어 있습니다.

posix_memalign 또는 valloc을 사용하여 할당된 메모리를 캐시 라인에 정렬할 수 있습니다.

에서 쉽게 할 수 분들은++로 라이브러리를 .CacheAligned<T>및 ""의 T되는 오브젝트.Ref()CacheAligned<T>, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.Aligned<typename T, size_t Alignment>캐시 행의 사이즈를 미리 알고 있는 경우, 또는 64(바이트)의 매우 일반적인 값을 유지하고 싶은 경우.

https://github.com/NickStrupat/Aligned

언급URL : https://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size

반응형