2016-01-23 5 views
10

मान लें कि मैं कुछ गहन गणना (I/O बाध्य नहीं) को पैरालाइज़ करना चाहता हूं।पायथन मल्टीप्रोसेसिंग: कोई कमी रिटर्न नहीं?

स्वाभाविक रूप से, मैं उपलब्ध प्रोसेसर की तुलना में अधिक प्रक्रियाओं को चलाने के लिए नहीं चाहता हूं या मैं संदर्भ स्विचिंग (और कैश मिस) के लिए भुगतान करना शुरू कर दूंगा।

मानसिक रूप से, मैं उम्मीद होती है कि जैसा कि मैंने multiprocessing.Pool(n) में n वृद्धि हुई है, कुल समय इस तरह व्यवहार होगा:

mockup

  1. कार्यों के रूप में नकारात्मक ढलान बनता है का लाभ लेने के
  2. संदर्भ के रूप में सकारात्मक ढलान स्विचिंग मुझे
  3. पठार

लेकिन वास्तविकता में, मैं इस हो रही है:

real

#!/usr/bin/env python 

from math import factorial 


def pi(n): 
    t = 0 
    pi = 0 
    deno = 0 
    k = 0 
    for k in range(n): 
     t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k) 
     deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k)) 
     pi += t/deno 
    pi = pi * 12/(640320**(1.5)) 
    pi = 1/pi 
    return pi 

import multiprocessing 
import time 
maxx = 20 
tasks = 60 
task_complexity = 500 
x = range(1, maxx+1) 
y = [0]*maxx 

for i in x: 
    p = multiprocessing.Pool(i) 
    tic = time.time() 
    p.map(pi, [task_complexity]*tasks) 
    toc = time.time() 
    y[i-1] = toc-tic 
    print '%2d %ds' % (i, y[i-1]) 

import matplotlib.pyplot as plot 
plot.plot(x, y) 
plot.xlabel('Number of threads') 
plot.xlim(1, maxx) 
plot.xticks(x) 
plot.ylabel('Time in seconds') 
plot.show() 

मेरे मशीन: i3-3217U सीपीयू @ 1.80GHz × 4

ऑपरेटिंग सिस्टम: Ubuntu 14.04

के बाद n> 4, मैं विभिन्न प्रक्रियाओं के माध्यम से घूमने वाला कार्य प्रबंधक देखता हूं, जैसा कि प्रोसेसर की तुलना में अधिक प्रक्रियाएं होती हैं। फिर भी, एन = 4 (प्रोसेसर की संख्या) के सापेक्ष कोई जुर्माना नहीं है।

वास्तव में, यहां तक ​​कि जब भी < 4, मैं शेड्यूलर को अपने प्रोसेसर के माध्यम से प्रत्येक प्रक्रिया को आवंटित करने और संदर्भ स्विचिंग से बचने के बजाय प्रक्रियाओं को अपने प्रोसेसर के माध्यम से प्रक्रियाओं को घुमाने के लिए देखता हूं।

मैं सूक्ति-प्रणाली की निगरानी का उपयोग कर इस व्यवहार देख रहा हूँ: (कृपया मुझे बताएं कि कोई व्यक्ति किसी दूसरे का अनुभव है करते हैं।)

gnome-system-monitor

कोई स्पष्टीकरण क्यों यह कितने प्रक्रियाओं में कोई फर्क नहीं लगता है मैं नौकरी से निकालता हूँ? या मेरे कोड के साथ कुछ गलत है?

मेरा अनुमान है: ऐसा लगता है कि प्रक्रिया प्रोसेसर-बाध्य नहीं होती है (यहां तक ​​कि जब केवल दो प्रक्रियाएं सक्रिय होती हैं, वे स्विचिंग सीपीयू रखते हैं), और इसलिए मैं वैसे भी संदर्भ स्विचिंग के लिए भुगतान कर रहा हूं।

संदर्भ:

संपादित करें: अद्यतन ग्राफिक और उच्च स्थिरांक के साथ कोड।

+0

ब्याज से: आप कितने प्रोसेसर धागे उपलब्ध हैं? – poke

+0

@poke, मैं उल्लेख करना भूल गया। :) मैंने उस दौरान और अन्य जानकारी को जोड़ा है। –

+0

