具体编译过程,请参见GCC官网相关文档。
1 2 |
tar -zxvf fifo.tar.gz ls |
1
|
make |
1
|
./one_producer_one_consumer |
源码中是一个单生产者单消费者的无锁队列,其中生产者会依次向栈中推入1,2,3三个int类型数据,消费者会读取栈中数据并向r1,r2,r3三个int类型变量赋值,在没有内存一致性错误发生时,预期结果应为r1=1,r2=2,r3=3。
执行结果:20000次测试中,复现内存一致性问题共计12次。
内存一致性修复组件: 从DevKit安装路径下,找到 “/opt/DevKit/devkitplugins/affinity/tools/weakconsistency/gccchecker/gcctool.tar.gz”。
“/opt/DevKit”为工具安装目录,请根据实际情况替换。
1
|
tar xf gcctool.tar.gz |
解压后确认“gcctool/bin”目录下有以下文件:gcctool,gcctool-bin,libstdc++.so.6
将“gcctool”放入自定义目录,配置环境变量:export PATH=/path/to/gcctool/bin:$PATH
其中,“/path/to”为gcctool存放的自定义目录。
GCC修复工具 patch:https://github.com/kunpengcompute/devkitdriver/tree/main/gccchecker(Debian系列和Redhat系列操作系统都使用该依赖包。)
1
|
tar -xvf gcc-9.3.0.tar.gz |
cd gcc-9.3.0/ patch -p1 < /path/to/gcc-9.3.0.patch
进入fifo源码目录,设置内存一致性修复组件优化等级“export HW_DEBUG=[ 0 | 1 | 2 ]”。当前实践内容设置组件优化等级为1,执行make命令进行编译。
1 2 3 |
export HW_DEBUG=1 make clean make |
1
|
objdump -d one_producer_one_consumer | grep dmb | head -20 |
即可显示20个自动修复的位置,如图5所示。
编译组件支持通过环境变量配置修复优化等级,不设置环境变量,修复工具不会生效。
export HW_DEBUG=[ 0 | 1 | 2 ]
1
|
./one_producer_one_consumer |
连续执行可执行文件中的测试,执行20000次未出现内存一致性问题,编译器自动修复工具生效,如图6所示。
fifo源码在未使用修复工具时,共执行了20000次测试,其中12次执行异常。使用修复工具后,插入了20000个内存屏障指令,继续执行20000次测试,没有出现异常现象。