ฉันแก้ไขปัญหานี้โดยใช้คำตอบบางข้อเป็นจุดเริ่มต้น สิ่งที่เป็นประโยชน์มากที่สุดที่ต้องจำไว้ก็คือ boids เป็นแบบจำลอง n-body แบบง่าย ๆ : boid แต่ละตัวเป็นอนุภาคที่ออกแรงแรงกับเพื่อนบ้าน
ฉันพบว่ากระดาษ Linde อ่านยาก ฉันขอแนะนำให้ดูที่"ขั้นตอนวิธีเร็วแบบขนานสำหรับพลวัตโมเลกุลระยะสั้นของ SJ Plimptonซึ่ง Linde อ้างถึง กระดาษของ Plimpton นั้นอ่านง่ายและมีรายละเอียดมากขึ้นด้วยตัวเลขที่ดีกว่า:
โดยสรุปวิธีการสลายตัวของอะตอมจะกำหนดเซตย่อยของอะตอมอย่างถาวรให้กับแต่ละโปรเซสเซอร์วิธีการบังคับใช้การสลายตัวจะกำหนดชุดย่อยของการคำนวณแรงแบบคู่ตามความต้องการให้กับแต่ละ proc และวิธีการสลายตัวเชิงพื้นที่กำหนดขอบเขตย่อยของ .
ฉันแนะนำให้คุณลอง AD มันง่ายที่สุดที่จะเข้าใจและนำไปใช้ FD นั้นคล้ายกันมาก นี่คือการจำลองแบบ n-body ของ nVidia กับ CUDA โดยใช้ FD ซึ่งควรให้คุณทราบคร่าวๆว่าการเรียงและลดขนาดสามารถช่วยให้ประสิทธิภาพเหนือกว่าอย่างเห็นได้ชัด
โดยทั่วไปแล้วการใช้งาน SD เป็นเทคนิคการปรับให้เหมาะสมที่สุดและต้องการการออกแบบท่าเต้นระดับหนึ่งเพื่อนำไปใช้ มันเกือบจะเร็วขึ้นและขยายใหญ่ขึ้น
นี่คือเนื่องจาก AD / FD ต้องสร้าง "รายชื่อเพื่อนบ้าน" สำหรับแต่ละ boid หากทุกคนต้องการรู้ตำแหน่งของเพื่อนบ้านการสื่อสารระหว่างกันคือ O ( n ²) คุณสามารถใช้รายการ Verlet Neighbour เพื่อลดขนาดของพื้นที่แต่ละเช็ค boid ซึ่งช่วยให้คุณสามารถสร้างรายการทุกสองสามนาทีแทนทุกขั้นตอน แต่ยังคงเป็น O ( n ²) ใน SD แต่ละเซลล์เก็บรายการเพื่อนบ้านใน AD / FD ทุก boid มีรายการเพื่อนบ้าน ดังนั้นแทนที่จะคุยกันทุกคนคุยกันทุกเซลล์สื่อสารกัน การลดลงของการสื่อสารนั้นเป็นที่มาของการเพิ่มความเร็ว
แต่น่าเสียดายที่ปัญหาการก่อวินาศกรรม SD เล็กน้อย การมีตัวประมวลผลแต่ละตัวติดตามเซลล์มีประโยชน์มากที่สุดเมื่อ boids มีการกระจายอย่างเท่าเทียมกันทั่วทั้งภูมิภาค แต่คุณต้องการให้กลุ่มรวมตัวกัน! หากฝูงของคุณทำงานได้อย่างถูกต้องตัวประมวลผลส่วนใหญ่ของคุณจะถูกกำจัดออกไปแลกเปลี่ยนรายการเปล่ากับแต่ละอื่น ๆ และเซลล์กลุ่มเล็ก ๆ จะจบลงด้วยการคำนวณเช่นเดียวกันกับ AD หรือ FD
ในการจัดการกับสิ่งนี้คุณสามารถปรับขนาดของเซลล์ (ซึ่งเป็นค่าคงที่) ทางคณิตศาสตร์เพื่อลดจำนวนเซลล์ว่างในเวลาใดก็ตามหรือใช้อัลกอริทึม Barnes-Hut สำหรับต้นไม้รูปสี่เหลี่ยม อัลกอริทึม BH มีประสิทธิภาพอย่างเหลือเชื่อ ขัดมันเป็นเรื่องยากมากที่จะใช้กับสถาปัตยกรรมแบบขนาน นี่เป็นเพราะต้นไม้ BH ไม่สม่ำเสมอดังนั้นเธรดแบบขนานจะเคลื่อนที่ด้วยความเร็วที่แตกต่างกันอย่างมากทำให้เกิดความแตกต่างของเธรด Salmon และ Dubinski ได้นำเสนออัลกอริทึมแบบแบ่งครึ่งมุมฉากเพื่อกระจาย quadtrees เท่า ๆ กันในโปรเซสเซอร์ซึ่งจะต้องมีการปรับปรุงซ้ำสำหรับสถาปัตยกรรมขนานส่วนใหญ่
อย่างที่คุณเห็นเราอยู่ในขอบเขตของการเพิ่มประสิทธิภาพและเวทมนตร์ดำอย่างชัดเจน ณ จุดนี้ ลองอ่านกระดาษของ Plimpton อีกครั้งและดูว่าเหมาะสมหรือไม่