gpt4 book ai didi

c++ - OpenMp:Threadlocal 成员

转载 作者:行者123 更新时间:2023-11-28 00:26:12 26 4
gpt4 key购买 nike

我目前正在处理一段由一位前同事使用 OpenMP 编写的代码。然而,我自己没有使用 OpenMP 的经验,虽然我只是通过阅读他的代码了解了非常基础的知识,但我目前还在想办法为我自己的修改声明一个线程本地成员。

一个非常简化的版本中的当前代码如下所示:

struct Worker
{
void work() { //... }
};

-------------------------------------------------------------------

Worker worker;

#pragma omp parallel for
for (int i = 0; i < n; ++i)
{
worker.work();
}

我想要实现的是以类似于此的方式修改 Worker 类:

struct Worker
{
void work() { // m_var is accessed here }

int m_var; // should be threadlocal
};

但是我不知道如何使用 OpenMP 实现这一点。请注意,Worker 中的所有其他成员不应是同步的或线程本地的。

PS:对于那些好奇的人来说,Worker 实际上是一个下载一些复杂东西的类,在 for 循环中执行单个下载。 m_var 将成为一个持有 session 的对象。

最佳答案

非静态数据成员在类的每个实例中都有单独的实例,并且不能是线程本地的——它们继承给定类的具体对象的共享类。例如,如果类 Worker 的对象在 OpenMP 线程的堆栈上创建(即对象具有自动存储类),然后对象本身是该线程私有(private)的,并且 worker.m_var也是私有(private)的。如果对象是在堆上创建的,它可以与其他线程共享并且 worker->m_var然后也将共享。

Thread-private只能应用于静态存储类的数据成员:

struct Worker
{
void work();

static int m_var;
#pragma omp threadprivate(m_var)
};

int Worker::m_var;

在这种情况下,只有一份 Worker::m_var 的静态(全局)拷贝存在并且它使它成为线程私有(private)的,从而为每个线程提供了一个在 Worker 的所有实例之间共享的单独实例。在那个线程中。

另请注意 privatefirstprivate不能应用于类数据成员,无论它们是否是静态的 - 参见 this answer .

关于c++ - OpenMp:Threadlocal 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24907276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com