C语言for循环使用OMP出现CPU占满死循环问题如何解决?
问题原因分析
- 共享变量竞争导致死循环
你第一段代码的number2定义在#pragma omp parallel for外部,OpenMP默认会将并行区域外定义的变量视为所有线程共享的变量。多个线程同时对同一个number2进行读写操作时,值会被互相覆盖:比如线程A刚把number2赋值为当前迭代的number值,线程B立刻修改为自己迭代的数值,导致number2永远无法满足等于1的退出条件,进入无限循环,CPU被跑满也无法结束。
而你第二段可以正常运行的代码,把number2定义在了并行for循环的内部,OpenMP会默认将并行区域内部定义的变量设为线程私有变量,每个线程都有独立的number2副本,不会被其他线程修改,因此可以正常执行。 - 关于数据溢出的补充说明
3n+1计算过程中数值会出现阶段性暴涨,如果使用有符号整数类型,溢出属于C标准未定义行为,确实可能出现数值异常导致死循环。无符号整数溢出是明确定义为模2^n的行为,但如果溢出后数值进入无法收敛到1的循环,也会出现死循环,建议根据计算范围选择足够宽的无符号整数类型(比如uint64_t)规避这类问题。
内容的提问来源于stack exchange,提问作者Digitful
相关产品推荐
相关产品推荐

