OpenMP, C++ 11 için atomik bir minimum değeri destekliyor mu? OpenMP'de taşınabilir bir yöntem yoksa: x86 veya amd64 özelliğini kullanarak bunu yapmanın bir yolu var mı?OpenMP kullanarak x86 üzerinde Atomik Minimum
OpenMP spesifikasyonlarında C++ için hiçbir şey bulamadım, ancak Fortran sürümü bunu destekliyor gibi görünüyor. Detaylar için v3.1'in 2.8.5'ine bakınız. , < < veya >> |, /, &, ^, - C++ o
ama Fortran içinbinop +, *, biri belirtmektedir.
intrinsic_procedure_name MAX, MIN, Iand, IOR veya IEOR biridir belirtmektedir.
Eğer daha bağlamda ilgilenen: Aşağıdaki yapmanın bir mutex serbest yöntemi için arıyorum:
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]);
}
}
Sana bir algoritma azaltmak kullanarak minimum hesaplayabilir biliyoruz. Bunun, atomik minimum yaklaşımdan büyük ölçüde daha iyi performans gösterdiği durumlar olduğunu biliyorum. Ancak, durumumda bunun böyle olmadığını da biliyorum.
DÜZENLEME: benim durumumda biraz daha hızlı olduğunu Seçeneklerden biri
int x = ...;
int y = ...;
while(y < val[x])
val[x] = y;
ama bu hiçbir atom operasyondur.
Tüm yeni GPU'lar bu özelliğe sahiptir ve bunu CPU'da kaçırıyorum. (Bkz. OpenCL için atom_min.)
Bu C++ 98 veya C++ 11 mi? – user1071136
C++ 11 cevaplar yolunda –
Bu arada, neden atomik-min sizin durumunuzda daha hızlıdır? Düşüş-min performansın iyileşmediği benzer bir problemim vardı, bu yüzden atomik-min'i denemeliyim. – user1071136