我想知道是否可以在以下代码中应用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的值)来确定。这会影响在条件的p分支中更改else中的哪个索引。

长答案仍然是否。

真正长的答案可能是,如果有正确的OpenMP子句集和关于存储在p中的值的顺序的假设。但是,给出这样一个简单的循环,它极不可能比单线程版本快,并且无法工作,无法确定它是否真正可行,以及如何使其可行。所有这些写入连续内存地址的线程都将导致大量的缓存崩溃,刷新和重新加载。

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

08-16 13:35