มีสองระดับที่คุณสามารถวิเคราะห์การเร่งความเร็วแบบขนานด้วยการยกกำลังเมทริกซ์: ระดับ "อัลกอริธึมมาโคร" ที่ตัดสินใจว่าเมทริกซ์จะคูณและระดับ "อัลกอริทึมไมโคร" ที่คุณสามารถเร่งการคูณด้วยการขนาน
สำหรับหลังวิกิพีเดียแสดงให้เห็นว่าสำหรับการคูณโดยเมทริกซ์เราสามารถบรรลุความซับซ้อนของในทางทฤษฎีที่มีจำนวนมากมายของตัวประมวลผลหรือมีขั้นตอนวิธีการแบบคู่ขนานที่สมจริงมากขึ้น .nnO(log2(n))O(n)
(หมายเหตุ: หน้าวิกิพีเดียมีไว้สำหรับการคำนวณเมทริกซ์ทั่วไปฉันไม่แน่ใจว่าจะสามารถทำให้ขนานได้มากขึ้นโดยใช้ข้อมูลที่เรากำลังสองเมทริกซ์)
สำหรับคำถามก่อนหน้านี้จะกลายเป็นจำนวนการคูณเมทริกซ์ที่จำเป็นในการคำนวณสำหรับเมทริกซ์บาง ? (ฉันบอกว่ารอบเพราะการคูณทั้งหมดในรอบที่กำหนดอาจทำแบบขนาน)AmA
อัลกอริทึมที่จะชนะตามลำดับตามที่ระบุไว้ในคำตอบอื่น ๆ คือการยกกำลังโดย squaring สิ่งนี้ช่วยให้คุณสามารถคำนวณในการคูณAkO(log(k))
คำถามคือเราจะเอาชนะสิ่งนี้ด้วยความเท่าเทียมได้ไหม? ฉันอ้างว่าคำตอบคือไม่
เหตุผลง่ายๆก็คือการยกกำลังด้วยการยกกำลังนั้นเป็นอัลกอริธึมการเขียนโปรแกรมแบบไดนามิก มันช่วยให้คุณสามารถข้ามงานทั้งหมดได้โดยการนำ subresults กลับมาใช้ใหม่ แต่สิ่งนี้จะสร้างการพึ่งพาข้อมูลที่ไม่สามารถทำงานคู่ขนานกันได้ ถ้าเรากำจัดการพึ่งพาข้อมูล แต่เรายังเพิ่มปริมาณงานที่เราต้องทำอย่างมากมาย
เพื่ออธิบายสิ่งนี้ได้ดีขึ้นลองดูว่าคุณจะคูณการคูณเมทริกซ์อย่างไรหากเราไม่ได้ยกกำลัง สมมติว่าคุณกำลังมองหาที่จะคู่ขนานคูณแยกต่างหากตารางการฝึกอบรม:k
A1A2A3A4A5...Ak
วิธีธรรมชาติในการทำให้ขนานนี้ชัดเจนคุณควรใช้การเชื่อมโยงที่ไม่เหมาะสมเพื่อทำการคูณในรอบแรก:k2
(A1A2)(A3A4)(A5A6)...(Ak−1Ak)
จากนี้เราสามารถคูณเมทริกซ์ของเราอย่างชัดเจนในการคูณเพราะเราลดขนาดปัญหาลงครึ่งหนึ่งในแต่ละรอบ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))