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

运行含omp_get_wtime的并行代码时遇未定义引用错误求助

解决OpenMP代码中undefined reference to omp_get_wtime错误及并行优化

错误原因

你遇到的是链接阶段错误:omp_get_wtime是OpenMP运行时库提供的函数,仅包含<omp.h>头文件只是声明了函数,编译时需要显式链接OpenMP库才能找到函数实现。

编译命令修正

根据你使用的编译器,添加OpenMP编译/链接选项:

  • GCC/Clang:编译时加上-fopenmp参数,命令示例:
    gcc -fopenmp pi_calc.c -o pi_calc
    
  • MSVC(Visual Studio编译器):添加/openmp参数,命令示例:
    cl /openmp pi_calc.c
    

代码并行化修正

你的代码目前是串行递归,没有实际启用OpenMP并行。要实现递归分块的并行计算,需要在递归分支中加入OpenMP任务并行指令:

修正后的代码:

#include <omp.h>
#include <stdio.h>
static long num_steps = 1024*1024*1024;
#define MIN_BLK  1024*1024*256

double pi_comp(int Nstart,int Nfinish,double step)
{  
    int i,iblk;
    double x, sum = 0.0,sum1, sum2;
    if (Nfinish-Nstart < MIN_BLK){
        for (i=Nstart;i< Nfinish; i++){
            x = (i+0.5)*step;
            sum = sum + 4.0/(1.0+x*x); 
        }
    }
    else{
        iblk = Nfinish-Nstart;
        // 用OpenMP任务并行处理两个递归分支
        #pragma omp task shared(sum1)
        sum1 = pi_comp(Nstart, Nfinish-iblk/2, step);
        #pragma omp task shared(sum2)
        sum2 = pi_comp(Nfinish-iblk/2, Nfinish, step);
        // 等待所有任务完成再求和
        #pragma omp taskwait
        sum = sum1 + sum2;
    }
    return sum;
}

int main ()
{
    int i;
    double step, pi, sum;
    double init_time, final_time;
    step = 1.0/(double) num_steps;

    init_time = omp_get_wtime();
    // 启动并行区域,仅主线程执行递归入口
    #pragma omp parallel
    {
        #pragma omp single
        sum = pi_comp(0, num_steps, step);
    }
    pi = step * sum;
    final_time = omp_get_wtime() - init_time;
    printf(" for %ld steps pi = %f in %f secs\n", num_steps, pi, final_time);
}

关键改动说明

  • 在main函数中用#pragma omp parallel开启并行区域,#pragma omp single确保只有一个线程启动递归计算,避免重复执行。
  • 在递归的分块分支中,用#pragma omp task将两个子递归任务交给OpenMP运行时调度到不同线程执行,#pragma omp taskwait确保子任务完成后再合并结果。

内容的提问来源于stack exchange,提问作者HotbrewGX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:45:43