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.