什么是并行 for 循环,应该如何/何时使用它?

Posted

技术标签:

【中文标题】什么是并行 for 循环,应该如何/何时使用它?【英文标题】:What is a parallel for loop, and how/when should it be used? 【发布时间】:2015-03-19 23:18:27 【问题描述】:

多年来我一直在使用 C++ 进行编码,过去也使用过线程,但我现在才刚刚开始了解多线程编程及其实际工作原理。

到目前为止,我对这些概念的理解还不错,但有一件事让我很困惑。

什么是并行 for 循环,它们是如何工作的? 任何 for 循环都可以并行吗? 它们有什么用?性能? 其他功能?

我在网上找不到任何解释得足以让我理解的东西。

我使用 C++ 编写代码,但我确信这个问题适用于许多不同的编程语言。

【问题讨论】:

你说你以前用过线程,但你才刚刚开始学习多线程? @Falmarri 我想他的意思是他用过线程但可能只是复制了例子,他实际上并没有研究过理论和基本原理 @Falmarri 我的意思是我遵循了一个关于使用 boost 线程在我的 GUI 应用程序中执行资源密集型功能的教程,以便在我的功能执行时用户界面不会停止。这或多或少是一种复制粘贴类型的交易。我稍微理解了它背后的想法,但是当我说“学习多线程”时,我是在谈论操作系统如何处理线程等。 这太宽泛了。这些问题的答案可以写成书。 @Puppy 实际上我认为它非常具体。如果我问“何时使用多线程?”那将是广泛的。但我问的是一种特定类型的多线程。 【参考方案1】:

什么是并行 for 循环,它们是如何工作的?

并行 for 循环 是一个 for 循环,其中循环中的语句可以并行运行:在不同的内核、处理器或线程上。

让我们来一个求和代码:

unsigned int numbers[] =  1, 2, 3, 4, 5, 6;
unsigned int sum = 0;
const unsigned int quantity = sizeof(numbers) / sizeof (numbers[0]);
for (unsigned int i = 0; i < quantity; ++i)

  sum = sum + numbers[i];
;

计算总和不依赖于顺序。总和只关心所有数字是否已添加。

循环可以分成两个循环,由不同的线程或处理器执行:

// Even loop:
unsigned int even_sum = 0;
for (unsigned int e = 0; e < quantity; e += 2)

  even_sum += numbers[e];


// Odd summation loop:
unsigned int odd_sum = 0;
for (unsigned int odd = 1; odd < quantity; odd += 2)

  odd_sum += numbers[odd];


// Create the sum
sum = even_sum + odd_sum;

evenodd 求和循环相互独立。它们不访问任何相同的内存位置。

求和for 循环可以被视为并行 for 循环,因为它的语句可以由单独的进程并行运行,例如单独的 CPU 内核。

其他人可以提供更详细的定义,但这是一般示例。

编辑 1:

任何 for 循环都可以并行吗?

不,任何循环都不能并行。循环的迭代必须相互独立。也就是说,一个 cpu 核心应该能够运行一个迭代,而不会对另一个运行不同迭代的 cpu 核心产生任何副作用。

它们有什么用? 表现?

一般来说,原因是为了性能。但是,设置循环的开销必须小于迭代的执行时间。此外,还有等待并行执行完成并将结果连接在一起的开销。

通常,数据移动和矩阵运算是并行性的良好候选者。例如,移动位图或对位图应用变换。大量数据需要他们能得到的所有帮助。

其他功能?

是的,并行 for 循环还有其他可能的用途,例如同时更新多个硬件设备。但是,一般情况是为了提高数据处理性能。

【讨论】:

以上是关于什么是并行 for 循环,应该如何/何时使用它?的主要内容,如果未能解决你的问题,请参考以下文章

R中的并行while循环

如何定义何时停止和开始 for /f 批量循环

如何使用 OpenMP 通过 C++ std::list 并行化 for 循环?

Openacc:如何使插入排序更加并行[关闭]

如何在 for 循环中并行处理。我的代码不正确地并行操作

Python:如何使用 for 循环合并两个列表,如 zip