मैं यहां नया हूं और सी में एक शुरुआती स्तर प्रोग्रामर हूं। मुझे फॉर-लूप को गति देने के लिए ओपनएमपी का उपयोग करने में कुछ समस्या है। नीचे सरल उदाहरण है:लूप के लिए ओपनएमपी और सी समानांतर: OpenMP का उपयोग करते समय मेरा कोड धीमा क्यों होता है?
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <omp.h>
gsl_rng *rng;
main()
{
int i, M=100000000;
double tmp;
/* initialize RNG */
gsl_rng_env_setup();
rng = gsl_rng_alloc (gsl_rng_taus);
gsl_rng_set (rng,(unsigned long int)791526599);
// option 1: parallel
#pragma omp parallel for default(shared) private(i, tmp) schedule(dynamic)
for(i=0;i<=M-1;i++){
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
}
// option 2: sequential
for(i=0;i<=M-1;i++){
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
}
}
कोड एम पुनरावृत्तियों के लिए गामा यादृच्छिक वितरण से खींचता है। यह openmp (विकल्प 1) के साथ समानांतर दृष्टिकोण को लगभग 1 मिनट लेता है जबकि अनुक्रमिक दृष्टिकोण (विकल्प 2) केवल 20 सेकंड लेता है। ओपनएमपी के साथ चलते समय, मैं देख सकता हूं कि सीपीयू उपयोग 800% है (जिस सर्वर का मैं उपयोग कर रहा हूं वह 8 सीपीयू है)। और सिस्टम जीसीसी 4.1.3 के साथ लिनक्स है। मैं संकलित कमांड का उपयोग कर रहा हूं gcc-fopenmp -lgsl -lgslcblas -lm (मैं जीएसएल का उपयोग कर रहा हूं)
क्या मैं कुछ गलत कर रहा हूं? कृपया मेरी मदद करें! धन्यवाद!
पीएस जैसा कि कुछ उपयोगकर्ताओं द्वारा इंगित किया गया है, यह आरएनजी के कारण हो सकता है। लेकिन फिर भी अगर मैं की जगह
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
से कहना
tmp=1000*10000;
समस्या अभी भी वहाँ ...
आपको अपना लूप वैरिएबल मैं निजी नहीं बनाना चाहिए - ओपनएमपी इसका ख्याल रखेगा। मुझे नहीं पता कि यह निष्पादन को प्रभावित करता है, लेकिन आपको इसे ठीक करना चाहिए और पुनः स्थापित करना चाहिए। –
इसके अलावा, ध्यान दें कि tmp = 1000 * 10000 शायद कंपाइलर द्वारा एक नोप पर अनुकूलित हो जाता है, जिससे आपका समय समाप्त हो जाएगा। –
क्या आप वाकई 8 सीपीयू हैं? क्या यह हाइपरथ्रेडिंग के साथ क्वाड-कोर हो सकता है? –