OpenMP 4.5+提供了在C ++中进行向量/数组缩减的功能(press release)
使用所述功能允许我们编写,例如:
readxl
问题是,在执行这样的代码时,可以以任何方式对各种线程的结果进行排序。
有没有办法强制执行订单,以便线程0的结果先于线程1,依此类推?
答案 0 :(得分:3)
明确未指定减少的顺序。 (" OpenMP程序中组合值的位置以及值的顺序 组合的值未指定。",2.15.3.6在OpenMP 4.5中。因此,您不能使用减少。
一种方法是按如下方式使用有序:
std::vector<int> vec;
#pragma omp parallel for default(none) schedule(static) shared(vec)
for(int i=0;i<100;i++) {
// do some computations here
#pragma omp ordered
vec.push_back(i);
}
请注意,vec
现在已共享,ordered
表示线程之间的执行和同步的序列化。这可能对性能非常不利,除非您的每个计算需要大量且统一的时间。
您可以进行自定义缩减。从parallel
循环中拆分for
区域,然后按顺序手动插入本地结果。
std::vector<int> global_vec;
#pragma omp parallel
{
std::vector<int> local_vec;
#pragma omp for schedule(static)
for (int i=0; i < 100; i++) {
// some computations
local_vec.push_back(i);
}
for (int t = 0; t < omp_get_num_threads(); t++) {
#pragma omp barrier
if (t == omp_get_thread_num()) {
global_vec.insert(local_vec.begin(), local_vec.end())
}
}
}