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新手,对此我不是很清楚