【发布时间】:2022-01-31 01:32:45
【问题描述】:
在 C++ 中,我希望同时执行两个 for 循环,而不是让一个等待另一个先执行或等待它结束。
我希望两个 for 循环(或更多)以相同的速度完成循环,这需要一个相同大小的循环才能完成。
我知道有人问过并回答过,但没有这么简单的例子。我希望能解决这个具体问题。我使用了 pragma omp 代码示例的组合,但无法获得结果。
#include <iostream>
using namespace std;
#define N 5
int main(void) {
int i;
for (i = 0; i < N; i++) {
cout << "This is line ONE \n";
};
#pragma omp parallel
#pragma omp for
for (i = 0; i < N; i++) {
cout << "This is line TWO \n";
};
};
编译$ g++ parallel.cpp -fopenmp && ./a.out
代码的输出是这样的,在运行两个循环所花费的时间...
This is line ONE
This is line ONE
This is line ONE
This is line ONE
This is line ONE
This is line TWO
This is line TWO
This is line TWO
This is line TWO
This is line TWO
我想要的输出是这样的 他们不必像这样一个接一个地打印,但我认为如果他们都同时进入循环的打印部分,他们会这样做。我真正需要的是循环同时开始和结束(循环相等)。
This is line ONE
This is line TWO
This is line ONE
This is line TWO
This is line ONE
This is line TWO
This is line ONE
This is line TWO
This is line ONE
This is line TWO
有这个问答here,但我不太明白未声明的foo 和//do stuff with item 部分。什么样的东西?什么项目?我无法从在线示例中推断出我需要做的事情。
【问题讨论】:
-
“我知道有人问过并回答过”在哪里?该答案中缺少哪一部分?为什么你的问题不同?
-
这似乎是meta.stackexchange.com/questions/66377/what-is-the-xy-problem 即你想做一件很难的事情(X),因为你认为这会让做其他事情(Y)变得容易。尝试不同的方法。你为什么不想在一个循环中执行
cout << "This is line ONE \n"; cout << "This is line TWO \n";,它会得到你想要的输出。 -
#pragma omp parallel是否在已经完成的循环上向后工作? -
这是一个现实的示例代码吗?
cout在内部使用锁来防止任何数据竞争,因此它不能真正并行运行。同样的事情适用于printf(当然还有所有类似的功能)。您似乎不需要并行性,而是完全不同的 concurrency。您可以使用多个线程进行并发,但在现代硬件上以细粒度同步显然效率不高(除非两个线程在不同的硬件线程中在同一个内核中运行。OpenMP 似乎不是这里的好工具:它不提供并发功能(尽管它们可以被模拟)。 -
您可以启动2个独立线程,一个循环读取传感器,另一个循环控制电机。
标签: c++ parallel-processing openmp