มีอัลกอริธึมการยกกำลังแบบขนานที่มีประสิทธิภาพมากกว่าการคูณตามลำดับหรือไม่


11

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


1
คุณลองทำอะไร คุณติดอยู่ที่ไหน คุณทำวิจัยอะไร นอกจากชื่อคำถามอยู่ที่ไหน สำหรับรุ่นการตัดสินใจของปัญหาของคุณ (จากชื่อเรื่อง) คำตอบคือ "ใช่" แต่คุณรู้แล้วใช่ไหม
Evil

2
@TomR คำถามนี้น่าสนใจสำหรับคุณ
adrianN

1
อาจจะเป็นเช่นนี้ ? หรือคุณกำลังมองหาอย่างอื่นอยู่ใช่ไหม แอปพลิเคชันของคุณมีขนาดและอำนาจอะไรบ้าง?
Evil

1
คุณสามารถคำนวณกำลังที่ n ด้วยการคูณที่น้อยกว่า n-1 เมื่อ n ≥ 4 สำหรับเมทริกซ์ขนาดใหญ่มันจะคุ้มค่าที่จะหาจำนวนการคูณที่เป็นไปได้น้อยที่สุด (ตัวอย่างเช่นมีวิธีง่าย ๆ ในการคำนวณ n ^ 15 กับ 6 การคูณ แต่สามารถทำได้ด้วย 5) จากนั้นคุณสามารถนำหลักการเดียวกันนี้ไปใช้เพื่อหาจำนวนการคูณตามลำดับที่น้อยที่สุดซึ่งจะยากขึ้น
gnasher729

1
คุณควรพิจารณาถึงจำนวนของความเท่าเทียมที่มีให้คุณด้วย "Parallelism" เกี่ยวกับการใช้ประโยชน์จากทรัพยากรที่ไม่ได้ใช้ หากการดำเนินการตามการคูณเมทริกซ์สามารถใช้ทรัพยากรทั้งหมดที่มีอยู่ได้อย่างมีประสิทธิภาพแล้วไม่มีอะไรที่จะใช้ประโยชน์จากการคำนวณพลังของเมทริกซ์
gnasher729

คำตอบ:


5

หากคุณมีโปรเซสเซอร์หลายตัวที่สามารถทำงานแบบขนานคุณสามารถคำนวณพลังงานใด ๆ ได้สูงสุดถึงพลังงาน (2 ^ k) ในขั้นตอน k ตัวอย่างเช่น: ในการคำนวณคุณคำนวณ:M15

ด่าน 1: คำนวณM2

ขั้นตอนที่ 2: คำนวณและM3=M2MM4=M2M2

ขั้นตอนที่ 3: คำนวณและM7=M4M3M8=M4M4

ขั้นตอนที่ 4: คำนวณM15=M8M7

นี่คือการคูณมากกว่าการคำนวณในการคูณสามครั้งและเพิ่มเป็นกำลังสามในอีกสองคูณ แต่ควรเร็วกว่านี้ถ้าคุณมีโปรเซสเซอร์สองตัว สำหรับพลังสูงตามอำเภอใจคุณจะต้องมีโปรเซสเซอร์มากขึ้นM5M5

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

และหลังการโพสต์นี้มันจะกลายเป็นที่ชัดเจนว่าคุณสามารถใช้โปรเซสเซอร์หลายตัวได้อย่างง่ายดายมาก: คุณเริ่มต้นโดยการคำนวณแถวแรกของM เมื่อคุณมีแถวนั้นคุณจะมีข้อมูลทั้งหมดที่คุณต้องการในการคำนวณแถวแรกของดังนั้นคุณจึงคำนวณแถวที่สองของและแถวแรกของในแบบคู่ขนาน จากนั้นคุณสามารถคำนวณแถวที่สามของแถวที่สองของและแถวแรกของในแบบขนานและต่อ ๆ ไปM2=MMM3=M2MM2M3M2M3M4

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

วิธีการรวม: ใช้โปรเซสเซอร์สี่ตัวคุณสามารถคำนวณ AB, ABC, ABCD และ ABCDE ได้เกือบจะขนานกันโดยการคำนวณแต่ละผลิตภัณฑ์ทีละแถว สิ่งนี้ช่วยให้คำนวณทั้งสี่ของเป็นโดยใช้ตัวประมวลผลสี่ตัวในเวลาเดียวกับผลิตภัณฑ์เดียวที่มีตัวประมวลผลเดียวM2M5

