簡體   English   中英

使用OpenMP在x86上的原子最小值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM