c++ - 带有 open_MP 的静态变量 thread_local

标签 c++ static openmp thread-local

我尝试使用 open_MP 和 omp prallel for,但我遇到了问题。

我使用了很多不同的静态类成员,比如

class A {
public:
    static std::vector<double> v;
}

我在我的 .cpp 文件中用一个空 vector 初始化。

一段时间后,我进行了一些计算,最后用我的初始值填充 vector v:

A::v = {1,2,3};

一段时间后,我有了一个大的 for 循环,它可以(但不能)再次更改 v 的值。

现在我尝试使用 open_MP 来加快速度:

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

因为我希望每个循环都有自己的静态 vector 实例,所以我只是尝试将其设为 thread_local。

class A {
public:
    static thread_local std::vector<double> v;
}

我现在的问题是,一旦我进入并行 for 循环,我的 vector v 就不再是 {1,2,3},它只是空的。

我怎样才能改变这个?我假设一开始 v 是“主线程”的本地线程,而新创建的“子线程”没有获得有关 v 的信息。 有没有办法轻松解决这个问题?或者我需要为每个线程初始化 v 吗? (这不会很好,因为初始化需要相当长的时间,而且我不太可能(但有可能)需要更改每个 for 循环中的参数)

最佳答案

如果你写一个初始化

thread_local std::vector<double> A::v {1,2,3};

您将在所有线程中获得包含 {1,2,3}v 拷贝。但是如果你写一个作业

A::v = {1,2,3};

你不会。 A::v 将为每个线程重新初始化,而不是从任何其他线程复制。

如果您需要将数组的线程本地拷贝初始化为某些值集,则必须确保在每个线程中执行将值放置在那里的操作(初始化或赋值)。

关于c++ - 带有 open_MP 的静态变量 thread_local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037126/

相关文章:

c++ - 编译头文件定义了一个模板类,其中还包括其他头文件

c++ - 类内部类型的静态私有(private)成员

c++ - std::function 返回任何可求和类型?

c++ - 从 OpenMP 循环内部访问和编辑 aN ma 时出错

.net - 附加过程错误 VS C++ .NET

c++ - 如何用 Doxygen 记录宏生成的类?

c++ - Windows 卷设备检测失败,直到重新启动。从未失败过

c# - 在静态类中存储全局不可变数据

java - 重载 Math.sqrt : overloading method seems to hide the original one

c++ - 使用 OpenMP 并行化 C++ 代码,并行计算实际上更慢