如何在C ++中使用openmp并行运行展开的“ for”循环tmp?

问题描述

代码1显示了使用openmp并行化“ for”循环。 在使用模板元编程(请参见代码2)展开“ for”循环后,我希望实现类似的并行化。你能帮忙吗?

代码1:外部循环与四个线程并行运行

void some_algorithm()
{
  // code
}

int main()
{
  #pragma omp parallel for
  for (int i=0; i<4; i++)
  {
    //some code
    for (int j=0;j<10;j++)
    {
      some_algorithm()
    }
  }
}

代码2:与代码1相同,我想使用openmp并行运行外部for循环。 1

template <int I,int ...N>
struct Looper{
    template <typename F,typename ...X>
    constexpr void operator()(F& f,X... x) {
        for (int i = 0; i < I; ++i) {
            Looper<N...>()(f,x...,i);
        }
    }
};

template <int I>
struct Looper<I>{
    template <typename F,X... x) {
        for (int i = 0; i < I; ++i) {
            f(x...,i);
        }
    }
};


int main()
{
    Looper<4,10>()(some_algorithm); 
}

1 要感谢Nim的代码2 How to generate nested loops at compile time吗?

解决方法

如果删除constexpr声明,则可以使用_Pragma("omp parallel for"),类似这样

#include <omp.h>

template <int I,int ...N>
struct Looper{
    template <typename F,typename ...X>
    void operator()(F& f,X... x) {
        _Pragma("omp parallel for if (!omp_in_parallel())")
        for (int i = 0; i < I; ++i) {
            Looper<N...>()(f,x...,i);
        }
    }
};

template <int I>
struct Looper<I>{
    template <typename F,X... x) {
        for (int i = 0; i < I; ++i) {
            f(x...,i);
        }
    }
};

void some_algorithm(...) {
}
int main()
{
    Looper<4,10>()(some_algorithm); 
}

您可以在https://godbolt.org/z/nPrcWP上看到正在使用OpenMP进行编译(请注意对GOMP_parallel的调用...)。该代码还可以使用LLVM进行编译(将编译器切换为:-))。