2011-06-04 12 views
8

मैं अपने VirtualBoxed उबंटू 11,4गो कथन समानांतर में क्यों निष्पादित नहीं करता है?

package main 

import ("fmt";"time";"big") 
var c chan *big.Int 

func sum(start,stop,step int64) { 
    bigStop := big.NewInt(stop) 
    bigStep := big.NewInt(step) 
    bigSum := big.NewInt(0) 
    for i := big.NewInt(start);i.Cmp(bigStop)<0 ;i.Add(i,bigStep){ 
     bigSum.Add(bigSum,i) 
    } 
    c<-bigSum   
} 

func main() { 
    s := big.NewInt(0) 
    n := time.Nanoseconds() 

    step := int64(4) 
    c = make(chan *big.Int , int(step)) 
    stop := int64(100000000) 
    for j:=int64(0);j<step;j++{ 
     go sum(j,stop,step)  
    } 
    for j:=int64(0);j<step;j++{ 
     s.Add(s,<-c) 
    } 
    n = time.Nanoseconds() - n 
    fmt.Println(s,float64(n)/1000000000.) 
} 

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

मैं क्या गलत कर रहा हूं?

उत्तर

24

आप शायद जो (यदि दोनों नहीं) अपने मामले पर लागू होते हैं Concurrency section of the Go FAQ, विशेष रूप से इन दो सवालों पर गौर करें और बाहर काम करने की जरूरत है:

क्यों नहीं मेरी बहु goroutine कार्यक्रम उपयोग करता है एकाधिक सीपीयू?

आप GOMAXPROCS खोल पर्यावरण चर सेट या इसी तरह के नाम function क्रम पैकेज के का उपयोग क्रम में एक से अधिक ओएस धागा उपयोग करने के लिए समर्थन अनुमति देने के लिए करना चाहिए।

समानांतर गणना निष्पादित करने वाले कार्यक्रमों को GOMAXPROCS में वृद्धि से लाभ होना चाहिए। हालांकि, ध्यान रखें कि concurrency is not parallelism

GOMAXPROCS> 1 का उपयोग क्यों करते हैं कभी-कभी मेरा प्रोग्राम धीमा कर देता है?

यह आपके प्रोग्राम की प्रकृति पर निर्भर करता है। ऐसे कार्यक्रम जिनमें कई गोरोटाइन्स शामिल हैं जो चैनलों पर संचार करने में बहुत समय व्यतीत करते हैं एकाधिक प्रदर्शन ओएस थ्रेड्स का उपयोग करते समय अनुभव प्रदर्शन गिरावट । यह संदर्भ-स्विचिंग जुर्माना में धागे के बीच डेटा भेजने के कारण महत्वपूर्ण स्विचिंग जुर्माना के कारण है।

गो का goroutine शेड्यूलर जितना अच्छा होना चाहिए उतना अच्छा नहीं है। भविष्य में, यह ऐसे मामलों को पहचानना चाहिए और ओएस थ्रेड के उपयोग को अनुकूलित करना चाहिए। के लिए, GOMAXPROCS को प्रति-आवेदन आधार पर सेट किया जाना चाहिए।

इस विषय पर अधिक जानकारी के लिए Concurrency is not Parallelism नामक बातचीत देखें।

+1

यह भी ध्यान रखें कि डिफ़ॉल्ट "1" – mnagel

+1

ओएसएक्स 10.11 पर go1.6.3 के साथ डिफ़ॉल्ट CPU कोर की संख्या है। मेरा मानना ​​है कि यह गो v1.5 में बदल गया था। – Xeoncross

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