मान लें कि मैं कुछ गहन गणना (I/O बाध्य नहीं) को पैरालाइज़ करना चाहता हूं।पायथन मल्टीप्रोसेसिंग: कोई कमी रिटर्न नहीं?
स्वाभाविक रूप से, मैं उपलब्ध प्रोसेसर की तुलना में अधिक प्रक्रियाओं को चलाने के लिए नहीं चाहता हूं या मैं संदर्भ स्विचिंग (और कैश मिस) के लिए भुगतान करना शुरू कर दूंगा।
मानसिक रूप से, मैं उम्मीद होती है कि जैसा कि मैंने multiprocessing.Pool(n)
में n
वृद्धि हुई है, कुल समय इस तरह व्यवहार होगा:
- कार्यों के रूप में नकारात्मक ढलान बनता है का लाभ लेने के
- संदर्भ के रूप में सकारात्मक ढलान स्विचिंग मुझे
- पठार
लेकिन वास्तविकता में, मैं इस हो रही है:
#!/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, मैं शेड्यूलर को अपने प्रोसेसर के माध्यम से प्रत्येक प्रक्रिया को आवंटित करने और संदर्भ स्विचिंग से बचने के बजाय प्रक्रियाओं को अपने प्रोसेसर के माध्यम से प्रक्रियाओं को घुमाने के लिए देखता हूं।
मैं सूक्ति-प्रणाली की निगरानी का उपयोग कर इस व्यवहार देख रहा हूँ: (कृपया मुझे बताएं कि कोई व्यक्ति किसी दूसरे का अनुभव है करते हैं।)
कोई स्पष्टीकरण क्यों यह कितने प्रक्रियाओं में कोई फर्क नहीं लगता है मैं नौकरी से निकालता हूँ? या मेरे कोड के साथ कुछ गलत है?
मेरा अनुमान है: ऐसा लगता है कि प्रक्रिया प्रोसेसर-बाध्य नहीं होती है (यहां तक कि जब केवल दो प्रक्रियाएं सक्रिय होती हैं, वे स्विचिंग सीपीयू रखते हैं), और इसलिए मैं वैसे भी संदर्भ स्विचिंग के लिए भुगतान कर रहा हूं।
संदर्भ:
संपादित करें: अद्यतन ग्राफिक और उच्च स्थिरांक के साथ कोड।
ब्याज से: आप कितने प्रोसेसर धागे उपलब्ध हैं? – poke
@poke, मैं उल्लेख करना भूल गया। :) मैंने उस दौरान और अन्य जानकारी को जोड़ा है। –
बस स्पष्टता के लिए: [i3-3217U] (http://ark.intel.com/products/65697/Intel- कोर-i3-3217U- प्रोसेसर -3 एम- कैश -1_80-GHz) 2 कोर के साथ 2 कोर हैं धागे प्रत्येक। आपको यह देखने के लिए कि संचरण स्विच आपकी गणना को कैसे प्रभावित करते हैं, यह देखने के लिए शायद संचयी गणना समय को भी मापना चाहिए, [यहां] (http://pastebin.com/bdc3snWB) मैंने आपकी स्क्रिप्ट का एक संशोधित संस्करण पोस्ट किया है (प्लॉटिंग सामान के बिना I अभी matplotlib स्थापित नहीं है)। – mata