静态变量 thread_local 和 open_MP
static variable thread_local with open_MP
我试过用open_MP和用omp prallel for,但是我运行出问题了。
我使用了很多不同的静态 class 成员,例如
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 是 "main-thread" 的本地线程,而新创建的 "child-threads" 没有获得有关 v 的信息。
有没有办法轻松解决这个问题?或者我需要为每个线程初始化 v 吗? (这不是很好,因为初始化需要相当长的时间,而且我不太可能(但有可能)需要更改每个 for 循环中的参数)
如果你写一个初始化
thread_local std::vector<double> A::v {1,2,3};
您将在所有线程中获得包含 {1,2,3}
的 v
副本。但是如果你写一个 assignment
A::v = {1,2,3};
你不会。 A::v
将为每个线程重新初始化,而不是从任何其他线程复制。
如果您需要将数组的线程本地副本初始化为某些值集,则必须确保在每个线程中执行将值放入其中的操作(初始化或赋值)。
我试过用open_MP和用omp prallel for,但是我运行出问题了。
我使用了很多不同的静态 class 成员,例如
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 是 "main-thread" 的本地线程,而新创建的 "child-threads" 没有获得有关 v 的信息。 有没有办法轻松解决这个问题?或者我需要为每个线程初始化 v 吗? (这不是很好,因为初始化需要相当长的时间,而且我不太可能(但有可能)需要更改每个 for 循环中的参数)
如果你写一个初始化
thread_local std::vector<double> A::v {1,2,3};
您将在所有线程中获得包含 {1,2,3}
的 v
副本。但是如果你写一个 assignment
A::v = {1,2,3};
你不会。 A::v
将为每个线程重新初始化,而不是从任何其他线程复制。
如果您需要将数组的线程本地副本初始化为某些值集,则必须确保在每个线程中执行将值放入其中的操作(初始化或赋值)。