如何在OpenMP上只在线程上运行嵌套循环的任务



我正在尝试制作一个程序,该程序并行地乘以两个数组,以便每个线程将一行乘以一列。问题是,如果我把omp for放在外部for中,线程将执行整个内部for,而不仅仅是执行任务;如果我把omp for放在内部for中,来自外部的for将在多个线程上运行多次,因为它在"omp parallel"的范围内。我只想在线程中运行任务,不想在线程外多次运行。

for (int line = 0; line < n; ++line) {
for (int column = 0; column < n; ++column) {
// only that need to run in new thread
multiply_line_per_column(line, column);
}
}

其中一个选项是使用collapse子句:https://stackoverflow.com/a/13357158/2485717

您也可以重写for循环以避免嵌套:

for (int i = 0; i < n * n; ++i) {
int line = i % n;
int column = i / n;
multiply_line_per_column(line, column);
}

正如@Hristo Iliev在评论中指出的那样,整数除法和模运算符将带来相当大的额外成本。

n不是2的幂时,缺点更加明显。

最新更新