我想知道是否可以在以下代码中应用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]
)存储在局部变量中。