标签: cpu-cache

Java内存模型(JSR-133)是否意味着进入监视器会刷新CPU数据缓存?

有一些东西让我对Java内存模型感到困扰(如果我甚至正确理解了所有内容).如果有两个线程A和B,则无法保证B将看到A写入的值,除非A和B在同一监视器上同步.

对于保证线程之间的高速缓存一致性的任何系统体系结构,没有问题.但是,如果架构不支持硬件中的缓存一致性,这实质上意味着每当线程进入监视器时,之前所做的所有内存更改都必须提交到主内存,并且缓存必须无效.它需要是整个数据缓存,而不仅仅是几行,因为监视器没有信息,它在内存中保存哪些变量.但这肯定会影响任何需要频繁同步的应用程序的性能(特别是像短时间运行的作业队列这样的事情).那么Java可以在没有硬件缓存一致性的架构上合理地工作吗?如果没有,为什么内存模型不能提供更强的可见性保证?如果语言需要监视器保护的信息,那会不会更有效率?

正如我所看到的,内存模型给我们带来了两个世界中最糟糕的,绝对需要同步,即使硬件中保证了高速缓存一致性,另一方面,非相干体系结构上的性能不佳(完全高速缓存刷新).因此,它不应该更严格(需要信息由监视器保护)或更多地丢失和限制缓存一致的架构的潜在平台?

就像现在一样,它对我来说没有多大意义.有人可以清楚为什么选择这种特定的记忆模型吗?


编辑:回想起来,我对严格和失败的使用是一个糟糕的选择.我对"保证较少"的情况使用"严格",而对相反则"丢失".为了避免混淆,最好用更强或更弱的保证来说话.

java multithreading synchronization memory-model cpu-cache

17
推荐指数
2
解决办法
1121
查看次数

您将如何从用户模式代码中一般性地检测缓存行关联性?

我正在为valgrind中的cachegrind/callgrind工具整理一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86/x64自动配置,而其他架构不提供CPUID类型配置为非特权代码).此代码需要完全在非特权上下文中执行,即纯用户模式代码.它还需要可以在非常不同的POSIX实现中移植,因此grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西.

检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行).这部分相当简单.

什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是缓存中可以包含来自主内存的给定缓存行的位数.我可以看到可以检测到L1缓存关联性,但L2缓存?当然L1关联性会受到影响吗?

我很欣赏这可能是一个无法解决的问题.但我把它扔到StackOverflow上,并希望有人知道我不知道的事情.请注意,如果我们在这里失败,我将简单地以四方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响.

谢谢,
尼尔

c valgrind cpu-architecture cpu-cache

17
推荐指数
1
解决办法
2626
查看次数

"非本地"指针是否会影响缓存性能?

据我所知,硬件预取器至少会检测并通过内存获取持续的步幅.此外,它可以监控数据访问模式,无论真正意味着什么.这让我想知道,硬件预取程序是否会根据存储在内存中的实际数据做出决定,还是纯粹基于程序所展示的行为?

我问的原因是因为我偶尔会使用"非本地"指针作为指针.一个简单的例子就是预分配的东西数组,以及索引这个数组而不是指针的小整数.如果我需要存储大量这样的"指针",内存的节省可以快速增加,并通过使用更少的内存间接提高缓存性能.

但据我所知,这可能会干扰硬件预取器的工作方式.或不!

我可以想象,现实与否,预取单元检查进入L1缓存的缓存行以获取本机指针地址并开始将它们提取到L2或某些此类事物中.在那种情况下,我拯救记忆的聪明伎俩突然变得不那么聪明了.

那么,现代硬件预取器的作用是什么呢?他们可以被"非本地"指针绊倒吗?

c c++ optimization prefetch cpu-cache

17
推荐指数
2
解决办法
608
查看次数

内存屏障是否确保缓存一致性已完成?

假设我有两个线程来操纵全局变量x.每个线程(或我认为的每个核心)都有一个缓存副本x.

现在说Thread A执行以下说明:

set x to 5
some other instruction
Run Code Online (Sandbox Code Playgroud)

现在set x to 5执行时,缓存的值x将设置为5,这将导致缓存一致性协议使用新值来操作和更新其他核心的缓存x.

现在我的问题是:什么时候x实际设置5Thread A缓存中,其他内核的缓存在some other instruction执行之前是否会更新?或者应该使用内存屏障来确保?:

set x to 5
memory barrier
some other instruction
Run Code Online (Sandbox Code Playgroud)

