[英]Atomic Minimum on x86 using OpenMP
OpenMP是否支持C ++ 11的原子最小值? 如果OpenMP沒有可移植的方法:有沒有辦法使用x86或amd64功能?
在OpenMP規范中,我沒有找到C ++,但Fortran版本似乎支持它。 有關詳細信息,請參見v3.1的2.8.5。 對於C ++,它說明了
binop是+,*, - ,/,&,^,|,<<或>>之一。
但對Fortran來說,它說
intrinsic_procedure_name是MAX,MIN,IAND,IOR或IEOR之一。
如果您對更多上下文感興趣:我正在尋找一個無互斥的方法來執行以下操作:
vector<omp_lock_t>lock;
vector<int>val;
#pragma omp parallel
{
// ...
int x = ...;
int y = ...;
if(y < val[x]){
omp_set_lock(&lock[x]);
if(y < val[x])
val[x] = y;
omp_unset_lock(&lock[x]);
}
}
我知道您可以使用reduce算法計算最小值。 我知道在某些情況下,這在很大程度上優於任何原子最小方法。 但是,我也知道在我的情況下並非如此。
編輯:在我的情況下,一個選項稍微快一點
int x = ...;
int y = ...;
while(y < val[x])
val[x] = y;
但這不是原子操作。
所有較新的GPU都具有此功能,我在CPU上遺漏了它。 (請參閱OpenCL的atom_min。)
C ++的OpenMP規范不支持原子最小值。 C ++ 11也不是。
我假設在你的算法中, x
可以計算任何有效的索引,無論線程如何。 我建議更改你的算法,以便每個線程使用自己的val
數組,然后在最后進行最終的協調,也可以通過索引進行並行化。 這將完全避免鎖和原子,並為您提供分離每個線程的數據的好處,即沒有機會進行虛假緩存共享。 換句話說,它應該更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.