पर निष्पादित ओपनएमपी धागे मैं वर्तमान में 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 कोरों का उपयोग करना प्रतीत होता है (और तथ्य यह है कि सिस्टम बहुत अनुत्तरदायी हो रहा था) ।
तो मेरे प्रश्न के लिए मूल रूप से यहां क्या चल रहा है। बिंदु पर अधिक: क्या मेरी कटौती है कि सभी धागे एक ही कोर का सही ढंग से उपयोग करते हैं? यदि ऐसा है, तो उस व्यवहार के कारण क्या हो सकते हैं?
एक सामान्य त्रुटि है जिसे आपने पर्यावरण परिवर्तनीय OMP_NUM_THREADS = 4 सेट किया है? – pyCthon
@pyCthon: 'OMP_NUM_THREADS' सेट प्रतीत नहीं होता है, हालांकि ओपनएमपी 4 धागे बनाता है, मुझे नहीं लगता कि मुझे इसकी आवश्यकता होगी। – Grizzly
अजीब मैं इसे अपने आभासी मशीन के साथ कुछ हो सकता है मैं एक ही कोड भी utmpx.h स्थापित करने की कोशिश की और उस पर ठीक से काम करने के लिए लग रहा था लगता है कि एक 8 और एक 16 कोर मशीन – pyCthon