You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:09:03