c - Openmp并行循环

标签 c openmp

我想知道是否可以在下面的代码中应用openmp。棘手的部分是 l 和 p。

    int l=0;
    for(j=0; j<len2;++j){
      if(pcons[imask ? j : p[j]] == 1){
        pans[imask ? j : p[j]] = pouts[(imask ? j : p[j]) & amask];
      } else {
        if(imask) pans[j]=pna;
        p[l++] = imask ? j : p[j];
      }
    }

如果您需要更多信息,请告诉我。谢谢。

最佳答案

简短的回答是:不,不可能将 OpenMP 应用于此循环。

这是因为任何迭代中l的值取决于所有先前迭代中采用的代码路径,并且不能仅根据迭代次数(j的值)来确定>)。这会影响条件的 else 分支中更改 p 中的索引。

长的答案仍然是“否”。

真正长的答案是“也许”,前提是正确的 OpenMP 子句集和关于存储到 p 中的值排序的假设。然而,考虑到这样一个简单的循环,它极不可能比单线程版本更快,并且不需要花费精力来确定它是否真的可以工作以及如何让它这样做(如果可以的话)。所有这些写入连续内存地址的线程都会导致大量缓存抖动、刷新和重新加载。

更大的帮助是将公共(public)计算(imask ? j : p[j])存储在每个循环开始时的局部变量中。

关于c - Openmp并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58613890/

相关文章:

c - 使用 openmp 并行化此 C 代码

c - OpenMP 和函数

c++ - 不使用所有内核的递归并行函数

c - 使用 C 中的 openmp,如何并行化包含用于 qsort 的嵌套比较函数的 for 循环?

c - 滚动哈希的实现对使用 Rabin Karp 进行字符串匹配没有帮助

c - malloc 上的 sigsegv 错误让我抓狂

c++ - 包括层次困惑

C++ 并行编程函数调用

c - 如何枚举 USB 设备*和*读取/写入它们?

c - 将原始音频写入文件?