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

时间:2015-03-19 23:18:27

标签: c++ multithreading parallel-processing

我已经用C ++编写了多年,我过去曾经使用过线程,但我现在才开始了解多线程编程及其实际工作原理。

到目前为止,我对理解这些概念感到满意,但有一点让我难过。

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

我无法在网上找到足以让我理解的内容。

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

1 个答案:

答案 0 :(得分:4)

  

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

parallel for loop 是一个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;

偶数奇数求和循环彼此独立。它们不访问任何相同的内存位置。

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

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

修改1:

  

任何for循环可以并行吗?

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

  

对他们有什么用处?
  性能?

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

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

  

其他功能?

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