【问题标题】:How to parallelize for loop inside other for loop with OpenMP如何使用 OpenMP 在其他 for 循环中并行化 for 循环
【发布时间】:2018-11-08 12:11:29
【问题描述】:

我希望通过并行循环获得最佳性能:

// 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
    }
}

这样做的最佳方法是什么?或者我应该在哪些情况下使用其中一种?

谢谢。

【问题讨论】:

    标签: c parallel-processing openmp


    【解决方案1】:

    单级并行化几乎总是最好的,即示例 1:第一个循环并行。

    示例 2 实际上与示例 1 相同(第二个 #pragma omp parallel for 语句被忽略,因为嵌套并行化被禁用)。

    示例 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 新手,对此我不是很清楚
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多