C++ 并行编程函数调用

Posted

技术标签:

【中文标题】C++ 并行编程函数调用【英文标题】:C++ parallel programming function calls 【发布时间】:2015-10-02 06:27:25 【问题描述】:

我对这种并行编程非常陌生,我正在使用 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 调用 functionYfunctionX 调用,我认为与其让每个函数并行,我应该只让 functionZ 并行,因此 functionZ 中的每个线程都会单独调用 functionY

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

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

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

【问题讨论】:

您的建议完全有道理,每个线程都可以对functionY(); 执行不同的调用,但前提是functionY(); 的调用之间没有依赖关系,这似乎是您的情况。但是,您应该考虑线程并行之外的数据并行:在 functionX() 中读取的数据以这种方式有效读取?数据读取会不会成为瓶颈? 对不起,我认为数据并行是线程并行。不一样吗? 线程并行是指并行执行任务的可能性。您还需要检查所需数据是否可以并行化:一次迭代是否需要前一次迭代产生的数据?线程是否需要使用锁定机制访问共享内存位置?它们都从文件中读取吗?每个线程复制一次数据以便每个线程都在其本地副本中工作会更有效吗?这些问题是关于数据并行性的。你应该问自己这些问题,或者至少要意识到它们。 【参考方案1】:

对我来说看起来不错,但是如果 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);

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

【讨论】:

对不起,我只是写了 3 作为示例,但实际上是一个图像帧,大约是 (640 x 480) 迭代。除此之外,正如您在 functionY(,) 中写的 #pragma 我想知道如何在 functionY 中处理线程的划分。与functionZ完全相同。 按照我写的方式,所有线程将独立执行functionZ中循环的所有迭代,但会尽可能有效地将functionY中的两个循环的迭代分布在它们之间(根据运行时库的调度决定)何时到达。现在,如果您在 functionZ 中的循环行程通常为 640,那么您的初始解决方案非常好,您可以忽略我的解决方案。 请注意,collapse(n) 是 OpenMP v3,因此可能不可用。如果每次迭代的工作量不是恒定的,那么使用动态调度可以帮助消除每个外循环结束时 CPU 利用率低的长尾#pragma omp parallel for schedule(dynamic)。我只有 OpenMP v2,所以我不知道它如何与 collapse(n) 交互。 本视频介绍了如何使用 openmp 最大化 CPU 利用率software.intel.com/en-us/videos/…

以上是关于C++ 并行编程函数调用的主要内容,如果未能解决你的问题,请参考以下文章

c++多线程编程:实现标准库accumulate函数的并行计算版本

CUDA并行编程思维过程

C++并发编程----异常安全的并行算法(《C++ Concurrency in Action》 读书笔记)

C++并发编程----异常安全的并行算法(《C++ Concurrency in Action》 读书笔记)

如何在 Python 中进行并行编程?

C++ 并行编程中的“锁”难题