2012-02-21 14 views
7

पर निष्पादित ओपनएमपी धागे मैं वर्तमान में 4-कोर phenom2 पर openmp का उपयोग कर प्रोग्राम समानांतर प्रोग्राम कर रहा हूं। हालांकि मैंने देखा कि मेरा समांतरता प्रदर्शन के लिए कुछ भी नहीं करता है। स्वाभाविक रूप से मैंने माना कि मुझे कुछ याद आया (फाल्सशियरिंग, ताले के माध्यम से क्रमबद्धता, ...), हालांकि मैं ऐसा कुछ भी नहीं ढूंढ पाया। सीपीयू उपयोग से इसके अलावा ऐसा लगता है कि कार्यक्रम केवल एक कोर पर निष्पादित किया गया था। मुझे मिली sched_getcpu() से मुझे कोर का आईडी देना चाहिए जो वर्तमान में कॉल निष्पादित थ्रेड पर निर्धारित है।उसी सीपीयू कोर

#include <iostream> 
#include <sstream> 
#include <omp.h> 
#include <utmpx.h> 
#include <random> 
int main(){ 
    #pragma omp parallel 
    { 
     std::default_random_engine rand; 
     int num = 0; 
    #pragma omp for 
     for(size_t i = 0; i < 1000000000; ++i) num += rand(); 
    auto cpu = sched_getcpu(); 
    std::ostringstream os; 
     os<<"\nThread "<<omp_get_thread_num()<<" on cpu "<<sched_getcpu()<<std::endl; 
     std::cout<<os.str()<<std::flush; 
    std::cout<<num; 
    } 
} 

मेरी मशीन पर यह निम्नलिखित निर्गम (यादृच्छिक संख्या निश्चित रूप से अलग अलग होंगे) देता है:: तो मैं निम्नलिखित परीक्षण कार्यक्रम लिखा

Thread 2 on cpu 0 num 127392776 
Thread 0 on cpu 0 num 1980891664 
Thread 3 on cpu 0 num 431821313 
Thread 1 on cpu 0 num -1976497224 

इस से मुझे लगता है कि सभी थ्रेड पर निष्पादित एक ही कोर (आईडी 0 वाला एक)। अधिक निश्चित होने के लिए मैंने this answer से दृष्टिकोण की भी कोशिश की। परिणाम वही हैं। इसके अतिरिक्त #pragma omp parallel num_threads(1) का उपयोग निष्पादन धीमा (वास्तव में थोड़ा तेज़) नहीं किया गया है, सिद्धांत के लिए विश्वसनीयता को उधार देता है कि सभी धागे एक ही सीपीयू का उपयोग करते हैं, हालांकि तथ्य यह है कि सीपीयू हमेशा 0 के रूप में प्रदर्शित होता है, जिससे मुझे संदिग्ध बना दिया जाता है। इसके अतिरिक्त मैंने GOMP_CPU_AFFINITY चेक किया जो प्रारंभ में सेट नहीं किया गया था, इसलिए मैंने इसे 0 1 2 3 पर सेट करने का प्रयास किया, जो मुझे समझने से प्रत्येक थ्रेड को एक अलग कोर से बांधना चाहिए। हालांकि इससे कोई फर्क नहीं पड़ता।

विंडोज सिस्टम पर विकसित होने के बाद से, मैं अपने विकास के लिए वर्चुअलबॉक्स में लिनक्स का उपयोग करता हूं। तो हालांकि मैं शायद वर्चुअल सिस्टम सभी कोर तक नहीं पहुंच सका। हालांकि वर्चुअलबॉक्स की सेटिंग्स की जांच से पता चला कि वर्चुअल मशीन को सभी 4 कोर मिलना चाहिए और मेरे परीक्षण कार्यक्रम को 4 बार निष्पादित करना एक ही समय में सीपीयू उपयोग से निर्णय लेने वाले सभी 4 कोरों का उपयोग करना प्रतीत होता है (और तथ्य यह है कि सिस्टम बहुत अनुत्तरदायी हो रहा था) ।

तो मेरे प्रश्न के लिए मूल रूप से यहां क्या चल रहा है। बिंदु पर अधिक: क्या मेरी कटौती है कि सभी धागे एक ही कोर का सही ढंग से उपयोग करते हैं? यदि ऐसा है, तो उस व्यवहार के कारण क्या हो सकते हैं?

+1

एक सामान्य त्रुटि है जिसे आपने पर्यावरण परिवर्तनीय OMP_NUM_THREADS = 4 सेट किया है? – pyCthon

+0

@pyCthon: 'OMP_NUM_THREADS' सेट प्रतीत नहीं होता है, हालांकि ओपनएमपी 4 धागे बनाता है, मुझे नहीं लगता कि मुझे इसकी आवश्यकता होगी। – Grizzly

+0

