什么是并行for循环,应该用how/when吗?
What is a parallel for loop, and how/when should it be used?
多年来我一直在使用 C++ 编写代码,过去我也使用过线程,但我现在才刚刚开始了解多线程编程及其实际工作原理。
到目前为止,我对概念的理解还不错,但有一件事让我感到困惑。
- 什么是并行 for 循环,它们是如何工作的?
- 任何for循环都可以并行吗?
- 它们有什么用?性能?
- 其他功能?
我在网上找不到任何足以让我理解的解释。
我用 C++ 编写代码,但我确信这个问题适用于许多不同的编程语言。
What are parallel for loops, and how do they work?
一个并行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];
};
计算总和不依赖顺序。 sum 只关心所有数字都已经相加了。
循环可以分成两个循环,由单独的线程或处理器执行:
// 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;
even 和 odd 求和循环相互独立。它们不访问任何相同的内存位置。
求和for
循环可以被认为是一个并行for循环因为它的语句可以运行由不同的进程并行,比如单独的CPU 个核心。
其他人可以提供更详细的定义,但这是一般示例。
编辑 1:
Can any for loop be made parallel?
不,任何循环都不能并行。循环的迭代必须相互独立。也就是说,一个 cpu 核心应该能够 运行 一次迭代而不会对另一个 cpu 核心 运行 进行不同的迭代产生任何副作用。
What are the use for them?
Performance?
总的来说,原因是为了性能。但是,设置循环的开销必须小于迭代的执行时间。此外,还有等待并行执行完成并将结果连接在一起的开销。
通常数据移动和矩阵运算是并行性的良好候选者。例如,移动位图或对位图应用变换。海量数据需要他们所能获得的一切帮助。
Other functionality?
是的,并行循环还有其他可能的用途,例如同时更新多个硬件设备。但是,一般情况下是为了提高数据处理性能。
多年来我一直在使用 C++ 编写代码,过去我也使用过线程,但我现在才刚刚开始了解多线程编程及其实际工作原理。
到目前为止,我对概念的理解还不错,但有一件事让我感到困惑。
- 什么是并行 for 循环,它们是如何工作的?
- 任何for循环都可以并行吗?
- 它们有什么用?性能?
- 其他功能?
我在网上找不到任何足以让我理解的解释。
我用 C++ 编写代码,但我确信这个问题适用于许多不同的编程语言。
What are parallel for loops, and how do they work?
一个并行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];
};
计算总和不依赖顺序。 sum 只关心所有数字都已经相加了。
循环可以分成两个循环,由单独的线程或处理器执行:
// 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;
even 和 odd 求和循环相互独立。它们不访问任何相同的内存位置。
求和for
循环可以被认为是一个并行for循环因为它的语句可以运行由不同的进程并行,比如单独的CPU 个核心。
其他人可以提供更详细的定义,但这是一般示例。
编辑 1:
Can any for loop be made parallel?
不,任何循环都不能并行。循环的迭代必须相互独立。也就是说,一个 cpu 核心应该能够 运行 一次迭代而不会对另一个 cpu 核心 运行 进行不同的迭代产生任何副作用。
What are the use for them?
Performance?
总的来说,原因是为了性能。但是,设置循环的开销必须小于迭代的执行时间。此外,还有等待并行执行完成并将结果连接在一起的开销。
通常数据移动和矩阵运算是并行性的良好候选者。例如,移动位图或对位图应用变换。海量数据需要他们所能获得的一切帮助。
Other functionality?
是的,并行循环还有其他可能的用途,例如同时更新多个硬件设备。但是,一般情况下是为了提高数据处理性能。