Julia中并行@simd运算远慢于串行@simd且结果错误问题
Julia 并行场景下
@simd与@spawn联用触发性能暴跌、数值异常问题 问题背景
需要针对不同初始条件向量反复求解大规模常微分方程(ODE)系统,示例中系统包含127个状态/ODE方程,实际应用场景规模可达1000-2000个状态,后续需运行数百至数千次完成推断任务,因此对计算速度要求极高。测试环境启动Julia时设置JULIA_NUM_THREADS=auto,本机共分配8个CPU线程,并行逻辑严格控制同时派发的任务数不超过可用线程数。
异常现象
测试共对比4种实现的运行耗时与计算结果:
- 串行无
@simd版本:平均耗时约0.9秒,结果正确稳定 - 串行
@simd版本:平均耗时约0.045秒,结果正确稳定,速度较普通串行版本提升近20倍 - 基于
@spawn的并行无@simd版本:平均耗时约0.35秒,结果正确稳定,速度较串行普通版本提升约2.5倍 - 基于
@spawn的并行@simd版本:平均耗时达140秒左右,速度远低于其余所有实现,且输出的sum_of_solutions结果波动、数值错误
两个并行实现的逻辑完全一致,仅核心ODE求解操作分别调用无@simd的core_op_plain与带@simd的core_op_simd函数,怀疑@simd与@spawn存在线程层面的冲突。已提供可直接从头运行的完整复现代码(自动下载依赖的模型结构文件),寻求问题定位与修正方案。
内容的提问来源于stack exchange,提问作者Nicholas J. Matzke
相关产品推荐
相关产品推荐