अजीब मैं इसे अपने आभासी मशीन के साथ कुछ हो सकता है मैं एक ही कोड भी utmpx.h स्थापित करने की कोशिश की और उस पर ठीक से काम करने के लिए लग रहा था लगता है कि एक 8 और एक 16 कोर मशीन – pyCthon

उत्तर

6

कुछ प्रयोग मुझे पता चला है कि समस्या यह है कि मैं ग्रहण आईडीई, जो उचित रूप में केवल एक कोर का उपयोग करने के संबंध सेट अंदर से मेरी कार्यक्रम शुरू किया गया था के बाद। मैंने सोचा कि आईडीई के बाहर से शुरू होने पर मुझे वही समस्याएं मिलीं, लेकिन एक बार-बार परीक्षण से पता चला कि कार्यक्रम आदर्श के अंदर से टर्मिनल से शुरू होने पर ठीक काम करता है।

0

आप #pragma omp parallel for
का उपयोग करना चाहिए और हाँ, आप OMP_NUM_THREADS की जरूरत नहीं के बारे में सही कर रहे हैं। omp_set_num_threads(4); को भी ठीक किया जाना चाहिए था।

+0

मैं '#pragma omp समानांतर 'का उपयोग क्यों करूं, अगर मैं थ्रेड को लूप के बाहर चीजें करना चाहता हूं (जैसे आउटपुट में अपनी आईडी लिखना)? और जैसा कि मैंने उल्लेख किया है कि यह डिफ़ॉल्ट रूप से 4 थ्रेड बनाता है, बस उसी कोर – Grizzly

+0

पर निष्पादित किया जाता है यह भी सच है। बीटीडब्ल्यू, यदि आप omp * समानांतर * नहीं कहते हैं, तो लूप में कोई समांतरता नहीं होती है। लेकिन निश्चित रूप से आप एक समांतर खंड के अंदर हैं, इसलिए .... एकमात्र अन्य संभावित स्पष्टीकरण जो मैं सोच सकता हूं वह आपके वर्चुअलबॉक्स के लिए हार्डवेयर समर्थन की कमी है। क्या आपने अन्य सीपीयू के साथ कोशिश की है? http://superuser.com/questions/33723/getting-2- प्रोसेसर-to-work-with-virtualbox-on-dual-core-celeron – Nav

+0

मैंने नहीं किया। हालांकि जैसा कि बताया गया है कि वीबॉक्स से सभी कोरों का उपयोग करना संभव है, इसलिए समर्थन की कमी – Grizzly

0

अगर आप खिड़कियों पर चल रहे हैं, इस प्रयास करें:

c: \ windows \ system32 \ cmd.exe/C शुरू/आत्मीयता एफ पथ \ \ अपने \ program.exe को

/आत्मीयता 1 CPU0 का उपयोग करता

/आत्मीयता 2 का उपयोग करता है CPU1

/आत्मीयता 3 का उपयोग करता है CPU0 और CPU1

/आत्मीयता 4 CPU2

का उपयोग करता है 10

/एफ़िनिटी एफ सभी 4 कोर

संख्या को हेक्स में कनवर्ट करें, और दाईं ओर से बिट्स को उपयोग करने के लिए कोर का उपयोग करें।

कार्य-प्रबंधक का उपयोग करते हुए आप एफ़िनिटी को सत्यापित कर सकते हैं।

+0

की संभावना नहीं लगती है। वीबॉक्स में सभी कोरों का उपयोग करने के लिए सही संबंध है (मैंने जांच की है और इसके अलावा यह मेरे परीक्षण में एकाधिक परीक्षणों के साथ कैसे उपयोग करेगा मेरे testprogram से शुरू होता है)। चूंकि मैं vbox के अंदर लिनक्स का उपयोग करता हूं जो वास्तव में वहां मदद नहीं करता है। – Grizzly

1

मैंने आपके प्रोग्राम को g ++ 4 का उपयोग करके संकलित किया।6 लिनक्स

g++ --std=c++0x -fopenmp test.cc -o test 

पर उत्पादन किया गया था, आश्चर्य:

Thread 2 on cpu 2 

Thread 3 on cpu 1 
910270973 
Thread 1 on cpu 3 
910270973 
Thread 0 on cpu 0 
910270973910270973 

तथ्य यह है कि 4 धागे शुरू कर रहे हैं (आप किसी भी तरह से धागे की संख्या निर्धारित नहीं की है, जैसे OMP_NUM_THREADS का प्रयोग करके) मतलब चाहिए कि कार्यक्रम 4 प्रयोग योग्य CPUs देखने में सक्षम है। मुझे लगता है कि यह उनका उपयोग क्यों नहीं कर रहा है, लेकिन मुझे आपके हार्डवेयर/सॉफ़्टवेयर सेटिंग में कुछ वातावरण चर, या कंपाइलर विकल्पों में कोई समस्या है।

संबंधित मुद्दे