spi*_*ire 170

在Linux上(使用合理的最新内核),您可以从/ sys获取此信息:

/sys/devices/system/cpu/cpu0/cache/
Run Code Online (Sandbox Code Playgroud)

此目录具有每个级别的缓存的子目录.每个目录都包含以下文件:

coherency_line_size
level
number_of_sets
physical_line_partition
shared_cpu_list
shared_cpu_map
size
type
ways_of_associativity
Run Code Online (Sandbox Code Playgroud)

这为您提供了有关您希望了解的缓存的更多信息,包括缓存行大小(coherency_line_size)以及共享此缓存的CPU.如果您使用共享数据进行多线程编程,这将非常有用(如果共享数据的线程也共享缓存,您将获得更好的结果).

  • coherency_line_size (24认同)
  • 可以肯定:这是字节,是吗? (6认同)
  • 是的,coherency_line_size以字节为单位. (5认同)
  • 哪个文件包含缓存行大小?我假设coherency_line_size?还是physical_line_partition? (4认同)
  • @android:我使用带有core-i5处理器的fedora-18 x64机器.`cat/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size`在我的系统中返回`64`.对于index1,2,3文件夹也是如此. (4认同)
  • 该技术不适用于“ Linux的Windows子系统”,但是`sysconf(_SC_LEVEL1_DCACHE_LINESIZE)`适用于WSL。 (2认同)

ob1*_*ob1 133

在Linux上查看sysconf(3).

sysconf (_SC_LEVEL1_DCACHE_LINESIZE)
Run Code Online (Sandbox Code Playgroud)

您也可以使用getconf从命令行获取它:

$ getconf LEVEL1_DCACHE_LINESIZE
64
Run Code Online (Sandbox Code Playgroud)

  • 简单的答案是最好的! (4认同)
  • @warunapww以字节为单位。 (3认同)

Nic*_*pat 117

我一直在研究一些缓存行的东西,需要编写一个跨平台的功能.我将它提交到https://github.com/NickStrupat/CacheLineSize上的github repo ,或者您可以使用下面的源代码.随意用它做任何你想做的事.

#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
Run Code Online (Sandbox Code Playgroud)

  • 可能更好的使用sysconf(_SC_LEVEL1_DCACHE_LINESIZE)用于linux. (15认同)

Ada*_*eld 31

在x86上,您可以使用带有功能2 的CPUID指令来确定缓存和TLB的各种属性.解析函数2的输出有点复杂,因此我将向您介绍英特尔处理器标识的第3.1.3节和CPUID指令(PDF).

要从C/C++代码获取此数据,您需要使用内联汇编,编译器内在函数或调用外部汇编函数来执行CPUID指令.

  • @ceretullis:错误... x86内置了缓存.你还特意寻找什么"其他处理器"?你要求的是平台依赖. (3认同)

neg*_*tin 9

如果您使用的是SDL2,则可以使用此功能:

int SDL_GetCPUCacheLineSize(void);
Run Code Online (Sandbox Code Playgroud)

返回L1缓存行大小的大小(以字节为单位).

在我的x86_64机器上,运行此代码段:

printf("CacheLineSize = %d",SDL_GetCPUCacheLineSize());
Run Code Online (Sandbox Code Playgroud)

产生 CacheLineSize = 64

我知道我有点晚了,但只为未来的访客添加信息.SDL文档目前说返回的数字是KB,但实际上是以字节为单位.


Edu*_*yan 9

从 C++17 开始,您可以使用std::hardware_delta_interference_size
其定义为:

两个对象之间的最小偏移量以避免错误共享。保证至少是alignof(std::max_align_t)


Lor*_*cia 7

在Windows平台上:

来自http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx

GetLogicalProcessorInformation函数将为您提供系统使用的逻辑处理器的特性.您可以遍历函数返回的SYSTEM_LOGICAL_PROCESSOR_INFORMATION,查找RelationCache类型的条目.每个这样的条目都包含一个ProcessorMask,它告诉您该条目适用于哪个处理器,并且在CACHE_DESCRIPTOR中,它告诉您正在描述什么类型的缓存以及该缓存的缓存行有多大.