memory-barriers相关内容

具有memory_order_relaxed的存储区可能永远不会到达其他线程吗?

假设我有一个线程 A ,它使用 x.store( atomic_int x = 0; 1,std :: memory_order_relaxed); 。如果没有任何其他同步方法,则使用 x.load(std :: memory_order_relaxed); 需要多长时间才能看到其他线程?在给定标准提供的C / C ++内存模型的当前定义的情况下,写入 x 的值是否可能完全保持线程局部性? ..
发布时间:2020-09-27 20:45:20 C/C++开发

x86 mfence和C ++内存屏障

我正在检查编译器如何发出x86_64上的多核内存屏障指令。以下代码是我正在使用 gcc_x86_64_8.3 测试的代码。 std :: atomic标记{false}; int any_value {0}; void set() { any_value = 10; flag.store(true,std :: memory_order_release); ..
发布时间:2020-09-27 18:37:24 其他开发

原子释放可以“被覆盖"吗?

说我有atomic i;线程A使用memory_order_release执行原子存储/交换.接下来,线程B使用memory_order_release执行原子存储.线程C执行原子fetch_add(0,memory_order_acquire); 线程C是否从线程 A和B 或仅线程B 获取依赖项? 解决方案 仅B(我假设通过"next"表示原子的修饰顺序为A -> B - ..
发布时间:2020-09-13 19:27:51 C/C++开发

C ++中的内存障碍示例是什么?

我看到C ++ 11互斥锁不是void lock() volatile.编译器如何知道哪些功能是内存障碍,哪些不是?即使所有功能障碍都不易变,它们是否也存在障碍?什么是鲜为人知的记忆障碍和人人都应该知道的记忆障碍? 解决方案 std::mutex的实际实现是这样的,即编译器不会执行非法的重新排序,不会消除变量加载,并且会确保锁变量是原子访问的,并且CPU为锁的获取和释放执行必要的内存屏障. ..
发布时间:2020-09-13 19:24:03 C/C++开发

易失性vs内存屏障的中断

让x和y是在主代码和中断代码之间共享的变量. 我对volatile的想法是,对于并且也在主代码中使用的硬件变量和中断变量,它始终是唯一需要的. 通过禁用中断,可以保证主代码中x和y的每种用法都是原子的. x和y确实需要为volatile,还是在使用它们强制从RAM重新加载变量之前放置内存屏障是否足够? A) volatile bool x; volatile int ..
发布时间:2020-09-13 19:21:46 其他开发

内存屏障是CPU执行的指令,还是仅仅是标记?

我试图确切地了解什么是内存障碍. 根据目前为止我所知道的,使用内存屏障(例如:mfence)来防止从内存屏障之前到之后以及之后到内存之前重新排序指令. 这是一个正在使用的内存屏障的示例: instruction 1 instruction 2 instruction 3 mfence instruction 4 instruction 5 instruction 6 现在我的问题是 ..

记忆屏障是否既充当标记又充当指示?

关于记忆屏障的工作原理,我有不同的看法. 例如,用户 Johan 在 此问题中的用户 Peter Cordes 的评论关于CPU如何对指令重新排序的内容如下: 它的读取速度快于其执行速度,因此可以看到一个窗口 即将发布的指示.有关详细信息,请参见x86中的某些链接. 标签Wiki,例如Agner Fog的microarch pdf,以及David Kanter的 英特尔Haswell设 ..

在x86/x86_64处理器上使用LFENCE指令有意义吗?

通常在互联网上,我发现LFENCE在x86处理器中毫无意义,也就是说,它什么也不做,因此MFENCE我们绝对可以轻松使用SFENCE,因为MFENCE = SFENCE + = SFENCE + NOP = SFENCE. 但是如果LFENCE没有意义,那么为什么我们有四种方法在x86/x86_64中实现顺序一致性: LOAD(无围栏)和STORE + MFENCE LOAD(无围栏 ..
发布时间:2020-09-12 21:31:40 其他开发

使用有序提交如何进行加载和存储的重新排序?

ARM允许对后续存储进行重新排序,以便使用以下伪代码: // CPU 0 | // CPU 1 temp0 = x; | temp1 = y; y = 1; | x = 1; 可能会导致temp0 == temp1 == 1(在实践中也是可以观察到的).我无法理解这种情况如何发生;似乎按顺序提交会阻止它(据我的理解,几乎所有OOO处理器中都存在).我的推理是:“负载在提交之前必须具有其 ..
发布时间:2020-09-07 02:20:21 其他开发

为什么要刷新其他逻辑处理器引起的内存顺序违规的管道?

内存订单计算机清除性能事件为vTune文档将其描述为: 当来自另一个处理器的侦听请求与管道中的数据操作源相匹配时,将发生内存排序(MO)机器清除.在这种情况下,在撤消正在进行的装载和存储之前,应清理管道. 但是我不明白为什么会这样.在不同逻辑处理器上的加载和存储之间没有同步顺序. 处理器可以在所有当前运行中的数据操作被提交之后,假装监听发生. 此处 每当CPU内核检测到“ ..

如果我不使用隔离墙,一个核心看到另一个核心的写入需要多长时间?

我一直在尝试搜索我的问题,但老实说,我不知道如何简洁地陈述这个问题. 假设我在多核Intel系统中有两个线程.这些线程在同一NUMA节点上运行.假设线程1向X写入一次,然后仅偶尔读取它.除其他事项外,进一步假设线程2连续读取X.如果我不使用内存隔离栅,线程1写入X和线程2看到更新后的值之间需要多长时间? 我知道X的写入将到达存储缓冲区,再从那里写入高速缓存,这时MESIF将启动,线程2 ..
发布时间:2020-07-24 07:43:19 其他开发

如何为TMS320F2812 DSP编写内存屏障?

我已经阅读了TI C/C ++编译器v6.1用户指南(在这方面,asm语句似乎没有提供任何内容,该手册甚至警告不要更改变量的值(p132).用于声明变量影响的GNU扩展未实现(p115). 我也没有发现任何内存障碍的内在因素(例如搜索网络或TI论坛也没有任何结果. 还有其他提示如何进行吗? 解决方案 内存障碍与内存访问的顺序有关,但是您还必须确保值不保留在寄存器中,而是完全写入 ..
发布时间:2020-07-11 00:04:31 其他开发

为什么这个`std :: atomic_thread_fence`工作

首先,我想列出我对此的一些理解,如果我错了,请纠正我. x86中的MFENCE可以确保完全隔离 顺序一致性可防止对STORE-STORE,STORE-LOAD,LOAD-STORE和LOAD-LOAD进行重新排序 这是根据维基百科. std::memory_order_seq_cst无法保证阻止STORE-LOAD重新排序. 这是根据 std::memory_ord ..
发布时间:2020-07-10 01:03:42 C/C++开发