C++ 并行编程函数调用

C++ parallel programming function calls

我对这种并行编程还很陌生,我正在使用 OpenMP。 我对以下问题感到困惑。

假设我有这个程序:

void functionX(int x){ 
  for(int i = 0; i < x; i++)
    //do some process
}

void functionY(int x, int y){ 
  for(int i = 0; i < x; i++)
    for(int j = 0; j < y; j++) {
       funtionX(j);
    }  
}

void functionZ(int x){ 
  for(int i = 0; i < x; i++)
    functionY(i, 5);
}

int main() {
    functionZ(3)
}

现在想在这段代码上实现并行编程。因为 functionZ 调用 functionY 调用 functionX,我认为与其让每个函数并行,不如只需使 functionZ 并行,因此 functionZ 中的每个线程将单独调用 functionY

这就是我在 functionZ 中的代码的样子。

void functionZ(int x){ 
 #pragma omp parallel for
  for(int i = 0; i < x; i++)
    functionY(i, 5);
}

但是,我不确定我上面说的是否正确。我应该让每个函数分别并行吗?

对我来说看起来不错,但如果 functionZ() 内的 for 循环的迭代次数限制真的是 3,那么这将极大地限制代码的预期可扩展性。理想情况下,您希望并行化在代码中尽可能处于最外层,但有足够的工作分配给线程以确保良好和平衡地使用所有可用的计算资源。

如果您在 functionZ() 中的行程确实如此之少,一个解决方案如下:

void functionY(int x, int y){
  #paragma omp for collapse(2) schedule(auto) 
  for(int i = 0; i < x; i++)
    for(int j = 0; j < y; j++) {
       funtionX(j);
    }  
}

void functionZ(int x){
  #pragma omp parallel 
  for(int i = 0; i < x; i++)
    functionY(i, 5);
}

您可以 fiddle 通过这种方法找到您的工作共享的最佳位置,以及最佳的日程安排,具体取决于您的实际问题。