我正在尝试制作一个程序,该程序并行地乘以两个数组,以便每个线程将一行乘以一列。问题是,如果我把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
的幂时,缺点更加明显。