volatile memory barrier等一些资料

前段时间公司将一个软件平台从intel平台移植到loongson 3a平台,遇到了几个莫名奇妙的问题。

现象是两次取内存的值不一样,场景基本上是两个进程共享内存,一个读,一个写。

由于是应对国产化的潮流而进行的一个预研的项目,投入的时间不多,问题最后也没有解决。

当时怀疑是cache alias的问题,因为loongson 3a 的L1 cache使用逻辑index,物理tag,

但最后研究手册发现他利用16k页,利用这种巧妙的方式避免了cache alias的问题。

最近查阅相关资料,新找到了几个方向,先记下来,如果有机会(公司比较扣,借的厂家的设备,最后也是到期了厂家不借了,项目终止。现在依然没设备)的话,处理下。

1、loonson 3a平台上,字、双字的内存读写不是原子的,或者在某些条件下不是原子的。

2、编译器优化导致了指令乱序

3、若指令序 导致CPU执行时指令乱序

下面把查阅的指令归档一下,到时候深入的研究研究。

CPU Cache and Memory Ordering

C-volatile关键字深度剖析

LINUX内核内存屏障

Memory-Barriers-Are-Like-Source-Control-Operations

Memory-Consistency-Models

MIPS-R4000-Microprocessor

User-space-RCU-Memory-barrier-menagerie

what-every-programmer-should-know-about-memory

时间: 2024-12-28 21:31:06

volatile memory barrier等一些资料的相关文章

memory barrier 内存栅栏 并发编程

并发编程 memory barrier (内存栅栏) CPU级 1.CPU中有多条流水线,执行代码时,会并行进行执行代码,所以CPU需要把程序指令 分配给每个流水线去分别执行,这个就是乱序执行: 2.CPU中有read buffer/ write buffer 这2个读写缓存,这2个部件用于缓存CPU对内存的读写操作,并不是实时同步到CPU缓存(L1/L2/L3),这个就会导致更新一块内存后,其他CPU感知不到: 读取的时候,优先到read buffer找数据,找到了,就用这个数据了,如果这时内

并行计算之Memory barrier(内存

本文转载自:http://name5566.com/4535.html 参考文献列表:http://en.wikipedia.org/wiki/Memory_barrierhttp://en.wikipedia.org/wiki/Out-of-order_executionhttps://www.kernel.org/doc/Documentation/memory-barriers.txt 本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构.所有罗列的 Linu

Memory barrier——WiKi

A memory barrier, also known as a membar, memory fence or fence instruction, is a type of barrier instruction which causes a central processing unit (CPU) orcompiler to enforce an ordering constraint on memory operations issued before and after the b

内存屏障 & Memory barrier

Memory Barrier http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这里面讲了Memory Barrier 对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的"所见"和最后的执行结果隔着: 1.编译器 2.CPU取指执行 编译器了解底层CPU的思维模式,因此,它可以在将c翻译成汇编的时候进行优化(例如内存访问指令的重新

Notes on Locks

Spinlock an non-scalable implementation in C++ # if defined __GNUC__# include <pthread.h> class Spinlock { # if (__GNUC__ >= 4) private: pthread_spinlock_t _spinlock; public: Spinlock() { pthread_spin_init(&_spinlock, PTHREAD_PROCESS_PRIVATE)

#define barrier() __asm__ __volatile__(&quot;&quot;: : :&quot;memory&quot;) 中的memory是gcc的东西

gcc内嵌汇编简介 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm__"的别名.&

volatile变量

一.volatile概述 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址(内存)中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象.下面举例说明. volatile一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等. 二.volatile使用案例 在DSP开发中,经常需要等待某个事件的触发,所以经常会写

C++ 中 volatile 的使用

一.作用 volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 简单地说就是防止编译器对代码进行优化.比如如下程序:XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58;对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码).如果键入volatile,则编译器会逐

详解C中volatile关键字(转载)

原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象.下面举例说明.在DSP开发中,经常需要等待某个事件的触发,所以经常会写出