อัลกอริทึมการเรียงลำดับแบบขนานใดที่มีประสิทธิภาพกรณีเฉลี่ยที่ดีที่สุด


136

การเรียงลำดับใช้ O (n log n) ในกรณีอนุกรม หากเรามีโปรเซสเซอร์ O (n) เราหวังว่าจะได้รับการเร่งความเร็วเชิงเส้น O (log n) อัลกอริทึมแบบขนานมีอยู่ แต่มีค่าคงที่สูงมาก นอกจากนี้ยังไม่สามารถใช้ได้กับฮาร์ดแวร์สินค้าโภคภัณฑ์ซึ่งไม่มีที่ใดก็ได้ใกล้กับโปรเซสเซอร์ O (n) ด้วยโปรเซสเซอร์ p อัลกอริทึมที่เหมาะสมควรใช้เวลา O (n / p log n)

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

ฉันต้องการจัดเรียงรายการ 1 ล้านถึง 100 ล้านองค์ประกอบในภาษา JVM ที่ทำงานบน 8 ถึง 32 คอร์


1
ฉันคิดว่าคุณมีจำนวน n / p มากเกินไปใน "ควรใช้" ของคุณ
Sparr

@Sparr ฉันไม่คิดอย่างนั้น ฉันกำลังสร้างความแตกต่างระหว่างการมีโปรเซสเซอร์เพียงไม่กี่ตัวและการมีโปรเซสเซอร์มากพอ ๆ กับการจัดเรียงองค์ประกอบ
Craig P. Motlin

@ CraigP.Motlin ถูกต้อง แต่ดูเหมือนว่าคุณจะ "แจกจ่าย" / p ผิดพลาด ควรมีเพียงหนึ่ง / หน้า
Sparr

@Sparr อาเปลี่ยนที่ขอบคุณ
Craig P. Motlin

@ CraigP.Motlin ฉันคิดว่าคุณคิดผิด :)
Sparr

คำตอบ:


206

บทความต่อไปนี้ (ดาวน์โหลด PDF) เป็นการศึกษาเปรียบเทียบอัลกอริธึมการเรียงลำดับแบบขนานในสถาปัตยกรรมต่างๆ:

อัลกอริทึมการเรียงลำดับแบบขนานบนสถาปัตยกรรมต่างๆ

ตามบทความการจัดเรียงตัวอย่างดูเหมือนจะดีที่สุดสำหรับสถาปัตยกรรมแบบขนานหลายประเภท

อัปเดตเพื่อแก้ไขปัญหาเรื่องอายุของ Mark:

ต่อไปนี้เป็นบทความล่าสุดที่แนะนำสิ่งที่แปลกใหม่กว่า (จากปี 2550 ซึ่ง btw ยังคงเปรียบเทียบกับการจัดเรียงตัวอย่าง):

การปรับปรุงการจัดเรียงตัวอย่าง
AA-Sort

ขอบเลือดออก (ประมาณปี 2010 บางคนอายุเพียงสองสามเดือน):

รูปแบบการเรียงลำดับแบบขนานการเรียงลำดับแบบขนานแบบ
หลายคอร์ GPU การเรียงลำดับแบบขนานแบบ
ไฮบริด CPU / GPU
แบบขนานอัลกอริธึมการเรียงลำดับแบบขนานแบบสุ่มพร้อมการศึกษาเชิงทดลองการ
เรียงลำดับแบบขนานที่ปรับขนาดได้สูงการเรียง
ลำดับองค์ประกอบ N โดยใช้ลำดับตามธรรมชาติ

อัปเดตสำหรับปี 2013: นี่คือขอบที่ตกเลือดเมื่อประมาณเดือนมกราคม 2013 (หมายเหตุ: ลิงก์บางส่วนเป็นเอกสารที่ Citeseer และต้องลงทะเบียนซึ่งไม่เสียค่าใช้จ่าย):

บรรยายมหาวิทยาลัย:
แบ่งพาร์ติชันแบบขนานสำหรับการคัดเลือกและคัดแยก
ขนานเรียงลำดับขั้นตอนวิธีการบรรยาย
ขนานเรียงลำดับขั้นตอนวิธีการบรรยาย 2
ขนานเรียงลำดับขั้นตอนวิธีการบรรยาย 3

