OpenMP并行求解积分时两种面积计算方法结果不一致问题咨询
OpenMP积分计算结果错误问题原因分析
你的第一种计算方法(sum_arr累加每个矩形面积)结果错误是两个低级代码bug共同导致的:
- memset参数错误
你的代码中memset(sum_arr, 0, num_threads);写法有误,memset第三个参数是需要初始化的总内存字节数,你申请的sum_arr总大小是num_threads * sizeof(double),这里仅传入num_threads只会清零前10个字节,剩余的内存都是未初始化的随机值,最终累加sum_arr的时候自然无法得到正确结果。
正确写法应该是:memset(sum_arr, 0, num_threads * sizeof(double)); - 数组下标越界
OpenMP的线程号omp_get_thread_num()返回值是从0开始计数的,你在并行区内写的sum_arr[idx - 1]会导致0号线程访问下标为-1的非法内存:不仅0号线程的计算结果会被写到数组外的内存中丢失,sum_arr[0]也会一直保留未初始化的垃圾值,最终累加结果必然错误。
正确写法应该是直接用idx做下标:sum_arr[idx] += (y * chunk_size);
另外你提到的第二种计算方法(先累加高度再乘步长)结果正确只是巧合:你的sum是全局共享变量,多个线程同时执行sum += y属于典型的数据竞争,是OpenMP编程中的未定义行为,换运行环境、调整线程数或计算量大概率会出现结果错误。正确的写法是在并行编译制导语句中加入reduction规约:
#pragma omp parallel reduction(+:sum)
内容的提问来源于stack exchange,提问作者Muhammad Hasan
相关产品推荐
相关产品推荐

