2012-11-03 6 views
14

का उपयोग करता हूं तो मुझे अलग थ्रेड आईडी क्यों नहीं मिल रही हैं जब मैं "#pragma omp समानांतर num_threads (4)" का उपयोग करता हूं तो मुझे अलग थ्रेड आईडी क्यों नहीं मिल रही हैं। इस मामले में सभी थ्रेड आईडी 0 हैं। लेकिन जब मैं लाइन पर टिप्पणी करता हूं और धागे की डिफ़ॉल्ट संख्या का उपयोग करता हूं, तो मुझे अलग थ्रेड आईडी मिलती हैं। नोट: - परिवर्तनीय मैंने थ्रेड आईडी प्राप्त करने के लिए वेरिएबल टिड का उपयोग किया।ओपनएमपी: जब मैं "#pragma omp समानांतर num_threads (4)"

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
int nthreads, tid; 
int x = 0; 

#pragma omp parallel num_threads(4) 
#pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 

    } 


} 

उपरोक्त कोड का आउटपुट: -

Hello World from thread = 0 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Number of threads = 1 

आउटपुट जब मैं रेखा से ऊपर उल्लेख किया है टिप्पणी: -

Hello World from thread = 3 
Hello World from thread = 0 
Number of threads = 4 
Hello World from thread = 1 
Hello World from thread = 2 
+0

नोट: - संकलन मैं किया के लिए gcc-fopenmp open.c -o हैलो –

उत्तर

14

आप दो नेस्टेड समानांतर क्षेत्रों बना रहे हैं। यह ऐसा करने के समान ही है:

#pragma omp parallel num_threads(4) 
{ 
    #pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
    tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
     nthreads = omp_get_num_threads(); 
     printf("Number of threads = %d\n", nthreads); 
    } 
    } 
} 

omp_get_num_threads() अंतरतम क्षेत्र में धागे की संख्या दिखाता है। तो आप चार धागे निष्पादित कर रहे हैं, जिनमें से प्रत्येक एक धागा निष्पादित कर रहा है।

आंतरिक समानांतर क्षेत्र केवल एक थ्रेड निष्पादित कर रहा है, क्योंकि आपने नेस्टेड समांतरता को सक्षम नहीं किया है। आप omp_set_nested(1) पर कॉल करके इसे सक्षम कर सकते हैं।

http://docs.oracle.com/cd/E19205-01/819-5270/aewbi/index.html

, तो इसके बजाय दो नेस्टेड समानांतर क्षेत्रों बनाने का, आप एक ही समानांतर क्षेत्र बनाने के लिए और दो गुण निर्दिष्ट करना चाहता है, तो आप ऐसा कर सकते हैं:

#pragma omp parallel num_threads(4) private(nthreads,tid) 
{ 
    . 
    . 
    . 
} 
+0

मैंने कोशिश की "#pragma omp_set_nested (1)", लेकिन यह काम नहीं कर रहा है। मैं इसे अभी लिख रहा हूं "#pragma omp समानांतर num_threads (4)", जहां मैं गलत हूं? –

+1

@ जयेशथिला: omp_set_nested() एक नियमित कार्य है –

+0

मुझे भी tid = 0 धन्यवाद का कारण मिला –