OpenMP循环使用动态数组结果与串行版本不一致问题排查
OpenMP并行计算arrayrmsd多线程结果不一致问题
问题概述
- 需求:计算nmol×nmol的方阵
arrayrmsd,核心逻辑是调用optimize()函数对比分子结构与arrcar[]中的结构,将数值差存入arrayrmsd[i,j] - 并行设计:由于
optimize()会修改第一个参数,为每个线程分配了独立的mol_omp数组元素,并行执行内层循环 - 异常表现:串行版本与
OMP_NUM_THREADS=1的并行版本结果一致,但线程数>1时,arrayrmsd内容出现明显的、非数值近似导致的差异
补充信息
arrcar数组为只读状态,不会被任何代码修改- 使用
molcpy函数完成分子结构的复制操作
更新结论
排查确认当前代码及OpenMP指令本身无错误,问题根源在于
optimize()调用的某个子函数中存在隐蔽的数据竞争(data race)
内容的提问来源于stack exchange,提问作者Carlo Nervi
相关产品推荐
相关产品推荐

