ในฐานะที่เป็นส่วนขยายไปยังคำตอบ moyner ของที่บนชิปsqrt
มักจะเป็นrsqrt
เช่นรากซึ่งกันและกันที่คำนวณ{a} ดังนั้นถ้าในรหัสของคุณคุณจะใช้เพียง (ถ้าคุณกำลังทำการเปลี่ยนแปลงโมเลกุลคุณอยู่) คุณสามารถคำนวณได้โดยตรงและช่วยตัวคุณเองในการหาร เหตุผลที่คำนวณได้แทนที่จะเป็นเพราะการวนซ้ำของนิวตันไม่มีการแบ่งส่วนเพิ่มและการคูณเท่านั้นa → 1 / a--√1 / rr = rsqrt(r2)
rsqrt
sqrt
ในฐานะที่เป็นบันทึกย่อด้านหน่วยงานยังคำนวณซ้ำ ๆ และเกือบจะช้าเท่ากับrsqrt
ในฮาร์ดแวร์ หากคุณกำลังมองหาประสิทธิภาพคุณควรพยายามลบแผนกที่ไม่จำเป็นออกไป
บางสถาปัตยกรรมที่ทันสมัยมากขึ้นเช่นของ IBM Power สถาปัตยกรรมไม่ให้rsqrt
ต่อ se แต่การประมาณการที่ถูกต้องไปไม่กี่บิตเช่นFRSQRTE เมื่อผู้ใช้เรียกrsqrt
สิ่งนี้จะสร้างค่าประมาณและจากนั้นหนึ่งหรือสองครั้ง (เท่าที่ต้องการ) การทำซ้ำของอัลกอริทึมของนิวตันหรือโกลด์ชมิดท์โดยใช้การคูณและการเพิ่มปกติ ข้อดีของวิธีนี้คือขั้นตอนการวนซ้ำอาจถูกไพพ์ไลน์และ interleaved กับคำแนะนำอื่น ๆ โดยไม่ปิดกั้น FPU (สำหรับภาพรวมที่ดีมากของแนวคิดนี้แม้ว่าจะเป็นสถาปัตยกรรมที่เก่ากว่าดูวิทยานิพนธ์ปริญญาเอกของ Rolf Strebel )
สำหรับการโต้ตอบที่อาจเกิดขึ้นการsqrt
ดำเนินการสามารถหลีกเลี่ยงได้ทั้งหมดโดยใช้พหุนามพหุนามของฟังก์ชันที่มีศักยภาพ แต่งานของฉัน (ดำเนินการในmdcore
) ในพื้นที่นี้แสดงให้เห็นว่าอย่างน้อยในสถาปัตยกรรมประเภท x86 sqrt
คำสั่งนั้นเร็วพอ
ปรับปรุง
เนื่องจากคำตอบนี้ดูเหมือนจะได้รับความสนใจค่อนข้างมากฉันจึงอยากจะตอบคำถามตอนที่สองของคุณเช่นมันคุ้มค่าหรือไม่ที่จะพยายามปรับปรุง / กำจัดการดำเนินงานขั้นพื้นฐานเช่นsqrt
?
ในบริบทของการจำลองโมเลกุลพลวัตหรือการจำลองด้วยอนุภาคที่มีการ จำกัด การตัดออกมีจำนวนมากที่จะได้รับจากอัลกอริทึมที่ดีกว่าสำหรับการค้นหาเพื่อนบ้าน หากคุณกำลังใช้รายการเซลล์หรือสิ่งที่คล้ายกันเพื่อค้นหาเพื่อนบ้านหรือสร้างรายการ Verletคุณจะคำนวณระยะทางตามเข็มนาฬิกาเป็นจำนวนมาก ในกรณีที่ไร้เดียงสามีเพียง 16% ของคู่อนุภาคที่ตรวจสอบจริง ๆ เท่านั้นจะอยู่ในระยะทางตัดของกันและกัน แม้ว่าจะไม่มีการคำนวณการโต้ตอบสำหรับคู่เหล่านี้ แต่การเข้าถึงข้อมูลอนุภาคและการคำนวณระยะทางตามเข็มนาฬิกาคู่เก๊นั้นมีค่าใช้จ่ายสูง
การทำงานของตัวเองในพื้นที่นี้ ( ที่นี่ , ที่นี่และที่นี่ ) เช่นเดียวกับของคนอื่น (เช่นที่นี่ ) แสดงให้เห็นว่าการคำนวณปลอมเหล่านี้สามารถหลีกเลี่ยงได้ อัลกอริธึมการค้นหาเพื่อนบ้านเหล่านี้แม้กระทั่งทำรายการ Verlet ที่ไม่ได้ผล
จุดที่ฉันต้องการเน้นคือแม้ว่าอาจจะมีการปรับปรุงบางอย่างเพื่อให้ได้มาซึ่งการรู้ / การใช้ประโยชน์จากสถาปัตยกรรมฮาร์ดแวร์พื้นฐานที่ดีกว่า
rsqrtps
และ AVXvrsqrtps
เป็นค่าประมาณพวกเขาได้รับ 11 ถึง 12 บิตแรกที่ถูกต้องและคุณควรปรับแต่งด้วยการวนซ้ำแบบนิวตันหรือสองครั้งหากคุณต้องการความแม่นยำมากขึ้น คำแนะนำเหล่านี้คือ 5/1 และ 7/1 (latency / inverse throughput) คำแนะนำบน Sandy Bridge (ดู Intel docs หรือตารางคำสั่งของ Agner Fogซึ่งเปรียบได้กับการคูณในทางตรงกันข้ามความแม่นยำเต็ม(v)sqrtps
(หรือความแม่นยำสองเท่า(v)sqrtpd
) ใช้เวลา 10-43 / 10-43 (ดูตารางการเรียนการสอนเพื่อดูรายละเอียด)