注意:假设指令是按顺序执行的,也假设set x to 5执行时,5会立即放入线程A的缓存中(因此指令不会放在队列中或稍后要执行的内容).

x86 assembly operating-system memory-barriers cpu-cache

16
推荐指数
2
解决办法
1513
查看次数

CPU缓存如何影响C程序的性能

我试图更多地了解 CPU 缓存如何影响性能。作为一个简单的测试,我将矩阵第一列的值与不同数量的总列数相加。

// compiled with: gcc -Wall -Wextra -Ofast -march=native cache.c
// tested with: for n in {1..100}; do ./a.out $n; done | tee out.csv
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double sum_column(uint64_t ni, uint64_t nj, double const data[ni][nj])
{
    double sum = 0.0;
    for (uint64_t i = 0; i < ni; ++i) {
        sum += data[i][0];
    }
    return sum;
}

int compare(void const* _a, void const* _b)
{
    double const a = *((double*)_a);
    double …
Run Code Online (Sandbox Code Playgroud)

c performance cpu-cache

16
推荐指数
1
解决办法
1144
查看次数

设计代码以适应CPU缓存?

在编写模拟时,我的伙伴说他喜欢尝试编写足够小的程序以适应缓存.这有什么实际意义吗?据我所知,缓存比RAM和主内存快.是否可以指定您希望程序从缓存运行或至少将变量加载到缓存中?我们正在编写模拟,因此任何性能/优化收益都是巨大的好处.

如果您知道任何解释CPU缓存的好链接,那么请指出我的方向.

c performance caching cpu-architecture cpu-cache

15
推荐指数
4
解决办法
8329
查看次数

现代CPU的每个刻度的缓存带宽

现代CPU的缓存访问速度是多少?Intel P4,Core2,Corei7,AMD每个处理器时钟周期内可以从内存中读取或写入多少字节?

请回答理论(ld/sd单位的宽度及其uOPs/tick的吞吐量)和实际数字(甚至是memcpy速度测试,或STREAM基准测试),如果有的话.

PS是问题,与汇编程序中的最大加载/存储指令率有关.可以有理论加载速率(所有每个Tick的指令都是最宽的负载),但是处理器只能给出部分这样的,一个实际的加载限制.

cpu performance caching cpu-architecture cpu-cache

15
推荐指数
2
解决办法
7843
查看次数

测量L1和L2缓存的大小和方式顺序

如何以编程方式测量(不查询操作系统)L1和L2缓存(数据缓存)的关联性的大小和顺序?

关于系统的假设:

  • 它有L1和L2缓存(也可能是L3,可能是缓存共享),
  • 它可能有一个硬件预取单元(就像P4 +),
  • 它有一个稳定的时钟源(tickcounter或良好的HPET for gettimeofday).

没有关于操作系统的假设(它可以是Linux,Windows或其他),我们不能使用POSIX查询.

语言为C,可能禁用编译器优化.

c cpu-cache

15
推荐指数
1
解决办法
6249
查看次数

文件支持的内存映射的CPU缓存行为/策略?

有谁知道在现代x86系统上将哪种类型的CPU缓存行为或策略(例如,不可缓存的写入组合)分配给内存映射文件支持的区域?

有没有办法检测是哪种情况,并可能覆盖默认行为?

Windows和Linux是您感兴趣的主要操作系统.

(编者注:此问题以前被称为内存映射I/O,但该短语具有不同的特定技术含义,特别是在谈论CPU缓存时.即与负载通信的实际I/O设备,如NIC或视频卡/商店.

这个问题实际上是关于什么样的内存mmap(some_fd, ...),当你不使用MAP_ANONYMOUS并且它由磁盘上的常规文件支持时.)

c++ x86 operating-system cpu-architecture cpu-cache

15
推荐指数
1
解决办法
2834
查看次数

什么是_mm_prefetch()位置提示?

内部函数导说,只有这么多关于void _mm_prefetch (char const* p, int i):

从包含地址p的内存中获取数据行到由locality hint i指定的缓存层次结构中的位置.

你能列出int i参数的可能值并解释它们的含义吗?

我发现_MM_HINT_T0,_MM_HINT_T1,_MM_HINT_T2,_MM_HINT_NTA_MM_HINT_ENTA,但我不知道这是否是一个详尽的列表和它们的含义.

如果特定于处理器,我想知道他们在Ryzen和最新的英特尔酷睿处理器上做了什么.

c++ x86-64 prefetch intrinsics cpu-cache

15
推荐指数
1
解决办法
7077
查看次数