如何使用DataRaceBench 1.3.2检测自定义Fortran代码的数据竞争
已安装工具的基础作用
- ThreadSanitizer(TSan):谷歌开发的运行时数据竞争检测工具,支持OpenMP、Pthread等并行模型,编译时插桩,运行时捕捉内存访问冲突,误报率较低但会带来数倍的运行开销
- Archer:基于LLVM的OpenMP专属数据竞争检测工具,结合了静态分析和TSan的运行时检测能力,针对OpenMP语义做了优化,比原生TSan检测OpenMP程序的效率和准确率更高
- ROMP:专门针对OpenMP程序的运行时竞争检测工具,不需要编译插桩,通过动态插桩实现,开销比TSan低,适合大规模OpenMP程序的检测
- Coderrect Scanner:静态+动态混合并行程序错误检测工具,支持Fortran、C、C++的OpenMP、MPI等模型,可直接扫描代码输出潜在竞争点,不需要运行程序
适配你的
poisson_openmp.f90代码的测试流程 不用把代码硬套进DRB自带的测试集,有两种测试方式可选:
方式1:直接用单个工具测试(最简单)
无需调用DRB的脚本,直接用安装好的工具编译运行你的代码即可,比如用Archer测试Fortran OpenMP代码的命令如下:
# 用Archer编译器编译你的代码 archer poisson_openmp.f90 -o poisson -fopenmp # 运行程序即可自动检测数据竞争 ./poisson
方式2:纳入DRB框架测试(方便对比多工具检测结果)
如果你需要用DRB统一调度多个工具测试、生成统一格式的报告,按如下操作:
- 把你的
poisson_openmp.f90放到DRB仓库的micro-benches/fortran/openmp目录下 - 修改同目录下的
Makefile,参考现有测试用例的规则,添加你的代码的编译规则 - 打开DRB根目录的
list.def,删除原有内容,填入你新增的测试用例名,比如poisson_openmp.f90 - 打开
tool.def,填入你要用来测试的工具名,比如romp archer tsan coderrect - 运行如下命令启动测试:
./check-data-races.sh --customize
测试完成后DRB会自动统计每个工具检测到的竞争数量、误报漏报情况,如果需要自动统计准确率,你可以参考现有测试用例的注释格式,在你的代码里标注是否有预期竞争即可。
check-data-races.sh常用用法说明 - 用ROMP工具运行全量Fortran测试用例:
./check-data-races.sh --romp fortran - 用ThreadSanitizer运行全量C测试用例:
./check-data-races.sh --tsan c - 查看所有可用参数:
./check-data-races.sh --help - 按
list.def和tool.def的配置自定义运行测试:./check-data-races.sh --customize
关于容器的说明
DRB官方提供的容器是预装了所有依赖工具、DRB环境的镜像文件,不需要手动安装TSan、Archer等工具,直接拉取镜像就能运行所有测试,你已经手动安装好所有工具的话不需要再使用容器。
内容的提问来源于stack exchange,提问作者hakim
相关产品推荐
相关产品推荐

