【发布时间】:2020-04-16 18:18:18
【问题描述】:
我的问题与嵌套并行和 OpenMP 有关。让我们从下面的单线程代码sn-p开始:
void performAnotherTask() {
// DO something here
}
void performTask() {
// Do other stuff here
for (size_t i = 0; i < 100; ++i) {
performAnotherTask();
}
}
int main() {
for (size_t i = 0; i < 100; ++i) {
performTask();
}
return 0;
}
现在假设我们要使用 OpenMP 并行调用 performAnotherTask。
所以我们得到以下代码:
void performAnotherTask() {
// DO something here
}
void performTask() {
// Do other stuff here
#pragma omp parallel for
for (size_t i = 0; i < 100; ++i) {
performAnotherTask();
}
}
int main() {
for (size_t i = 0; i < 100; ++i) {
performTask();
}
return 0;
}
我的理解是,对performAnotherTask 的调用将并行执行,默认情况下,openMP 会尝试使用您机器上的所有可用线程(也许这个假设是不正确的)。
假设我们现在还想并行化对performTask 的调用,这样我们就可以得到以下代码:
void performAnotherTask() {
// DO something here
}
void performTask() {
// Do other stuff here
#pragma omp parallel for
for (size_t i = 0; i < 100; ++i) {
performAnotherTask();
}
}
int main() {
#pragma omp parallel for
for (size_t i = 0; i < 100; ++i) {
performTask();
}
return 0;
}
这将如何运作?两个 for 循环仍然是多线程的吗?我们能说一下每个循环将使用的线程数吗?有没有办法强制内部 for 循环(在performTask 内)仅使用单个线程,而外部 for 循环使用所有可用线程?
【问题讨论】:
标签: c++ multithreading openmp