【问题标题】:How to define threadprivate variables for class member variables如何为类成员变量定义线程私有变量
【发布时间】:2017-03-23 20:49:15
【问题描述】:

我正在通过 OpenMP 编写一个多线程的面向对象的 c++ 代码。为了简单和通用,我不得不在模板类中定义我的一些变量和函数。我想让它们threadprivate 来利用线程私有变量的持久性特性,并能够在嵌入或调用模板类的其他函数或源文件中使用它们。但我收到以下错误: “...不是文件、命名空间或块范围变量” 我知道我只能将threadprivate 指令用于文件、命名空间或块范围变量,但我想知道是否还有其他方法可以将threadprivate 指令也用于类成员。我的总代码布局是这样的:

template<typename T> class EntContainer
{
private:
T** empties;
e_NumPointers;
e_nLists;
.
.
.
public:
#pragma omp threadprivate(empties, e_NumPointers, e_nLists)
void function
{
// do some paralle stuff using #pragma omp parallel 
}
}

提前致谢

【问题讨论】:

  • 如果将它们声明为static 类成员,OpenMPI 是否允许它们成为线程私有的?
  • 您似乎将 MPI 实现 Open MPI 误认为是线程范式 OpenMP。
  • 不!将它们声明为静态无济于事

标签: c++ openmp


【解决方案1】:

OpenMP 3.0 草案允许在静态类成员上使用 threadprivate,但 #pragma omp threadprivate 必须出现在 包含 threadprivate 静态类成员的类,并且必须 词法上先于所有用法。 source

将成员设为静态并在其声明下方移动#pragma omp threadprivate 指令应该可以修复错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2018-03-04
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多