memory-barriers相关内容

C11原子获取/发布和x86_64缺乏加载/存储一致性?

我正在努力解决C11标准的5.1.2.4节,尤其是Release/Acquire的语义.我注意到 https://preshing.com/20120913/acquire-and-release-semantics/(以及其他)指出: ...释放语义可防止以程序顺序在写释放之前进行任何读或写操作,从而对写释放进行内存重新排序. 因此,对于以下情况: typedef struct ..
发布时间:2020-07-10 01:02:08 其他开发

自旋锁是否总是需要内存屏障?在内存屏障上旋转是否昂贵?

我写了一些无锁代码,可以在本地使用 在大多数情况下都可以读取. 在内存上进行局部旋转是否必然意味着我 必须始终在旋转之前插入存储屏障 阅读吗? (为验证这一点,我设法产生了一个读取器/写入器 导致读者永远看不到 书面价值,在某些非常具体的情况下 条件-专用CPU,附加到CPU的进程, 优化器一路调高,没有其他工作 循环-箭头确实指向该方向,但我不是 完全确定通过内存旋转的成本 障碍.) ..
发布时间:2020-07-08 19:43:53 其他开发

LFENCE是否在AMD处理器上序列化?

在最近的Intel ISA文档中,已将 lfence 指令定义为序列化指令流(防止在其中执行乱序执行) 。特别是,指令的说明包括以下行: 具体来说,只有在本地完成所有先前的指令后,才会执行LFENCE,直到LFENCE完成之后,才开始执行后续的指令。 请注意,这不仅适用于 all 指令,还不仅适用于内存加载指令,还使 fences 不仅仅是一个内存排序栅栏。 尽管这现在出现在IS ..

glGenerateMipmap需要哪个内存屏障?

我已经使用GL_ARB_shader_image_load_store写入了纹理的第一个mipmap级别.文档指出,在其他操作中使用该映像的内容之前,需要先调用glMemoryBarrier,以便适当地刷新缓存. 例如,在执行glTexSubImage2D操作之前,我需要发出GL_TEXTURE_UPDATE_BARRIER_BIT,并且在使用使用该纹理采样的着色器发出绘制调用之前,我需要发 ..
发布时间:2020-05-20 23:16:10 其他开发

在OpenCL中,相对于barrier(),mem_fence()的作用是什么?

与barrier()(我想我理解)不同,mem_fence()不会影响工作组中的所有项目.对于mem_fence(): ,OpenCL规范说(第6.11.10节): 命令加载和存储执行内核的工作项. (因此它适用于单个工作项). 但是,与此同时,在第3.3.1节中,它表示: 在工作项内存中具有加载/存储一致性. 在一个工作项之内,内存是一致的. 那么mem_f ..
发布时间:2020-05-20 18:55:18 其他开发

为什么获取和释放内存隔离栅的值不一致?

我只是探索使用获取和释放内存围栏的方法,而不理解为什么我有时有时将输出值设为零而不是始终将值设为2的原因 我多次运行该程序,并假设释放障碍之前的原子存储和获取障碍之后的原子负载将确保值始终同步 #include #include #include std::atomicx; void write() { ..
发布时间:2020-05-14 01:09:03 C/C++开发

在不同的CPU内核上调度线程时,预期的内存语义(如写入后读取)会发生什么?

单个线程中的代码具有一定的内存保证,例如写后读取(即,将一些值写到内存位置,然后再读回应该给出您所写的值). 如果将线程重新计划为在其他CPU内核上执行,那么这种内存保证会发生什么?假设某个线程将10写入内存位置X,然后重新安排到另一个内核.该内核的L1缓存的X值可能与先前在该内核上执行的另一个线程的X值不同,因此现在读取X不会像线程期望的那样返回10.在不同内核上调度线程时是否发生某些L1 ..

无锁编程:重新排序和存储顺序语义

我试图在无锁编程中站稳脚跟.阅读了有关内存排序语义的不同解释后,我想弄清楚可能发生什么重新排序.据我了解,指令可能会由编译器(由于在编译程序时进行了优化)和CPU(在运行时?)重新排序. 对于宽松的语义, cpp参考提供了以下示例: // Thread 1: r1 = y.load(memory_order_relaxed); // A x.store(r1, memory_order ..
发布时间:2020-05-14 00:08:14 其他开发

轻松订购是一个信号

假设我们有两个线程.一个发出“走"的声音,另一个等待发出去的东西. 此代码是否正确,或者由于缓存或类似原因我是否可以进行“无限循环"? std::atomic_bool canGo{false}; void producer() { while(canGo.load(memory_order_relaxed) == false); produce_data(); } ..
发布时间:2020-05-13 23:18:44 C/C++开发

具有非原子变量的C ++ 11原子存储顺序

我不确定c ++ 11中原子变量的内存排序保证如何影响对其他内存的操作. 假设我有一个线程定期调用write函数以更新值,而另一个线程调用read以获取当前值. 是否可以保证d = value;的效果不会在a = version;的效果之前看到,并且会在b = version;的效果之前看到? atomic a {0}; atomic b {0}; double ..
发布时间:2020-05-13 22:54:01 C/C++开发

GCC使用`memory_order_seq_cst`跨负载重新排序.可以吗?

使用基本 seqlock 的简化版本,gcc会重新排列整个原子上的非原子负载使用-O3编译代码时,使用load(memory_order_seq_cst).使用其他优化级别进行编译或使用clang进行编译(即使在O3上)时,也不会观察到这种重新排序.这种重新排序似乎违反了应该建立的同步关系,我很好奇为什么gcc会对这种特殊负载进行重新排序,甚至标准也允许这样做. 请考虑以下load函数: ..
发布时间:2020-05-13 22:48:50 C/C++开发

在thread :: join上是否存在具有与同步关系的隐式内存屏障?

我有一个正在工作的代码,它启动多个执行某些操作的线程,如果其中任何一个失败,则将共享变量设置为 false . 然后,主线程加入所有工作线程.对此的模拟大致如下(我注释掉了可能的修复程序,我不知道是否需要此修复程序): #include #include #include #include #include ..
发布时间:2020-05-13 21:59:01 C/C++开发

假设没有非临时性指令,"xchg"是否包含"mfence"?

我已经看到此答案和英特尔说明参考对于xchg提到此指令对于实现信号量或类似的数据结构以进行进程同步很有用,并进一步参考了 对于P6系列处理器,锁定操作会序列化所有 出色的加载和存储操作(即等待它们执行 完全的).对于Pentium 4和Intel Xeon也适用此规则 处理器,只有一个例外.加载弱引用的操作 有序内存类型(例如WC内存类型)可能不是 序列化. mfence文档声称以下内容. ..
发布时间:2020-05-13 21:35:03 其他开发