अपने टकराव का पता लगाने वाले वर्ग के प्रदर्शन को बेहतर बनाने की कोशिश करते हुए, मैंने पाया कि ~ 80% समय जीपीयू में बिताया है, इस पर खर्च किया है कि क्या / और स्थितियां सिर्फ बाल्टी के लिए सीमा का पता लगाने की कोशिश कर रही हैं, जिसके माध्यम से लूप होना चाहिए।
ज्यादा ठीक:
प्रत्येक थ्रेड को एक आईडी मिलती है, उस आईडी से वह मेमोरी से अपने त्रिकोण (प्रत्येक में 3 पूर्णांक) लाती है और उन 3 से वह अपने वर्टिकल (3 फ्लोट प्रत्येक) को लाती है।
फिर यह लंबों को पूर्णांक ग्रिड बिंदुओं (वर्तमान में 8x8x8) में बदल देता है और उन्हें इस ग्रिड पर त्रिभुज सीमा में बदल देता है
3 बिंदुओं को सीमा में बदलने के लिए, यह प्रत्येक बिंदु के बीच प्रत्येक आयाम का न्यूनतम / अधिकतम पाता है
चूंकि मैं जिस प्रोग्रामिंग लैंग्वेज का इस्तेमाल कर रहा हूं, वह मिनमैक्स इंट्रेंसिक याद आ रही है, मैंने खुद को बनाया है, इस तरह दिखता है:
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 निर्देशों) की तुलना में अधिक समय तक खाने का अंत करता है।
वास्तव में, मैंने पाया कि सीपीयू (एकल थ्रेडेड, कोई वेक्टराइजेशन) पर आवश्यक बाल्टियों की पूर्व-गणना करना, उन्हें एक gpu दृश्य में बाल्टी परिभाषा के साथ स्टैक करना और gpu करना ~ 4 अतिरिक्त रीड प्रति थ्रेड प्रयास करने से 6 गुना अधिक तेज था मौके पर सीमा का पता लगाने के लिए। (ध्यान दें कि मैं हर निष्पादन से पहले पुनर्गठित हो जाता हूं क्योंकि मैं गतिशील जाल से निपट रहा हूं)
तो एक gpu पर तुलनात्मक रूप से इतनी धीमी गति क्यों है?