แหล่งข้อมูลอื่น ๆ และเอกสาร:
นวนิยายเรียงลำดับขั้นตอนวิธีสำหรับสถาปัตยกรรมแบบหลายคอร์ขึ้นอยู่กับการปรับตัว bitonic เรียง
ขนาน Scalable สูงเรียงลำดับ 2
ผสานขนาน
ขนาน การผสาน
ระบบการเรียงลำดับแบบขนาน2 ระบบสำหรับ
ประสิทธิภาพของออบเจ็กต์การเปรียบเทียบการเรียงลำดับอย่างรวดเร็วและอัลกอริทึมการเรียงลำดับด่วนแบบขนาน
หน่วยความจำที่ใช้ร่วมกันการส่งผ่านข้อความและการผสานแบบไฮบริดสำหรับ SMP แบบสแตนด์อโลนและแบบคลัสเตอร์
อัลกอริทึมคู่ขนานต่างๆ (การเรียงลำดับและคณะ) รวมถึงการนำไปใช้งาน

แหล่งที่มาและเอกสารไฮบริดของ GPU และ CPU / GPU:
วิธี OpenCL ของอัลกอริธึมการเรียงลำดับแบบขนานสำหรับ
การเรียงลำดับข้อมูลสถาปัตยกรรม GPU โดยใช้หน่วยประมวลผลกราฟิก
อัลกอริทึมที่มีประสิทธิภาพสำหรับการเรียงลำดับบน GPU
การออกแบบอัลกอริธึมการเรียงลำดับที่มีประสิทธิภาพสำหรับ GPU แบบหลายคะแนน
การจัดเรียงตัวอย่างที่กำหนดสำหรับ GPU การจัดเรียง
ในสถานที่อย่างรวดเร็วด้วย CUDA ขึ้นอยู่กับการเรียงลำดับ bitonic การเรียงลำดับ
GPU แบบขนานอย่างรวดเร็วโดยใช้อัลกอริธึมไฮบริดอัลกอริธึม
Fast Parallel Sorting Algorithm บน GPUs การ
เรียงลำดับอย่างรวดเร็วบน CPU และ GPUs: กรณีสำหรับแบนด์วิดท์การจัดเรียง
ตัวอย่าง GPU แบบ SIMD ที่ถูกลบเลือน
GPU-ABiSort: การเรียงลำดับแบบขนานที่เหมาะสมที่สุดบนสถาปัตยกรรมสตรีม
GPUTeraSort: สูง การเรียงลำดับโปรเซสเซอร์ร่วมกราฟิกประสิทธิภาพสำหรับการจัดการฐานข้อมูลขนาดใหญ่
ที่มีประสิทธิภาพสูงเมื่อเปรียบเทียบตามขั้นตอนวิธีการเรียงลำดับใน GPUs แบบหลายคอ
ขนานเรียงลำดับภายนอกสำหรับ GPUs CUDA ที่เปิดใช้งานกับโหลดสมดุลและการถ่ายโอนค่าใช้จ่ายต่ำ
เรียงลำดับใน GPUs สำหรับชุดข้อมูลขนาดใหญ่: การเปรียบเทียบอย่างละเอียด


2
เป็นการศึกษาเปรียบเทียบอัลกอริธึมการเรียงลำดับแบบขนานในสถาปัตยกรรมต่างๆในปัจจุบันในปี 2539 มีการเปลี่ยนแปลงมากมายในการคำนวณแบบคู่ขนานตั้งแต่นั้นมา
High Performance Mark

1
ดูเหมือนว่าคุณจะพลาด IMHO ที่ดีที่สุดไปแล้วนั่นคือการใช้งานการเรียงลำดับอย่างมีประสิทธิภาพในสถาปัตยกรรม SIMD แบบมัลติคอร์ จากการวิจัยของ Intel นำเสนอที่ VLDB 2008
alecco

1
นี่คงเป็นคำตอบที่ดีครั้งหนึ่ง ตอนนี้ลิงค์ส่วนใหญ่เสีย
Tim Long

7