จากผลลัพธ์ทั้งสี่นี้และ M ดั้งเดิมคุณสามารถคำนวณเมทริกซ์สี่ตัวจากถึงในเวลาเดียวกันอีกครั้งหากเมทริกซ์นั้นมีอำนาจมากที่สุดห้าแห่งแยกจากกัน ดังนั้นพลังงานแต่ละตัวสูงถึงสามารถคำนวณได้ในเวลาประมาณสองเท่าของผลิตภัณฑ์เมทริกซ์โปรเซสเซอร์เดียวM6M25M25

ด้วยการคำนวณเมทริกซ์เหล่านี้เมทริกซ์ทั้งหมดสูงถึงและบางอย่างมากถึงสามารถคำนวณได้ในเวลาสามเท่าของผลิตภัณฑ์เมทริกซ์เดียวหากมีโปรเซสเซอร์สี่ตัว ที่มีโปรเซสเซอร์ k นี้ควรไปถึงอย่างน้อยพลัง 2 M 125 k ( k + 1 ) 2M108M125k(k+1)2


4

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

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

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

สำหรับคำถามก่อนหน้านี้จะกลายเป็นจำนวนการคูณเมทริกซ์ที่จำเป็นในการคำนวณสำหรับเมทริกซ์บาง ? (ฉันบอกว่ารอบเพราะการคูณทั้งหมดในรอบที่กำหนดอาจทำแบบขนาน)AmA

อัลกอริทึมที่จะชนะตามลำดับตามที่ระบุไว้ในคำตอบอื่น ๆ คือการยกกำลังโดย squaring สิ่งนี้ช่วยให้คุณสามารถคำนวณในการคูณAkO(log(k))

คำถามคือเราจะเอาชนะสิ่งนี้ด้วยความเท่าเทียมได้ไหม? ฉันอ้างว่าคำตอบคือไม่

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

เพื่ออธิบายสิ่งนี้ได้ดีขึ้นลองดูว่าคุณจะคูณการคูณเมทริกซ์อย่างไรหากเราไม่ได้ยกกำลัง สมมติว่าคุณกำลังมองหาที่จะคู่ขนานคูณแยกต่างหากตารางการฝึกอบรม:k

A1A2A3A4A5...Ak

วิธีธรรมชาติในการทำให้ขนานนี้ชัดเจนคุณควรใช้การเชื่อมโยงที่ไม่เหมาะสมเพื่อทำการคูณในรอบแรก:k2

(A1A2)(A3A4)(A5A6)...(Ak1Ak)

จากนี้เราสามารถคูณเมทริกซ์ของเราอย่างชัดเจนในการคูณเพราะเราลดขนาดปัญหาลงครึ่งหนึ่งในแต่ละรอบkO(log(k))

อย่างไรก็ตามหากเราต้องทำการยกกำลังด้วยวิธีนี้มันจะเป็นดังนี้:

(AA)(AA)(AA)...(AA)

กล่าวอีกนัยหนึ่งความเท่าเทียมกันทั้งหมดของเราดึงดูดเราคือการคำนวณผลิตภัณฑ์เมทริกซ์เดียวกันเพื่อคำนวณ ! ดังนั้นถ้าเราใช้อัลกอริธึมที่บันทึกเช่นการยกกำลังโดยการยกกำลังเราสามารถทำสิ่งเดียวกันกับอัลกอริทึมแบบขนานในการคูณแต่ละรอบA2

หากเราต้องการคำนวณสำหรับโดย matrixความซับซ้อนแบบขนานคือสำหรับอัลกอริทึมแบบขนานในแง่ดีหรือสำหรับภาพจริง n n A O ( บันทึก2 ( n ) บันทึก( k ) ) O ( n บันทึก( k ) )AknnAO(log2(n)log(k))O(nlog(k))


3

ถ้าโดยลำดับคุณหมายถึงคูณครั้งการแก้ปัญหาของการคำนวณครั้งแรกเพียงอำนาจที่เกี่ยวข้องของ (aka ยกกำลังโดย squaring ) เห็นได้ชัดที่ดีกว่าสำหรับขนาดใหญ่มmlogm2m

การปรับปรุงที่อาจเฉพาะเจาะจงกับการฝึกอบรมบางประเภท ตัวอย่างเช่นถ้าเมทริกซ์ของคุณเป็นเส้นทแยงมุม ดังนั้นการคำนวณพลังงาน th คือใน . m O ( 1 ) m

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