बस स्पष्टता के लिए: [i3-3217U] (http://ark.intel.com/products/65697/Intel- कोर-i3-3217U- प्रोसेसर -3 एम- कैश -1_80-GHz) 2 कोर के साथ 2 कोर हैं धागे प्रत्येक। आपको यह देखने के लिए कि संचरण स्विच आपकी गणना को कैसे प्रभावित करते हैं, यह देखने के लिए शायद संचयी गणना समय को भी मापना चाहिए, [यहां] (http://pastebin.com/bdc3snWB) मैंने आपकी स्क्रिप्ट का एक संशोधित संस्करण पोस्ट किया है (प्लॉटिंग सामान के बिना I अभी matplotlib स्थापित नहीं है)। – mata

उत्तर

0

वास्तव में, यहाँ तक कि जब < 4 एन, मैं अनुसूचक frenetically मेरी प्रोसेसर के माध्यम से प्रक्रियाओं घूर्णन, बजाय अपने स्वयं के प्रोसेसर के लिए प्रत्येक प्रक्रिया बताए और संदर्भ स्विचिंग से बचने के देखते हैं।

प्रोसेसर प्रोसेसर के असमान हीटिंग से बचने के मुख्य कारणों में से एक है, जो प्रोसेसर की असमान हीटिंग से बचने के मुख्य कारणों में से एक है, जो यांत्रिक तनाव पैदा कर सकता है और इसके जीवनकाल को कम कर सकता है।

एक कोर पर एक प्रक्रिया चलाने के लिए तरीके हैं (psutil मॉड्यूल देखें), जिसमें कैश मेमोरी के बेहतर उपयोग और संदर्भ स्विचिंग से बचने के फायदे हैं, लेकिन ज्यादातर मामलों में (यदि नहीं, तो) प्रदर्शन के मामले में एक बड़ा अंतर नहीं बनाते हैं।

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

+0

मुझे आपकी हीटिंग स्पष्टीकरण पसंद है, और मुझे लगता है कि यह कहानी का हिस्सा है, लेकिन मैं इसे काफी खरीद नहीं पा रहा हूं। वे प्रत्येक 30 मिनट या उससे भी कम समय में कोर बदलकर हीटिंग से बच सकते हैं, हर दूसरे या उससे कम नहीं। और मुझे बताया गया है कि विंडोज़ में यह निरंतर प्रोसेसर स्विचिंग नहीं होती है। किसी भी तरह, अगर किसी के पास कोई अन्य स्पष्टीकरण नहीं है तो मैं सही के रूप में चिह्नित करूंगा। ps: मैंने इस व्यवहार को देखने के लिए उपयोग किए जा रहे टूल का एक स्क्रीनशॉट जोड़ा है, अगर कोई इसे पुष्टि कर सकता है ... –

+0

'psutil' का उल्लेख करने के बारे में धन्यवाद; जब मुझे कुछ समय लगता है, तो मैं यह देखने के लिए कोड बदल दूंगा कि मैं प्रदर्शन में सुधार कर सकता हूं या नहीं। भविष्य के संदर्भ के लिए, 'टास्कसेट (1)' कमांड भी दिलचस्प लग रहा है। –

+1

प्रोसेसर पर कार्यों को शेड्यूल करने के लिए एकाधिक एल्गोरिदम (ओएस निर्भर) हैं। मैं हीटिंग इश्यू के मुकाबले बेहतर जवाब ढूंढता हूं, लेकिन मुझे बहुत कुछ नहीं मिलता है कि सिंगल थ्रेड प्रोग्राम्स के लिए प्रोसेस-स्विचिंग की आवश्यकता क्यों है। मुझे संदर्भ-स्विचिंग एल्गोरिदम के साथ एक संभावित प्रदर्शन सुधार का वर्णन करने वाला एक लेख मिला, लेकिन मुझे पता नहीं है कि इसका उपयोग किया जाता है या केवल शोध सामग्री है। – CoMartel

1

मेरे अपने प्रश्न का उत्तर देना:

सबसे पहले, मैं अपनी पोस्ट में एक त्रुटि प्रतिबद्ध है लगते हैं। यह सच नहीं लगता है कि इस्तेमाल होने वाले सीपीयू को बदले में बदल दिया जाता है। अगर मैं दो सीपीयू-गहन प्रक्रियाओं को आग लगाता हूं, तो वे कोर बदलते रहते हैं लेकिन केवल दो कोर के बीच होते हैं। मेरे कंप्यूटर में 4 कोर हैं जिनमें से प्रत्येक में 2 "मुलायम" कोर हैं (हाइपरथ्रेडिंग के लिए)। मुझे लगता है कि क्या हो रहा है यह है कि यह इन 2 "मुलायम" कोरों के बीच बदल रहा है। यह लिनक्स ऐसा नहीं कर रहा है, यह सीपीयू बोर्ड है।

कहा जा रहा है कि, मुझे अभी भी हैरान है कि संदर्भ स्विचिंग इससे अधिक दर्द नहीं है।

संपादित करें:this blog से अधिक, मेरे से बेहतर अनुभवजन्य काम के साथ एक अच्छी चर्चा है।

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