我想知道是否可以在下面的代码中应用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/