ในขณะที่พยายามปรับปรุงประสิทธิภาพของคลาสการตรวจหาการชนกันของฉันฉันพบว่า ~ 80% ของเวลาที่ใช้ไปกับ gpu มันใช้กับเงื่อนไขอื่น ๆ ที่พยายามหาขอบเขตของถังที่มันควรวนผ่าน
อย่างแม่นยำมากขึ้น:
แต่ละเธรดจะได้รับ ID โดย ID นั้นจะดึงสามเหลี่ยมจากหน่วยความจำ (3 จำนวนเต็มแต่ละรายการ) และโดย 3 นั้นจะดึงจุดยอดของมัน (3 ลอยแต่ละ)
จากนั้นจะแปลงจุดยอดเป็นจุดกริดจำนวนเต็ม (ปัจจุบัน 8x8x8) และแปลงให้เป็นขอบเขตสามเหลี่ยมบนกริดนั้น
ในการแปลง 3 คะแนนเป็นขอบเขตจะพบ min / max ของแต่ละมิติในแต่ละจุด
เนื่องจากภาษาการเขียนโปรแกรมที่ฉันใช้นั้นขาด minmax ที่แท้จริงฉันจึงสร้างมันขึ้นมาตัวเองมีลักษณะดังนี้:
procedure MinMax(a, b, c):
local min, max
if a > b:
max = a
min = b
else:
max = b
min = a
if c > max:
max = c
else:
if c < min:
min = c
return (min, max)
ดังนั้นโดยเฉลี่ยแล้วมันควรจะเป็น 2.5 * 3 * 3 = 22.5 การเปรียบเทียบซึ่งจบลงด้วยการกินเวลามากกว่าการทดสอบจุดตัดสามเหลี่ยม - จริง (ประมาณ 100 * 11-50 คำแนะนำ)
ในความเป็นจริงฉันพบว่าการคำนวณล่วงหน้าถังที่จำเป็นใน cpu (เธรดเดียวไม่มี vectorization) ซ้อนในมุมมอง gpu พร้อมกับคำจำกัดความถังและทำให้ gpu ทำ ~ 4 อ่านพิเศษต่อเธรด 6 ครั้งเร็วกว่าพยายาม เพื่อหาขอบเขตในจุดที่ต้องการ (โปรดทราบว่าพวกเขาได้รับการคำนวณอีกครั้งก่อนการดำเนินการทุกครั้งเนื่องจากฉันจัดการกับตาข่ายแบบไดนามิก)
เหตุใดการเปรียบเทียบจึงช้าลงอย่างน่ากลัวสำหรับ GPU