运行含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
相关产品推荐
相关产品推荐

