C 如何使用OpenMP在其他for循环中并行化for循环
我希望通过并行此循环获得最佳性能:C 如何使用OpenMP在其他for循环中并行化for循环,c,parallel-processing,openmp,C,Parallel Processing,Openmp,我希望通过并行此循环获得最佳性能: // EXAMPLE for (;;) { // DO SOMETHING for(;;) { // DO SOMETHING } } 我知道并行化示例的三种方法: // EXAMPLE - FIRST LOOP PARALLEL #pragma omp parallel for for (;;) { // DO SOMETHING for(;;) { // DO SOMETHING
// EXAMPLE
for (;;) {
// DO SOMETHING
for(;;) {
// DO SOMETHING
}
}
我知道并行化示例的三种方法:
// EXAMPLE - FIRST LOOP PARALLEL
#pragma omp parallel for
for (;;) {
// DO SOMETHING
for(;;) {
// DO SOMETHING
}
}
// EXAMPLE - FIRST AND SECOND LOOP PARALLEL NO NESTED
omp_set_nested(0); // default option
#pragma omp parallel for
for (;;) {
// DO SOMETHING
#pragma omp parallel for
for(;;) {
// DO SOMETHING
}
}
// EXAMPLE - FIRST AND SECOND LOOP PARALLEL NESTED
omp_set_nested(1);
#pragma omp parallel for
for (;;) {
// DO SOMETHING
#pragma omp parallel for
for(;;) {
// DO SOMETHING
}
}
哪种方法最好?或者在哪些情况下我应该使用其中一种
谢谢。单级并行几乎总是最好的,即示例1:第一个循环并行 事实上,示例2将与示例1执行相同的操作(由于嵌套并行化被禁用,因此忽略了for语句的第二个
#pragma omp parallel
)
例3可能是个坏主意。在循环1的每次迭代中产生新线程的开销。如果只并行第一个循环(或者只并行第二个循环),那么这种情况并不常见。并不能保证所有编译器都支持它(有些编译器可能仍然会忽略嵌套部分)
示例4是另一个选项,当由于任何原因(例如,内存使用)无法完成最外层循环的并行化时,但我们希望只生成一次线程,并在最外层循环的每次迭代中重新使用它们。每次迭代都会产生一些同步开销,但比重复生成线程的成本要低得多
// EXAMPLE - SECOND LOOP PARALLEL
#pragma omp parallel
for (;;) {
// DO SOMETHING EVERY THREAD SHOULD DO
// e.g. declare local variables, increment private counter...
#pragma omp single
{
// DO SOMETHING ONCE ONLY
// e.g. read data from a file, initialize a shared variable
}
#pragma omp for
for(;;) {
// DO SOMETHING
}
}
单一级别的并行化几乎总是最好的,即示例1:第一个循环并行 事实上,示例2将与示例1执行相同的操作(由于嵌套并行化被禁用,因此忽略了for语句的第二个
#pragma omp parallel
)
例3可能是个坏主意。在循环1的每次迭代中产生新线程的开销。如果只并行第一个循环(或者只并行第二个循环),那么这种情况并不常见。并不能保证所有编译器都支持它(有些编译器可能仍然会忽略嵌套部分)
示例4是另一个选项,当由于任何原因(例如,内存使用)无法完成最外层循环的并行化时,但我们希望只生成一次线程,并在最外层循环的每次迭代中重新使用它们。每次迭代都会产生一些同步开销,但比重复生成线程的成本要低得多
// EXAMPLE - SECOND LOOP PARALLEL
#pragma omp parallel
for (;;) {
// DO SOMETHING EVERY THREAD SHOULD DO
// e.g. declare local variables, increment private counter...
#pragma omp single
{
// DO SOMETHING ONCE ONLY
// e.g. read data from a file, initialize a shared variable
}
#pragma omp for
for(;;) {
// DO SOMETHING
}
}
好的,谢谢你的解释,我会记住的。我是OpenMP新手,对此我不是很清楚。好的,谢谢你的解释,我会记住的。我是OpenMP新手,对此我不是很清楚