开放MP;嵌套循环之间的操作

OpenMP; action between nested loops

本文关键字:操作 之间 嵌套循环 MP 开放      更新时间:2023-10-16

所以,我大致有这样的代码:

for (int i = 0; i != 10000; ++i) {
    doAction(i);
    for (int j = 0; j != 10000; ++j) {
        ...
    }
}

我想使用 OpenMP 并行化它。据我了解,在这种情况下,一个简单的collapse是行不通的;我尝试使用单独的#pragma omp for也没有结果。有没有一种简单的方法可以轻松并行化,或者我是否必须求助于调用doAction i*j时间?

并行化的简单方法,仅将 OpenMP 用于外部循环。

一直

并行化东西并不是一件好事,因为线程同步和任务调度开销。当您将大型 CPU 密集型任务拆分为多个部分以进行并行执行时,理想情况下,这些部分应尽可能大,同时大部分时间使用所有可用的 CPU 内核。

附言如果您有 OpenMP 4,对于内部循环,您可能希望#pragma omp simd而不是parallel 。外循环仍应parallel。这样,您就可以同时使用这两种并行性,即跨内核并行的外部环路,跨 SIMD 通道并行的内部环路。从理论上讲,这通常是计算东西的最快方法。