我尝试使用open_MP并使用omp prallel,但我遇到了一个问题。
我使用了很多不同的静态类成员,比如
class A {
public:
static std::vector<double> v;
}
我在.cpp文件中使用空向量初始化。
一段时间后,我做了一些计算,最后用我的初始值填充向量v:
A::v = {1,2,3};
一段时间后,我有一个大的for循环,可以(但不能)再次改变v的值。
现在我尝试使用open_MP来加快速度:
#pragma omp parallel for
for (int i = 0; i < nsched; ++i) {
...
}
因为我希望每个循环都有自己的静态向量实例,我只是试图让它成为thread_local。
class A {
public:
static thread_local std::vector<double> v;
}
现在我的问题是,当我进入并行for循环时,我的向量v不再是{1,2,3},它只是空的。
我该怎么改变?我假设在开始时v是“主线程”的线程本地,而新创建的“子线程”不获取有关v的信息。 有没有办法轻松解决这个问题?或者我是否需要为每个线程初始化v? (这不会很好,因为初始化需要相当长的时间,而且不太可能(但可能)我需要更改每个for循环中的参数)
答案 0 :(得分:1)
如果你写了初始化
thread_local std::vector<double> A::v {1,2,3};
您将在所有主题中获得包含v
的{{1}}副本。但是如果你写了作业
{1,2,3}
你不会。 A::v = {1,2,3};
将为每个线程重新初始化,而不是从任何其他线程复制。
如果需要初始化为某组值的数组的线程本地副本,则必须确保在每个线程中执行将值放在其中的操作(初始化或赋值)。