태그 보관물: c

c

프로그래밍 방식으로 캐시 라인 크기를 얻습니까? 환영합니다. 답을위한 플랫폼을 지정하십시오. 비슷한 질문

모든 플랫폼을 환영합니다. 답을위한 플랫폼을 지정하십시오.

비슷한 질문 : 프로그래밍 방식으로 C ++에서 CPU 캐시 페이지 크기를 얻는 방법은 무엇입니까?



답변

Linux (합리적으로 최신 커널 사용)에서이 정보를 / sys에서 얻을 수 있습니다.

/sys/devices/system/cpu/cpu0/cache/

이 디렉토리에는 각 레벨의 캐시에 대한 서브 디렉토리가 있습니다. 각 디렉토리에는 다음 파일이 포함되어 있습니다.

coherency_line_size
level
number_of_sets
physical_line_partition
shared_cpu_list
shared_cpu_map
size
type
ways_of_associativity

이것은 캐시 라인 크기 ( coherency_line_size)와이 캐시를 공유하는 CPU를 포함하여 캐시에 대한 자세한 정보를 제공합니다 . 공유 데이터로 다중 스레드 프로그래밍을 수행하는 경우 매우 유용합니다 (데이터를 공유하는 스레드가 캐시를 공유하는 경우 더 나은 결과를 얻을 수 있습니다).


답변

Linux에서는 sysconf (3)를보십시오.

sysconf (_SC_LEVEL1_DCACHE_LINESIZE)

getconf를 사용하여 명령 행에서 가져올 수도 있습니다.

$ getconf LEVEL1_DCACHE_LINESIZE
64

답변

캐시 라인 관련 작업을하고 있으며 크로스 플랫폼 기능을 작성해야했습니다. https://github.com/NickStrupat/CacheLineSize 에서 github 저장소에 커밋 하거나 아래 소스를 사용할 수 있습니다. 당신이 원하는대로 자유롭게 할 수 있습니다.

#ifndef GET_CACHE_LINE_SIZE_H_INCLUDED
#define GET_CACHE_LINE_SIZE_H_INCLUDED

// Author: Nick Strupat
// Date: October 29, 2010
// Returns the cache line size (in bytes) of the processor, or 0 on failure

#include <stddef.h>
size_t cache_line_size();

#if defined(__APPLE__)

#include <sys/sysctl.h>
size_t cache_line_size() {
    size_t line_size = 0;
    size_t sizeof_line_size = sizeof(line_size);
    sysctlbyname("hw.cachelinesize", &line_size, &sizeof_line_size, 0, 0);
    return line_size;
}

#elif defined(_WIN32)

#include <stdlib.h>
#include <windows.h>
size_t cache_line_size() {
    size_t line_size = 0;
    DWORD buffer_size = 0;
    DWORD i = 0;
    SYSTEM_LOGICAL_PROCESSOR_INFORMATION * buffer = 0;

    GetLogicalProcessorInformation(0, &buffer_size);
    buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)malloc(buffer_size);
    GetLogicalProcessorInformation(&buffer[0], &buffer_size);

    for (i = 0; i != buffer_size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ++i) {
        if (buffer[i].Relationship == RelationCache && buffer[i].Cache.Level == 1) {
            line_size = buffer[i].Cache.LineSize;
            break;
        }
    }

    free(buffer);
    return line_size;
}

#elif defined(linux)

#include <stdio.h>
size_t cache_line_size() {
    FILE * p = 0;
    p = fopen("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", "r");
    unsigned int i = 0;
    if (p) {
        fscanf(p, "%d", &i);
        fclose(p);
    }
    return i;
}

#else
#error Unrecognized platform
#endif

#endif

답변

x86에서 함수 2와 함께 CPUID 명령어를 사용 하여 캐시 및 TLB의 다양한 속성을 결정할 수 있습니다 . 함수 2의 출력 구문 분석은 다소 복잡하므로 인텔 프로세서 식별 및 CPUID 명령 (PDF)의 3.1.3 절을 참조합니다 .

C / C ++ 코드에서이 데이터를 가져 오려면 인라인 어셈블리, 컴파일러 내장 함수를 사용하거나 외부 어셈블리 함수를 호출하여 CPUID 명령을 수행해야합니다.


답변

SDL2를 사용하는 경우이 기능을 사용할 수 있습니다.

int SDL_GetCPUCacheLineSize(void);

L1 캐시 라인 크기를 바이트 단위로 반환합니다.

내 x86_64 컴퓨터에서이 코드 스 니펫을 실행하십시오.

printf("CacheLineSize = %d",SDL_GetCPUCacheLineSize());

생산 CacheLineSize = 64

조금 늦었지만 향후 방문자를위한 정보를 추가하는 것만 알고 있습니다. SDL 문서에 따르면 현재 반환 된 숫자는 KB이지만 실제로는 바이트입니다.


답변

Windows 플랫폼에서 :

에서 http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx

GetLogicalProcessorInformation 함수는 시스템에서 사용중인 논리 프로세서의 특성을 제공합니다. RelationCache 유형의 항목을 찾는 함수가 리턴 한 SYSTEM_LOGICAL_PROCESSOR_INFORMATION을 진행할 수 있습니다. 이러한 각 항목에는 항목이 적용되는 프로세서를 알려주는 ProcessorMask가 포함되어 있으며, CACHE_DESCRIPTOR에서는 어떤 유형의 캐시가 설명되고 있으며 캐시 라인의 크기가 그 캐시에 얼마나 큰지를 알려줍니다.


답변

ARMv6 이상에는 C0캐시 유형 레지스터가 있습니다. 그러나 권한 모드에서만 사용할 수 있습니다.

예를 들어, Cortex ™ -A8 기술 참조 설명서 :

캐시 유형 레지스터의 목적은 주소 범위를 무효화 할 수 있도록 명령 및 데이터 캐시 최소 라인 길이 (바이트)를 결정하는 것입니다.

캐시 유형 레지스터는 다음과 같습니다.

  • 읽기 전용 레지스터
  • 권한 모드에서만 액세스 할 수 있습니다.

캐시 유형 레지스터의 내용은 특정 구현에 따라 다릅니다. 그림 3-2는 캐시 유형 레지스터의 비트 배열을 보여줍니다.


ARM 프로세서에 캐시가 있다고 가정하지 마십시오 (아마도 일부는 캐시없이 구성 할 수 있음). 그것을 결정하는 표준 방법은 C0입니다. 로부터 ARM ARM , 페이지 B6-6 :

ARMv6부터 시스템 제어 보조 프로세서 캐시 유형 레지스터는 L1 캐시를 정의하는 필수 방법입니다 (B6-14 페이지의 캐시 유형 레지스터 참조). 또한 이전 아키텍처 변형에 권장되는 방법입니다. 또한 B6-12 페이지의 추가 수준의 캐시에 대한 고려 사항은 수준 2 캐시 지원에 대한 아키텍처 지침을 설명합니다.