2010-12-23 9 views
13

में धागे नहीं बना रहा है मेरे ओपनएमपी संस्करण ने कोई गति वृद्धि नहीं दी है। मेरे पास दोहरी कोर मशीन है और सीपीयू उपयोग हमेशा 50% है। तो मैंने विकी में दिए गए नमूना कार्यक्रम की कोशिश की। ऐसा लगता है कि ओपनएमपी कंपाइलर (विजुअल स्टूडियो 2008) एक से अधिक धागे नहीं बना रहा है।ओपनएमपी विजुअल स्टूडियो

Hello World from thread 0 
There are 1 threads 
Press any key to continue . . . 

उत्तर

16

कार्यक्रम के साथ कुछ भी गलत नहीं है - तो संभवत: इसमें कुछ समस्या है कि इसे कैसे संकलित या चलाया जा रहा है। क्या यह वीएस -2008 प्रो है? एक त्वरित Google आस-पास सुझाव देता है कि मानक में ओपनएमपी सक्षम नहीं है। क्या ओपनएमपी गुणों में सक्षम है -> सी/सी ++ -> भाषा -> ओपनएमपी? (उदाहरण के लिए, आप/openmp के साथ संकलित कर रहे हैं)? क्या पर्यावरण चर OMP_NUM_THREADS इसे चलाने पर कहीं और 1 पर सेट किया जा रहा है?

+1

को वातावरण चर OMP_DYNAMIC की स्थापना करके काम कर मिल गया बहुत बहुत शुक्रिया। मैं/openmp के साथ संकलित नहीं था। अब आकर्षक के रूप में काम करता है :) – Nishanth

-1

क्यों आपको लगता है कि कार्यक्रम के लिए एक से अधिक धागा की आवश्यकता होगी:

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

int main (int argc, char *argv[]) { 
    int th_id, nthreads; 
    #pragma omp parallel private(th_id) 
    { 
    th_id = omp_get_thread_num(); 
    printf("Hello World from thread %d\n", th_id); 
    #pragma omp barrier 
    if (th_id == 0) { 
     nthreads = omp_get_num_threads(); 
     printf("There are %d threads\n",nthreads); 
    } 
    } 
    return EXIT_SUCCESS; 
} 

यह आउटपुट है कि मैं मिलता है:

इस कार्यक्रम है? यह स्पष्ट रूप से मामला है कि ओपनएमपी को यह एहसास होता है कि बिना किसी लूप वाले प्रोग्राम चलाने के लिए अतिरिक्त थ्रेड बनाने की आवश्यकता नहीं है, कोई भी कोड जो समानांतर में चल सकता है।

ओपनएमपी के साथ कुछ समांतर सामान चलाने का प्रयास करें। this की तरह कुछ:

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define CHUNKSIZE 10 
#define N  100 

int main (int argc, char *argv[]) 
{ 
int nthreads, tid, i, chunk; 
float a[N], b[N], c[N]; 

/* Some initializations */ 
for (i=0; i < N; i++) 
    a[i] = b[i] = i * 1.0; 
chunk = CHUNKSIZE; 

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid) 
    { 
    tid = omp_get_thread_num(); 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 
    printf("Thread %d starting...\n",tid); 

    #pragma omp for schedule(dynamic,chunk) 
    for (i=0; i<N; i++) 
    { 
    c[i] = a[i] + b[i]; 
    printf("Thread %d: c[%d]= %f\n",tid,i,c[i]); 
    } 

    } /* end of parallel section */ 

} 

आप कुछ हार्ड कोर सामान चाहते हैं, one of these चलाने की कोशिश करें।

2

यदि आप एक से अधिक धागे के साथ अपने प्रोग्राम का परीक्षण करना चाहते हैं, तो ओपनएमपी समांतर क्षेत्र में धागे की संख्या निर्दिष्ट करने के लिए कई संरचनाएं हैं।

  • NUM_THREADS की यदि खंड
  • सेटिंग खंड omp_set_num_threads() पुस्तकालय समारोह के
  • स्थापना की
  • उपयोग का मूल्यांकन: वे श्रेष्ठता के क्रम में, कर रहे हैं OMP_NUM_THREADS पर्यावरण चर
  • कार्यान्वयन डिफ़ॉल्ट

ऐसा लगता है अपने कार्यान्वयन की तरह एक धागा करने के लिए दोषी है (यह मानते हुए आप OMP_NUM_THREADS = 1 अपने वातावरण में सेट नहीं है)।

4 धागे के साथ परीक्षण करने के लिए, उदाहरण के लिए, आप (4) अपने #pragma omp समानांतर निर्देश के लिए NUM_THREADS जोड़ सकते हैं।

जैसा कि दूसरे उत्तर में कहा गया है, आपको वास्तव में कोई भी "गति" नहीं दिखाई देगा क्योंकि आप किसी समांतरता का शोषण नहीं कर रहे हैं। लेकिन यह परीक्षण करने के लिए कई धागे के साथ "हैलो वर्ल्ड" प्रोग्राम चलाने के लिए उचित है।