ผลกระทบของลูปที่มีความยาวผันแปรได้ใน GPU shaders


9

เป็นที่นิยมในการแสดงเนื้อหาขั้นตอนภายใน GPU เช่นใน demoscene (วาดรูปสี่เหลี่ยมจัตุรัสเดียวเพื่อเติมหน้าจอและปล่อยให้ GPU คำนวณพิกเซล)

เรย์เดินขบวนเป็นที่นิยม:

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งหมายความว่า GPU กำลังประมวลผลวนซ้ำที่ไม่รู้จักจำนวนหนึ่งต่อพิกเซล (แม้ว่าคุณจะมีขอบด้านบนเหมือนmaxIterations)

การวนลูปที่มีความยาวผันแปรมีผลต่อประสิทธิภาพของ shader อย่างไร

ลองนึกภาพ psuedocode ray-marching ที่เรียบง่าย:

t = 0.f;
while(t < maxDist) {
    p = rayStart + rayDir * t;
    d = DistanceFunc(p);
    t += d;
    if(d < epsilon) {
       ... emit p
       return;
    }
}

ตระกูล GPU กระแสหลักต่างๆ (Nvidia, ATI, PowerVR, Mali, Intel, ฯลฯ ) ได้รับผลกระทบอย่างไร Vertex shaders แต่โดยเฉพาะอย่างยิ่ง shader ส่วน?

จะเพิ่มประสิทธิภาพได้อย่างไร


น่าเสียดายที่คำถามนี้ยากเกินไปที่จะตอบอย่างถูกต้องที่นี่ แม้ว่าหนึ่งคำตอบจะได้รับคะแนนจากแหล่งข้อมูลที่น่าอ่าน (เกี่ยวข้องกับการแตกแขนงแบบไดนามิก) +1 สำหรับ "หัวข้อ" ..
teodron

1
@teodron อย่าพ่ายแพ้! ฉันหวังว่าบางคนจะบอกว่าใน NVidia การ์ดหน้าจอพิกเซลในบล็อก 8x8 นั้นจะย้ำให้ลึกที่สุดเท่าที่ความต้องการที่ลึกที่สุดและบล็อก 8x8 พิกเซลนั้นสามารถทำได้ตามลำดับหรืออะไรทำนองนั้น นั่นไม่ใช่ความจริงนั่นเป็นเพียงภูมิปัญญาที่ฉันหวังว่าผู้คนจะสามารถแบ่งปันได้ ลิงก์ใน Larrabee อืมค่อนข้างอ้อม
จะ

ดูเหมือนว่าเขาจะไม่พูดถึงลาร์ราบี แต่ชายสแตนฟอร์ดพูดแบบเดียวกันสองปีหลังจากนั้นในปี 2010 ( คุณสามารถดูได้ที่นี่ ) จากตัวเลขของเขาเมื่อพิจารณาจากการวนรอบสักครู่ฉันไม่เข้าใจว่าพิกเซลที่ "จบ" การคำนวณของพวกเขาในไม่ช้านั้นจะใช้สำหรับการแสดงใด ๆ ใน CUDA เธรดจะรอที่สิ่งกีดขวาง ในการเปรียบเทียบจะเกิดอะไรขึ้นกับเธรด shader
Teodron

@teodron ใช่ฉันเข้าใจ CUDA แล้วและนำไปใช้กับ GPUs; ฉันแน่ใจว่าพวกเขาอยู่ในขั้นบันได แต่ฉันต้องการให้ใครบางคนมีความรู้ที่จะพูดสอด; อย่างไรก็ตามนี่คือบางสิ่งที่เกี่ยวข้องกับwilliamedwardscoder.tumblr.com/post/26628848007/rod-marching
Will

คำตอบ:


8

มีการพูดคุยกันเป็นอย่างดีที่ GDC 2012 ในสนาม GPU ระยะทาง ray-marching (และหัวข้ออื่น ๆ ): http://directtovideo.wordpress.com/2012/03/15/get-my-slides-from-gdc2012/

เท่าที่ประสิทธิภาพดำเนินไปการ์ดกราฟิก (DX11 คลาส) รุ่นล่าสุดจะใช้ตัวแปลงภาพบนหน่วย SIMD ที่ใช้ "เธรด" 32 (NVIDIA) หรือ 64 (AMD) ในการล็อก กลุ่มเหล่านี้เป็นที่รู้จักกันในชื่อ warps หรือ wavefronts สำหรับเฉดสีพิกเซลแต่ละเธรดเท่ากับหนึ่งพิกเซลดังนั้นฉันจึงคาดหวังว่าหน่วย SIMD กำลังประมวลผลบางอย่างเช่นบล็อก 8x4 (NVIDIA) หรือ 8x8 (AMD) ของพิกเซลด้วยกัน การควบคุมการแยกและการไหลนั้นทำแบบต่อคลื่นดังนั้นเธรดทั้งหมดใน wavefront ต้องวนซ้ำหลายเท่าของแต่ละพิกเซลที่ลึกที่สุดภายใน wavefront นั้น มาสก์เลนเลน SIMD จะปิดการใช้งานสำหรับพิกเซลที่เสร็จสิ้นไปแล้ว แต่ก็ยังต้องเงียบไปพร้อมกับการควบคุมการไหลของคลื่นโดยรวม แน่นอนว่านี่หมายความว่าระบบมีประสิทธิภาพมากขึ้นเมื่อมีการแตกแขนงที่สอดคล้องกัน

จากประสบการณ์ของฉันค่าใช้จ่ายของสาขายังคงค่อนข้างสูงแม้ว่าเธรดทั้งหมดในสาขาของคลื่นจะเหมือนกัน ฉันเคยเห็นประสิทธิภาพเพิ่มขึ้นในบางกรณีโดยการคลี่วงเพื่อชดเชยค่าใช้จ่ายของสาขา อย่างไรก็ตามขึ้นอยู่กับจำนวนงานที่คุณทำในการวนซ้ำแต่ละรอบ หากตัวลูปมี "สิ่ง" เพียงพออยู่ในนั้นการปลดจะไม่ชนะ



0

ในส่วนที่เกี่ยวกับการแตกแขนงแบบไดนามิกหมายเหตุเพิ่มเติมอีกหนึ่งรายการ (อาจชัดเจน แต่ก็ยังมีค่าที่ควรทราบสำหรับบางคน): มันอาจส่งผลกระทบอย่างรุนแรงต่อประสิทธิภาพการทำงานของลูปที่ไม่ได้ควบคุม (คุณเห็นได้ชัดว่า .


-4

int s = 0;

ตอนนี้สำหรับ (int k = 1; k <= n; k ++) {s + = k;} เป็นเหมือน s = n * (n + 1) / 2

ดังนั้นจึงไม่เป็นความจริงโดยทั่วไป: D


1
คุณอาจได้รับการลงคะแนนมากเพราะไม่มีใครแน่ใจว่าคุณกำลังพยายามสื่ออะไรที่นี่หรือสิ่งที่เกี่ยวข้องกับคำถาม
doppelgreener
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.