แบนด์วิดธ์คืออะไรและทำงานอย่างไร


18

เอกสาร OpenGLระบุ returns the sum of the absolute value of derivatives in x and yfwidth

นี่หมายถึงอะไรในศัพท์ทางคณิตศาสตร์ที่น้อยกว่าและมีวิธีในการมองเห็นภาพหรือไม่?

จากความเข้าใจในฟังก์ชั่นของฉันฉันfwidth(p)สามารถเข้าถึงค่าเป็นpพิกเซลใกล้เคียง สิ่งนี้ทำงานกับ GPU โดยไม่ส่งผลกระทบต่อประสิทธิภาพอย่างมากและทำงานได้อย่างน่าเชื่อถือและสม่ำเสมอในทุกพิกเซล

คำตอบ:


18

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

GPU ทุกตัวในประวัติศาสตร์เมื่อเร็ว ๆ นี้บรรจุพิกเซลสี่สี่ตัวไว้ด้วยกันและวางไว้ในรูปวาร์ป / คลื่นเดียวกันซึ่งหมายความว่าพวกมันทำงานอยู่ติดกันบน GPU ดังนั้นการเข้าถึงค่าจากพวกมันจึงถูกมาก เนื่องจาก warps / wavefronts ทำงานใน lockstep พิกเซลอื่น ๆ ก็จะอยู่ในตำแหน่งเดียวกันใน shader เช่นเดียวกับคุณดังนั้นค่าของppixel เหล่านั้นจะอยู่ในการรอให้คุณลงทะเบียน สามพิกเซลอื่น ๆ เหล่านี้จะถูกดำเนินการเสมอแม้ว่าผลลัพธ์ของพวกเขาจะถูกโยนทิ้งไป ดังนั้นรูปสามเหลี่ยมที่ครอบคลุมพิกเซลเดียวจะแรเงาสี่พิกเซลและทิ้งผลลัพธ์ของพวกมันสามตัวเพื่อให้คุณสมบัติที่ได้มาเหล่านี้ทำงานได้!

นี่ถือเป็นค่าใช้จ่ายที่ยอมรับได้ (สำหรับฮาร์ดแวร์ปัจจุบัน) เพราะมันไม่ใช่แค่ฟังก์ชั่นfwidthที่ใช้อนุพันธ์เหล่านี้: ทุกตัวอย่างพื้นผิวเดียวก็ทำได้เช่นกันเพื่อเลือก mipmap ของพื้นผิวของคุณที่จะอ่าน ลองพิจารณา: ถ้าคุณอยู่ใกล้กับพื้นผิวมากที่สุดพิกัด UV ที่คุณใช้ในการสุ่มตัวอย่างพื้นผิวนั้นจะมีอนุพันธ์เล็ก ๆ ในพื้นที่หน้าจอซึ่งหมายความว่าคุณจำเป็นต้องใช้ mipmap ขนาดใหญ่ขึ้นและถ้าคุณอยู่ไกลขึ้นพิกัด UV จะมี อนุพันธ์ที่ใหญ่กว่าในพื้นที่หน้าจอหมายความว่าคุณต้องใช้ mipmap ที่เล็กกว่า

เท่าที่มันหมายถึงอะไรในแง่ทางคณิตศาสตร์น้อย: เทียบเท่ากับfwidth เป็นเพียงความแตกต่างระหว่างค่าของที่พิกเซล x + 1 และความคุ้มค่าของการที่พิกเซล x, และในทำนองเดียวกันสำหรับabs(dFdx(p)) + abs(dFdy(p))dFdx(p)ppdFdy(p)


ดังนั้นถ้าเป็นdFdx(p) = p(x1) - p(x)เช่นนั้นx1อาจเป็น(x+1)หรือ(x-1)ขึ้นอยู่กับตำแหน่งของพิกเซลxในรูปสี่เหลี่ยม ไม่ว่าจะด้วยวิธีใดx1ต้องอยู่ในรูปวาร์ป / คลื่นเหมือนxกัน ฉันถูกไหม?
ApoorvaJ

3
@ApoorvaJ โดยพื้นฐานแล้วค่าเดียวกันdFdxจะถูกคำนวณสำหรับแต่ละพิกเซลที่อยู่ใกล้เคียง 2 พิกเซลในตาราง 2x2 และค่านี้คำนวณโดยใช้ความแตกต่างระหว่างสองค่าเพื่อนบ้านหากเป็นp(x+1)-p(x)หรือp(x)-p(x-1)เพียงขึ้นอยู่กับความคิดของคุณของสิ่งที่xอยู่ตรงนี้ ผลที่ได้ก็เหมือนกัน ดังนั้นใช่คุณถูกต้อง
คริสพูดว่า Reinstate Monica

@ChristianRau ที่ตอบคำถามของฉัน ขอบคุณ
ApoorvaJ

11

ในศัพท์เทคนิคทั้งหมดfwidth(p)หมายถึง

fwidth(p) := abs(dFdx(p)) + abs(dFdy(p))

และdFdx(p)/ dFdy(p)เป็นผลสืบเนื่องบางส่วนของค่าที่pเกี่ยวกับขนาดxและyหน้าจอ ดังนั้นพวกเขาจึงแสดงว่าค่าของpพฤติกรรมเมื่อไปหนึ่งพิกเซลทางด้านขวา ( x) หรือหนึ่งพิกเซลขึ้นไป ( y)

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

dFdx(p) := p(x+1) - p(x)

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

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

แรสเตอร์เจอร์ที่ทันสมัยเรียก shader ส่วนในกระเบื้องขนาดใหญ่มากกว่าหนึ่งพิกเซลที่อยู่ใกล้เคียง ที่เล็กที่สุดนั้นจะเป็นตาราง 2x2 พิกเซล และสำหรับแต่ละบล็อกพิกเซลนั้น shader แฟรกเมนต์จะถูกเรียกใช้สำหรับแต่ละพิกเซลและการเรียกใช้เหล่านั้นจะทำงานในขั้นตอนการล็อคแบบขนานอย่างสมบูรณ์แบบดังนั้นการคำนวณทั้งหมดจะดำเนินการในลำดับเดียวกันและในเวลาเดียวกันสำหรับแต่ละพิกเซลในบล็อก (ซึ่งเป็นสาเหตุที่ทำให้แตกกิ่งในส่วนที่แตกในขณะที่ยังไม่ถึงตายควรหลีกเลี่ยงถ้าเป็นไปได้เนื่องจากการร้องขอบล็อกแต่ละบล็อกจะต้องสำรวจทุกสาขาที่ถูกยึดโดยการเรียกร้องอย่างน้อยหนึ่งครั้งแม้ว่ามันเพิ่งจะทิ้งไป ผลลัพธ์หลังจากนั้นก็เป็นไปตามคำตอบของคำถามที่เกี่ยวข้อง) ดังนั้นในทุกช่วงเวลาส่วนของ shader ในทางทฤษฎีสามารถเข้าถึงค่า shader ของพิกเซลที่อยู่ใกล้เคียงได้ และในขณะที่คุณไม่ได้มีการเข้าถึงโดยตรงกับค่าที่คุณมีการเข้าถึงค่าคำนวณจากพวกเขาเช่นฟังก์ชั่นอนุพันธ์dFdx, dFdy, fwidth...

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