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

6
我已经使用C++编写代码多年,之前也用过线程,但现在我才开始学习多线程编程以及其实际工作原理。
目前,我对理解概念还算顺利,但有一件事情让我困惑不已。
- 什么是并行for循环,它们如何工作? - 是否能将任何for循环变成并行? - 它们有什么用处?是为了提高性能? - 还有其他的功能吗?
我找不到任何在线资源能够清晰地解释这个问题,以便我能够理解。
我主要使用C++语言编写代码,但我相信这个问题适用于许多不同的编程语言。

1
你说你以前用过线程,但现在才开始学习多线程? - Falmarri
2
@Falmarri 我猜他的意思是他使用过线程,但只是复制了一些例子,他实际上并没有学习过理论和基本原则。 - texasflood
@Falmarri 我的意思是我按照一个使用boost线程在我的GUI应用程序中执行资源密集型函数的教程,以便在我的函数执行时用户界面不会停顿。这更多地是一种复制和粘贴的方式。我稍微理解了它背后的想法,但当我说“学习多线程”时,我指的是操作系统如何处理线程等方面的知识。 - Noah Roth
这个问题太过宽泛了。关于这些问题的答案可以写成书。 - Puppy
@Puppy,实际上我认为这很具体。如果我问“何时使用多线程?”,那就是广泛的问题。但我正在询问特定类型的多线程。 - Noah Roth
1个回答

9

什么是并行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;
< p >“偶数和奇数求和循环”彼此独立。它们不会访问任何相同的内存位置。

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

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

编辑1:

< blockquote >

任意for循环是否都可以并行执行?

不是所有循环都可以并行执行。循环迭代必须相互独立。也就是说,一个cpu核心应该能够在没有任何副作用的情况下运行一个迭代,而另一个cpu核心正在运行不同的迭代。

< blockquote >

使用它们的目的是什么?
性能?

一般来说,原因是为了提高性能。但是,设置循环的开销必须小于迭代的执行时间。此外,等待并行执行完成并合并结果的开销也很大。

通常数据移动和矩阵操作是并行处理的好选择。例如,移动位图或对位图应用变换。大量的数据需要尽可能多的帮助。

< blockquote >

其他功能?

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


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