For loop OpenMP嵌套for循环

For loop OpenMP嵌套for循环,for-loop,nested,openmp,For Loop,Nested,Openmp,嗨,我有以下代码。内部循环(函数Foo中的for循环)是否具有并行性能?或者我必须在外循环中添加类似“折叠”的内容才能获得内循环的并行性能吗 void X(int i) { } void Foo() { ... Do something #pragma omp parallel for for( int i = 0; i < 10000; ++i ) { X(i); } } void main() { #pragma omp paralle

嗨,我有以下代码。内部循环(函数Foo中的for循环)是否具有并行性能?或者我必须在外循环中添加类似“折叠”的内容才能获得内循环的并行性能吗

void X(int i)
{
}
void Foo()
{
   ... Do something
   #pragma omp parallel for
   for( int i = 0; i < 10000; ++i )
   {
       X(i);
   }
}
void main()
{
   #pragma omp parallel for
   for( int k = 0; k < 1000; ++k )
   {
     Foo();
   }
}
void X(int i)
{
}
void Foo()
{
…做点什么
#pragma-omp并行
对于(int i=0;i<10000;++i)
{
X(i);
}
}
void main()
{
#pragma-omp并行
对于(int k=0;k<1000;++k)
{
Foo();
}
}

简而言之,不,它不应该(在我的机器上也不应该)

首先,OpenMP有一个值,用于设置它将使用的线程数,默认情况下,该值设置为系统上可用的线程数。因此,即使这样做可行,第一个调用也将使用所有可用线程,第二个调用将按顺序执行。可以通过调用
omp\u set\u num\u threads(…)
来修改此值,但它是全局的,因此上述行为将保持不变,即第一次调用将使用它认为可用的所有线程。解决此问题的最简单方法是向omp pragma添加
num_threads(…)
,并强制它忽略该值。当然,您也可以在其中使用变量,因此
num_threads(x)
是完全合法的,其中
x
是编译时甚至不需要知道的整数

#pragma omp parallel for num_threads(2) //Let's say we want 2 threads in this for loop
但是,这还不够,因为嵌套在默认情况下是禁用的。为了实现OMP并行区域的嵌套,我们只需要调用
OMP\u set\u nested(true)。添加
omp\u set\u max\u active\u级别(2)也可能是明智的,但这不是必需的,默认值似乎更大(我不知道它实际上是什么,可能只是不受限制)

因此,一个简单的测试程序可以是:

#include <omp.h>
#include <iostream>
#include <string>

int main(void) {
    omp_set_nested(true); //Enables nesting. 
#pragma omp parallel for num_threads(2) //We will be using 2 threads for the first for loop.
    for (int i = 0; i < 10; i++) {
        int tid1 = omp_get_thread_num();
#pragma omp parallel for num_threads(2) //And 2 threads for each of the threads in the second loop.
        //This will require a total of 4 threads. 
        for (int j = 0; j < 10; j++) {
            int tid2 = omp_get_thread_num();
            std::string msg =  std::to_string(i) + " " + std::to_string(j) + " " + std::to_string(tid1) + " " + std::to_string(tid2) + "\n";
            std::cerr << msg;
        }
    }
    return 0;
}
#包括
#包括
#包括
内部主(空){
omp_set_nested(true);//启用嵌套。
#pragma omp parallel for num_threads(2)//我们将使用2个线程作为第一个for循环。
对于(int i=0;i<10;i++){
int tid1=omp_get_thread_num();
#pragma omp parallel用于num_线程(2)//和2个线程用于第二个循环中的每个线程。
//这将需要总共4个线程。
对于(int j=0;j<10;j++){
int tid2=omp_get_thread_num();
std::string msg=std::to_string(i)+“”+std::to_string(j)+“”+std::to_string(tid1)+“”+std::to_string(tid2)+“\n”;
标准:cerr