क्रिटिकल ओपन

Aug 19 2020

इस प्रश्न के बाद , नीचे दिए गए कोड के लिए ( MS OpenMP डॉक्स उदाहरण से )

// 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);
}

क्या मैं बाहर निकाल सकता हूं अगर टेस्ट और करूं

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];
    }
}

जवाब

1 cos_theta Aug 19 2020 at 16:53

आप कर सकते हैं, लेकिन यह प्रभावी रूप से अनुक्रमिक निष्पादन का परिणाम है। धागे लगातार महत्वपूर्ण खंड में प्रवेश करने की प्रतीक्षा कर रहे हैं जैसे कि केवल एक धागा एक बार में लूप बॉडी को निष्पादित करता है। इसलिए, आपको समान सीरियल लूप की तुलना में समान प्रदर्शन (शायद सिंक्रनाइज़ेशन ओवरहेड के कारण भी बदतर) मिलता है।

एमएस डॉक्स से उदाहरण केवल तभी सिंक्रनाइज़ होता है जब एक नया अधिकतम मूल्य सामने आया हो। यह समानांतर में इस बिंदु तक सभी निचले मूल्यों को संसाधित करने की अनुमति देता है।

जैसा कि टिप्पणियों में सुझाया गया है, एक कमी निर्माण का उपयोग करें।