Aracılığıyla paylaş


2.7.2.6 azaltma

Bu yan tümce görünür rakamsal değişkenler azaltma gerçekleştirir değişken listesi, operatör op ile.Sözdizimi reduction yan tümcesi aşağıdaki gibidir:

reduction(op:variable-list)

Azaltma genellikle aşağıdaki biçimlerden birinde bir ifade için belirtilen:

x     =  x     op     expr
x     binop=  expr
x     =  expr     op     x            (except for subtraction)
x++
++x
x--
--x

Burada:

  • x
    Belirtilen küçültme değişkenlerinden biri list.

  • değişken listesi
    Skalar azaltma değişkenlerini virgülle ayrılmış listesi.

  • ifade
    Bir deyim değil başvuru skalar türü olan x.

  • op
    Biri dışında bir aşırı yüklü operatör +, *, - &, ^, |, & &, veya ||.

  • binop
    Biri dışında bir aşırı yüklü operatör +, *, - &, ^, veya |

Aşağıdaki bir örnektir reduction yan tümcesi:

#pragma omp parallel for reduction(+: a, y) reduction(||: am)
for (i=0; i<n; i++) {
   a += b[i];
   y = sum(y, c[i]);
   am = am || b[i] == c[i];
}

Örnekte gösterildiği gibi bir operatör bir işlev çağrısı içinde gizli olabilir.Kullanıcı işleci, belirtilen dikkatli reduction yan tümcesi azaltma işlemi ile eşleşir.

Ancak, sağ işlenen || Operatör Bu örnekte hiçbir yan etkileri vardır, bunlar izin verilir, ancak dikkatli kullanılmalıdır.Bu bağlamda, paralel yürütme sırasında ardışık döngü sırasında ortaya değil garanti bir yan etkisi oluşabilir.Bu fark, yineleme yürütme sırasını belirsiz olduğu için oluşabilir.

Operatör azaltılmasında derleyici tarafından kullanılan özel değişkenlerin başlangıç değerini belirlemek için ve sonlandırma işleci belirlemek için kullanılır.Operatör açıkça belirten yapı sözlü kapsamı dışında olacak şekilde azaltma deyimi sağlar.Herhangi bir sayıda reduction yan tümceleri yönergede belirtilen, ancak en fazla birinde görüntülenebilir bir değişken reduction o yönergesi için yan tümcesi.

Her değişkenin özel bir kopyasını değişken listesi , her iş parçacığı için bir tane oluşturulur gibi private yan tümcesi kullanıldığını.Özel Kopyala işleci göre başlatılır (aşağıdaki tabloya bakın).

Bölge, sonunda reduction yan tümcesi belirtildi, orijinal nesnenin özgün değeri belirtilen işlecini kullanarak özel kopyaları her son değeri ile birleştirilmesi sonucu yansıtacak şekilde güncelleştirilir.Azaltma işleçleri (çıkarma) dışındaki tüm ilişkilendirilebilir ve derleyici son değer SD serbestçe yeniden ilişkilendirmek.(Kısmi sonuçlar çıkarma azaltma, son değer oluşturacak şekilde eklenir.)

İlk iş parçacığı içeren yan tümcesi ulaşır ve azaltma hesaplama işlemi tamamlanana kadar bunu kalırsa orijinal nesnenin değeri belirsiz olur.Normalde, SD yapýsýnýn sonunda tamamlanmış olacaktır; Ancak, reduction yan tümcesi bir yapı olduğu için kullanılır nowait olan tüm iş parçacıklarını tamamladığınızdan emin olmak için bir engel eşitleme işlemi yapılıncaya kadar da uygulanan orijinal nesnenin değeri belirsiz kalır reduction yan tümcesi.

Aşağıdaki tabloda, geçerli işleçler ve kurallı başlatma değerlerini listeler.Gerçek değerini azaltma değişken veri türüyle tutarlı olacaktır.

İşleç

Başlatma

+

0

*

1

-

0

&

~0

|

0

^

0

& &

1

||

0

Kısıtlamalar reduction yan tümcesi aşağıdaki gibidir:

  • Değişkenlerin türü reduction yan tümcesi olmalıdır azaltma işleci için geçerli işaretçi türleri ile başvuru türleri asla izin olmasıdır.

  • Belirtilen değişken reduction yan tümcesi olmamalıdır const-tam.

  • Paralel bölgesinde özel veya görüntülenen değişkeni reduction yan tümcesi bir paralel içindeki direktifini belirtilemez bir reduction paralel yapýsýna bağlayan bir iş paylaşımı yönergesi üzerinde yan tümcesi.

    #pragma omp parallel private(y)
    { /* ERROR - private variable y cannot be specified
                 in a reduction clause */
       #pragma omp for reduction(+: y)
       for (i=0; i<n; i++)
          y += b[i];
    }
    
    /* ERROR - variable x cannot be specified in both
               a shared and a reduction clause */
    #pragma omp parallel for shared(x) reduction(+: x)