x86上的原子最小值使用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]);
  }
}

我知道你可以使用减少算法来计算最小值。 我知道有些情况下,这在很大程度上胜过了原子最小方法。 但是,我也知道在我的情况下情况并非如此。

编辑:在我的情况下稍微快一个选项是

  int x = ...;
  int y = ...;
  while(y < val[x])
    val[x] = y;

但这不是原子操作。

所有较新的GPU都具有此功能,并且我在CPU上缺少它。 (请参阅OpenCL的atom_min。)


C ++的OpenMP规范不支持原子最小值。 C ++ 11也没有。

我假设在你的算法中, x可以计算任何有效的索引,而不管线程。 我建议改变你的算法,以便每个线程使用自己的val数组,然后在最后进行最终的调整,这也可以通过索引进行并行化。 这将完全避免锁和原子,并为您提供分离每个线程数据的好处,即不会有虚假缓存共享的机会。 换句话说,它应该更快。

链接地址: http://www.djcxy.com/p/63315.html

上一篇: Atomic Minimum on x86 using OpenMP

下一篇: Rounded buttons