openmp kritik
Aug 19 2020
Bu soruyu takiben , aşağıdaki kod için ( MS OpenMP docs örneğinden )
// omp_critical.cpp
// compile with: /openmp
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main()
{
int i;
int max;
int a[SIZE];
for (i = 0; i < SIZE; i++)
{
a[i] = rand();
printf_s("%d\n", a[i]);
}
max = a[0];
#pragma omp parallel for num_threads(4)
for (i = 1; i < SIZE; i++)
{
if (a[i] > max)
{
#pragma omp critical
{
// compare a[i] and max again because max
// could have been changed by another thread after
// the comparison outside the critical section
if (a[i] > max)
max = a[i];
}
}
}
printf_s("max = %d\n", max);
}
Test edip yaparsam dışını kaldırabilir miyim
max = a[0];
#pragma omp parallel for num_threads(4)
for (i = 1; i < SIZE; i++)
{
#pragma omp critical
{
// compare a[i] and max again because max
// could have been changed by another thread after
// the comparison outside the critical section
if (a[i] > max)
max = a[i];
}
}
Yanıtlar
1 cos_theta Aug 19 2020 at 16:53
Yapabilirsiniz, ancak bu etkili bir şekilde sıralı yürütmeye neden olur. İplikler sürekli olarak kritik bölüme girmeyi bekliyorlar, öyle ki bir seferde sadece bir iş parçacığı döngü gövdesini yürütür. Bu nedenle, düz bir seri döngü ile aynı performansı elde edersiniz (senkronizasyon ek yükü nedeniyle belki daha da kötüsü).
MS belgelerindeki örnek, yalnızca yeni bir maksimum değerle karşılaşıldığında senkronize olur. Bu, bu noktaya kadar tüm düşük değerlerin paralel olarak işlenmesine izin verir.
Yorumlarda önerildiği gibi, bir indirgeme yapısı kullanın.
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'