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之一。
如果您对更多上下文感兴趣:我正在寻找一个无互斥锁的方法来执行以下操作:
在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。)