OpenMP'未使用的变量'编译错误

时间:2017-11-04 16:14:41

标签: c++ openmp

我尝试用openmp编写一个c ++程序来进行并行化。不幸的是我得到了一个我不明白的编译错误。我列出了g ++命令,有问题的代码行和错误消息。如果我错过了重要信息,请告诉我。

g++ -o Pogramm -Wall -fopenmp Programm.cpp

#pragma omp parallel
int id,nths,tnbr;
id=omp_get_thread_num();
nths=omp_get_num_thread();
  

Tree.cpp:52:7:警告:未使用的变量'id'[-Wunused-variable]

     

错误:'id'未在此范围内声明id = omp_get_thread_num();

有人可以告诉我为什么' id'是不是没有声明?

1 个答案:

答案 0 :(得分:3)

根据您的代码,并行区域的范围(您定义id的范围)仅包括后续行,即您定义id的行。因此,当您在外部使用id变量时,会得到未定义的变量错误。此外,您还获得了一个未使用的id变量警告,因为您没有在并行区域(可以使用它)中使用它。

很可能你只是忘了添加花括号来扩大范围,以便完全并行化,即

private fun observeDatabase() {
    viewModel.andis
        .observe(this, Observer {
            it?.let {
                viewModel.andisList.clear()
                viewModel.andisList.addAll(it)
            }
        })
}

最小的工作示例是:

#pragma omp parallel
{
  int id,nths,tnbr;
  id=omp_get_thread_num();
  nths=omp_get_num_thread();
  ...
}

这可以成功编译,例如使用g ++ v.4.8.5

#include<iostream>
#include<omp.h>
using namespace std;
int main() {
#pragma omp parallel
    {
        int id,nths,tnbr;
        id=omp_get_thread_num();
        nths=omp_get_num_threads();
        cout << "id, nths: " << id << nths << endl;
    }
    return 0;
}