2012-09-04 13 views
7

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

binop +, *, biri belirtmektedir.

ama Fortran için

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.)

+0

Bu C++ 98 veya C++ 11 mi? – user1071136

+0

C++ 11 cevaplar yolunda –

+0

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

cevap

4

C++ için OpenMP belirtiminin atomik minimum desteği yoktur. C++ 11 de değil.

Algoritmanızda x iş parçacığına bakılmaksızın geçerli bir dizine hesaplayabileceğimi varsayıyorum. Algoritmanızı değiştirmenizi öneririm, böylece her iş parçacığı kendi val dizisini kullanır ve sonra da endeksle paralelleştirilebilen bir son mutabakat yapar. Bu, kilitleri ve atomikleri tamamen ortadan kaldıracak ve her bir iş parçacığı için verileri ayırabilmenizi sağlayacaktır, yani yanlış önbellek paylaşımı için bir şans yoktur. Başka bir deyişle, daha hızlı olmalı.