คำแนะนำเกี่ยวกับ Python สำหรับการเขียนโปรแกรมแบบขนานหน่วยความจำ


11

ฉันมีประสบการณ์ในการเขียนรหัส OpenMP สำหรับเครื่องหน่วยความจำที่ใช้ร่วมกัน (ทั้งใน C และ FORTRAN) เพื่อทำงานง่ายๆเช่นการเพิ่มเมทริกซ์การคูณและอื่น ๆ (เพื่อดูว่ามันแข่งขันกับ LAPACK อย่างไร) ฉันรู้จัก OpenMP มากพอที่จะทำงานง่ายๆโดยไม่จำเป็นต้องดูเอกสาร

เมื่อเร็ว ๆ นี้ฉันเปลี่ยนเป็น Python สำหรับโครงการของฉันและฉันไม่มีประสบการณ์ใด ๆ กับ Python เกินพื้นฐานแน่นอน

ฉันมีคำถาม 2 ข้อ:

  • มีคำแนะนำที่ดี (PDF ออนไลน์) สำหรับการอธิบายการคำนวณหน่วยความจำแบบขนานที่ใช้ร่วมกันสำหรับ Python หรือไม่?

  • วิธีที่ดีที่สุดในการบรรลุเป้าหมายคืออะไร? ฉันเคยเห็นมาบ้างctypesแล้วและฉันก็ไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดหรือไม่ (โดยที่ดีที่สุดฉันหมายถึงหนึ่งซึ่งมีการแลกเปลี่ยนที่ดีระหว่างเวลาโปรแกรมเมอร์และเวลาระบบมันไม่ควรน่าเบื่อเกินไปที่จะเขียนโค้ดและไม่ควรทำการประมวลผลที่ช้า)

คำตอบ:


8

[นี่เป็นโพสต์แรกของฉันและฉันหวังว่าฉันจะไม่เข้าใจการใช้ SE อย่างสมบูรณ์ - ถ้าฉันขอโทษล่วงหน้า]

ฉันเห็นด้วยกับ "bgschaid" ว่าคำถามนั้นยากมากที่จะตอบตามข้อมูลที่ให้ไว้ มันสร้างความแตกต่างอย่างมากถ้าคุณต้องการรูทีนระดับต่ำเพื่อใช้ประโยชน์จากสถาปัตยกรรมแบบมัลติคอร์หรือหากคุณต้องการใช้ประโยชน์จากความขนานในการแก้ปัญหาแบบขนานที่น่าอับอาย - หรือสิ่งที่อยู่ในระหว่าง ภาพรวมของความเป็นไปได้การคำนวณแบบขนานที่แตกต่างกันในหลามสามารถพบได้ที่นี่

ในกรณีก่อนหน้านี้ฉันขอแนะนำให้ใช้เครื่องมือเช่นNumPy / SciPyซึ่งอย่างน้อยในรุ่นที่คอมไพล์ MKL จาก Enthought สนับสนุนสถาปัตยกรรมแบบมัลติคอร์ ที่นี่คุณสามารถควบคุมจำนวนคอร์ที่จะใช้ผ่านตัวแปรสภาพแวดล้อม "MKL_NUM_THREADS" สิ่งนี้ขึ้นอยู่กับห้องสมุดที่ได้รับการปรับปรุงให้ดีที่สุดซึ่งเราคาดหวังได้ยากที่จะเอาชนะประสิทธิภาพ ฉันเชื่อว่าขอแนะนำให้ใช้ไลบรารีที่มีคุณภาพสูงและปรับให้เหมาะสมสูงสุดเมื่อใดก็ตามที่เป็นไปได้