ฉันได้ทำงานร่วมกับอัลกอริทึม Parallel Quicksort และอัลกอริทึม PSRS ที่รวม Quicksort เข้าไว้ด้วยกันกับการผสาน

ด้วยอัลกอริทึม Parallel Quicksort ฉันได้แสดงให้เห็นถึงการเร่งความเร็วเชิงเส้นที่ใกล้เคียงกับ 4 คอร์ (ดูอัลคอร์ที่มีไฮเปอร์เธรด) ซึ่งคาดว่าจะได้รับข้อ จำกัด ของอัลกอริทึม Parallel Quicksort ที่บริสุทธิ์อาศัยทรัพยากรสแต็กที่ใช้ร่วมกันซึ่งจะส่งผลให้เกิดความขัดแย้งระหว่างเธรดซึ่งจะช่วยลดประสิทธิภาพที่ได้รับ ข้อดีของอัลกอริทึมนี้คือการจัดเรียง 'ในสถานที่' ซึ่งจะช่วยลดจำนวนหน่วยความจำที่จำเป็น คุณอาจต้องการพิจารณาสิ่งนี้เมื่อจัดเรียงองค์ประกอบมากกว่า 100 ล้านรายการตามที่คุณระบุไว้

ฉันเห็นว่าคุณกำลังต้องการจัดเรียงระบบที่มี 8-32 คอร์ อัลกอริทึม PSRS หลีกเลี่ยงการโต้แย้งที่ทรัพยากรที่ใช้ร่วมกันทำให้สามารถเร่งความเร็วได้ในจำนวนกระบวนการที่สูงขึ้น ฉันได้สาธิตอัลกอริทึมที่มีคอร์มากถึง 4 คอร์ตามข้างต้น แต่ผลการทดลองของคนอื่น ๆ รายงานการเร่งความเร็วเชิงเส้นที่ใกล้เคียงกับจำนวนคอร์ที่มากกว่า 32 และมากกว่า ข้อเสียของอัลกอริทึม PSRS คือไม่ได้อยู่ในสถานที่และจะต้องใช้หน่วยความจำมากขึ้น

หากคุณสนใจคุณสามารถใช้หรืออ่านโค้ด Java ของฉันสำหรับแต่ละอัลกอริทึมเหล่านี้ คุณสามารถค้นหาได้ใน GitHub: https://github.com/broadbear/sort โค้ดนี้มีไว้เพื่อแทนที่ Java Collections.sort () แบบดรอปอิน หากคุณกำลังมองหาความสามารถในการจัดเรียงแบบขนานใน JVM ตามที่คุณระบุไว้ข้างต้นโค้ดใน repo ของฉันอาจช่วยคุณได้ API เป็นแบบทั่วไปสำหรับองค์ประกอบที่นำไปใช้เทียบเคียงหรือใช้ตัวเปรียบเทียบของคุณเอง

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


ฉันมีโปรเซสเซอร์ 8 คอร์ :) ตอนนี้ฉันได้ทดสอบการเรียงลำดับองค์ประกอบมากกว่า 40M แล้ว ฉันไม่เห็นการเร่งความเร็วเชิงเส้น แต่ฉันเห็นประสิทธิภาพที่เพิ่มขึ้นอย่างมากจากอัลกอริธึมการเรียงลำดับ Java 8 Collections มาตรฐานซึ่งคาดว่าจะเป็น Timsort แบบมัลติเธรด การใช้ PSRS ของฉันเรียงลำดับองค์ประกอบ 40M โดยเฉลี่ย 4985 มิลลิวินาทีเทียบกับ 19759 มิลลิวินาทีสำหรับอัลกอริทึมการเรียงลำดับ JDK เริ่มต้น
broadbear

4

ลองดูที่กระดาษนี้: ปรับขนาดขนานเรียงลำดับขั้นตอนวิธีการใช้แยกแน่นอน มันเกี่ยวข้องกับคอร์มากกว่า 32 คอร์ อย่างไรก็ตามมันอธิบายรายละเอียดเกี่ยวกับอัลกอริทึมซึ่งมีความซับซ้อนของเวลาทำงานเป็น O (n / p * log (n) + p * log (n) ** 2) และสามารถใช้ได้กับตัวเปรียบเทียบโดยพลการ


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