C++并行编程函数调用

3

我很新于并行编程,正在使用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 调用了 functionYfunctionY 又调用了 functionX,所以我认为不必让每个函数都变成并行的,只需要将 functionZ 并行化即可,因此每个线程在 functionZ 中都会独立地调用 functionY

以下是我在 functionZ 中的代码样例。

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

然而,我不确定我上面所说的是否正确。我应该将每个函数分别并行处理吗?

1
你提出的建议非常有道理,每个线程可以执行不同的 functionY(); 调用,但前提是这些调用之间没有依赖关系,而这似乎是你的情况。然而,你应该考虑数据并行性而不是线程并行性:在 functionX() 中读取的数据以这种方式有效地读取吗?数据读取是否会成为瓶颈? - Lorenzo Belli
抱歉,我以为数据并行是线程并行。这是不同的吗? - kcc__
线程并行性是指可以并行执行任务的可能性。您还需要检查所需数据是否可以并行化:每次迭代是否需要使用前一次迭代生成的数据?线程是否需要访问带有锁定机制的共享内存位置?它们是否都从文件中读取?将该数据复制一次,以便每个线程都在其本地副本中工作,这样会更有效率吗?这些问题涉及数据并行性。您应该自己思考这些问题或至少了解它们。 - Lorenzo Belli
1个回答

2

我觉得这个代码看起来不错,但如果你的functionZ()循环内的迭代次数真的限制为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);
}

您可以尝试使用这种方法来寻找最佳的工作分享位置,以及根据您实际的问题确定最佳的时间安排。

抱歉,我只是举了3的例子,实际上它是一个图像帧,大约为(640 x 480)迭代。除此之外,正如你在functionY()中写的那样,我想知道线程的分配将如何在functionY中处理。这与functionZ完全相同。 - kcc__
我编写的方式是,所有线程将独立执行functionZ中循环的所有迭代,但当它们到达functionY时,将尽可能有效地(根据运行时库的调度决策)分配两个循环的迭代。现在,如果您在functionZ中的循环次数通常为640,则您的初始解决方案完全可以,并且可以忽略我的建议。 - Gilles
请注意,collapse(n) 是 OpenMP v3 的功能,因此可能不可用。如果每次迭代中的工作量不是恒定的,则使用动态调度可以帮助消除每个外部循环末尾低 CPU 利用率的长尾现象 #pragma omp parallel for schedule(dynamic)。我只有 OpenMP v2,所以我不知道它如何与 collapse(n) 交互。 - cdmh
这个视频介绍了如何使用OpenMP来实现最大化的CPU利用率。https://software.intel.com/en-us/videos/crash-course-on-multi-threading-with-openmp - cdmh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接