หากคุณต้องการใช้ประโยชน์จากความขนานในระดับหยาบเครื่องมือมัลติโพรเซสซิงของ Python นั้นใช้งานง่าย - และยังรองรับวัตถุข้อมูลที่ใช้ร่วมกัน มีเครื่องมือต่าง ๆ ที่ใช้เป็นส่วนหนึ่งของแพ็คเกจการประมวลผลหลายตัว ฉันใช้map_async (ชอบ SIMD) และApply_async (MIMD like) สำหรับปัญหาหลายอย่างที่ให้ผลลัพธ์ที่ดี multiprocessingแพคเกจค่อนข้างง่ายต่อการใช้งานและการเป็นส่วนหนึ่งของมาตรฐานของงูใหญ่หมายความว่าคุณสามารถคาดหวังว่าผู้ที่มีศักยภาพอื่น ๆ ของรหัสของคุณได้อย่างง่ายดายสามารถที่จะใช้มัน การประมวลผลหลายตัวยังเชื่อมโยงไปยังวัตถุข้อมูล NumPy โดยตรง เมื่อใช้การประมวลผลหลายตัวฉันอยากจะแนะนำให้คุณตั้งค่าตัวแปรสภาพแวดล้อม "MKL_NUM_THREADS" เป็น 1 เพื่อให้NumPyอนุญาตให้หนึ่งคอร์สำหรับแต่ละกระบวนการ / ผู้ปฏิบัติงาน - มิฉะนั้นคุณสามารถจบลงในการช่วงชิงทรัพยากรระหว่าง NumPy แบบขนานและมัลติโปรเซสเซอร์ซึ่งนำไปสู่การเสื่อมประสิทธิภาพ การประมวลผลหลายตัวทำงานได้ดีสำหรับสถาปัตยกรรม multi-CPU / multi-core ภายใต้ระบบปฏิบัติการเดียวกัน ฉันใช้มัลติโปรเซสเซอร์บนคอมพิวเตอร์หน่วยความจำที่ใช้ร่วมกันซึ่งมี 4 x Xeon E7-4850 CPU (แต่ละ 10 คอร์) และหน่วยความจำ 512 GB และทำงานได้ดีมาก อาร์เรย์ที่ใช้ร่วมกันสามารถจัดการโดยmultiprocessing.Arrayหรือsharedctypes คุณสามารถค้นหาเอกสาร Python ได้ที่นี่ - ตรวจสอบไฟล์library.pdf ฉันมีสไลด์อธิบายบางส่วนพื้นฐานของเรื่องนี้ - PM ฉันถ้าคุณต้องการเหล่านั้น

หากคุณมีการกำหนดค่าคลัสเตอร์ที่มีหน่วยความจำแบบกระจายฉันเชื่อว่าmpi4pyเป็นเครื่องมือที่ต้องการ ฉันไม่ได้ใช้สิ่งนี้ด้วยตัวเอง แต่ฉันรู้ว่ามันถูกใช้อย่างมากในการเขียนโปรแกรม Python แบบขนาน


3

ขึ้นอยู่กับระดับที่คุณพยายามเขียนโปรแกรมแบบขนาน ยกตัวอย่างเช่นสำหรับสิ่งเมทริกซ์ / เวกเตอร์จุดแรกกับงูหลามจะ NumPy / SciPy (พวกเขาให้อินเตอร์เฟซที่ห้องสมุดเป็นตัวเลขที่ช่วยให้คุณความเร็วเต็มรูปแบบของห้องสมุดด้วยความสะดวกสบายของงูใหญ่ ๆ ) และจากสิ่งที่พวกเขาเขียนเกี่ยวกับความเท่าเทียมมันก็ดูเหมือนว่า ถ้าไลบรารีถูกคอมไพล์สำหรับการใช้แบบขนานโปรแกรมจะใช้ประโยชน์จากมัลติคอร์สำหรับการดำเนินการบางอย่าง (ดูเหมือนว่าบทความนี้จะเก่าไปหน่อยสิ่งต่าง ๆ ที่อาจได้รับการปรับปรุงให้ดีขึ้นในระหว่างนี้นอกจากนี้ยังมีลิงก์ไปยังวิธีการอื่นของการเขียนโปรแกรมแบบขนาน

และแน่นอนว่ามีmpi4pyสำหรับโปรแกรม MPI โดยตรง (รวมอยู่ในบทความด้านบน)

บรรทัดล่างของฉันคือ: ถ้าความสนใจหลักของคุณคือ vector / matrix-operation และ parallelism เป็นสิ่งที่คุณ "เท่านั้น" ต้องทำเร็วคุณควรจะดู NumPy / SciPy-systems และถ้าคุณไม่พบ สิ่งที่คุณจำเป็นต้องมีในการเขียนห้องสมุดของคุณเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.