日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上)

發布時間:2024/9/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
"The display is the computer."
--Jen-Hsun Huang

歷史上,圖形加速始于在與三角形重疊的每個像素掃描線上對顏色插值,然后顯示這些值。包括訪問圖像數據將紋理應用于表面的能力。為插值和z深度測試添加硬件提供內置的可見性檢測。因為它們經常使用,這些處理被提交到專門的硬件用以提升性能。渲染管道的更多部分,每部分的更多功能,被加到后續的硬件中。專用圖像硬件相對CPU的唯一計算優勢是速度,但是速度很關鍵。

在過去的二十年中,圖形硬件經歷了不可思議的轉變。第一款包含硬件頂點處理的消??費類圖形芯片(NVIDIA的GeForce256)于1999年發售。NVIDIA創造了術語圖形處理單元(GPU),以區分GeForce 256和以前可用的光柵化芯片,并且沿用下來。在接下來的幾年中,GPU從可配置復雜的固定功能流水線到高度可編程的空白石板(blank slates)演化,開發人員可以在那里實現自己的算法。不同種類的可編程著色器是控制GPU的主要手段。為了提高效率,管道的某些部分仍然是可配置的,不是可編程的,但是趨勢是可編程性和靈活性。

GPU通過專注于一組(a narrow set of)可高度并行化的任務從而獲得出色的速度。他們擁有專用于實現z緩沖區的定制芯片,可以快速訪問紋理圖像和其他緩沖區,例如,找到一個三角形所覆蓋的那些像素。這些元素如何執行這些功能在23章中介紹。早期更重要的是要知道GPU如何為它的可編程著色器完成并行化。

3.3節解釋了著色器的功能(how shaders function)。現在,你需要知道的是著色器的核心是一個小的處理器,用來做一些相對孤立的任務,比如把一個頂點從世界左邊變換為屏幕坐標,或者是計算一個被三角形覆蓋的像素的顏色。隨著每幀數千或數百萬三角形被發送到屏幕上,每秒有數十億次的著色器調用,也就是說,著色器程序運行在單獨的實例上。

首先,延遲是所有處理器都面臨的問題。訪問數據需要一些時間。考慮延遲的一個基本方法是,信息離處理器越遠,就要等待越長時間。23.3節介紹延遲的更多細節。訪問存儲在內存芯片中的信息比訪問本地寄存器信息需要花費更長時間。18.4.1節討論內存訪問的更多細節。關鍵點是等待獲取數據意味著處理器處理器會被拖延(stalled),這會降低性能。

3.1 數據并行架構

不同的處理器框架采用不同的策略避免拖延(stalls)。CPU已針對各種數據結構和大型代碼庫進行了優化。CPU可以有多個處理器,但是每個處理器都以串行方式運行代碼,SIMD向量處理是次要的例外。為了盡量減少延遲的影響,CPU的大部分芯片都由快速本地緩存組成,本地緩沖被接下來可能需要的數據所填充。CPU還通過使用諸如分支預判(branch prediction),指令重排(instruction reordering),寄存器重命名(register renaming),緩存預取(cache prefetching)等精巧技術來避免拖延(stalls)。

GPU采用不同的方法。GPU大部分芯片區域專用于大量的處理器,叫做著色器核心,通常有數千個。GPU是流處理器,其中依次處理相似數據的有序集。因為這種相似性(例如一組頂點或像素),GPU可以用大規模并行的方式來處理這些數據。另一個重要因素是這些調用盡可能獨立,這樣它們不需要鄰近調用的信息并且不共享可寫的內存位置。這個規則有時會被破壞以允許新的和有用的功能,但是這樣的例外會以潛在的延遲作為代價,因為一個處理器獲取會等待另一個處理器完成它的工作。

GPU針對吞吐量進行了優化,吞吐量被定義為數據的最大處理速率。然而,這種快速處理具有成本。更少的芯片區域專用于緩存和控制邏輯,每個著色器核心的延遲通常是大大高于CPU處理器遇到的情況。

假設一個網格物體已被光柵化,有兩千個像素有要處理的片段(fragments);一個像素著色程序要被調用兩千次。想象這里只有一個著色器處理器,世界上最弱的GPU。它開始為兩千個片段的第一個執行著色程序。著色器處理器對寄存器中的值執行一些算數運算。寄存器是本地的訪問很快,沒有拖延(stall)發生。著色器處理器接著執行,例如執行到一個紋理訪問;例如,對于一個給定的表面位置,程序需要知道應用到網格上的圖片的像素顏色。紋理是一個完全獨立的資源,不是像素程序本地內存的一部分,紋理訪問參與進來。一次內存獲取可以花費數百至數千個時鐘周期,在那期間GPU處理器什么都不做。此時,著色器處理器會拖延(stall),等待紋理的顏色值返回。

為了使這個GPU有明顯的改觀,給每個前段的本地寄存器一點存儲空間。現在,著色器處理器允許切換并執行另一個片段(兩千個中的第二個),而不是拖延(stalling)在紋理獲取。這個切換非常快,第一個和第二個片段什么都沒受到影響,除了第一個片段上沒有指令再執行。現在第二個片段被執行。和執行第一個時一樣,一些算數函數被執行,然后再次遇到紋理獲取。著色器核心現在切換到另一個片段,第三個。最終兩三個片段全部以這種方式被執行。這時著色器處理器返回到第一個片段。這次紋理顏色被獲取到并且可以使用,因此著色器程序可以繼續執行。處理器用同樣的方式處理直到另一個拖延(stall)執行的指令被遇到,或者程序完成。一個片段會話費更長的執行時間相比于著色器處理器專注于一個片段,但是所有片段的總執行時間大大的減少了。

在這個架構中,通過切換到另一個片段讓GPU保持忙碌來隱藏延遲。GPU通過分離指令執行邏輯和數據來使這個設計更進一步。叫做單指令,多數據(SIMD),這個安排以固定的步數(lock-step)在固定數量的著色器程序上執行相同的命令。SIMD的優勢是專用于處理數據和切換的硅(和電量)明顯減少,相比于使用獨立的邏輯和分配單元去運行每個程序。把我們兩千個片段的例子轉換成現代GPU術語,一個片段的每個像素著色器調用叫做一個線程。這個類型的線程不同于CPU線程。它由著色器輸入值的一點內存,和著色器執行所需的任意寄存器空間組成。使用相同著色器程序的線程被打包成組,在NVIDIA中叫warps,AMD叫wavefronts。一個warps或wavefronts通過一些數量的GPU著色器核心被安排執行,從8到64的任何地方,使用SIMD處理。每個線程被映射到一個SIMD通道(lane)。

假設我們有兩千個線程要執行。在NVIDIA GPU的Warps上包含32個線程。這產生了2000/32=62.5個warps,意味著分配了63個warps,一個warp一半是空的。warp的執行和我們單個GPU處理器的例子類似。著色器程序在所有32個處理器上以固定步數(lock-step)執行。當遇到內存獲取,所有線程同時遇到,因為同樣的指令在所有的線程上執行。獲取示意這個warp的線程將拖延(stall),所有都在等待它們的(不同的)結果。這里不會拖延(stall),這個warp會為一個不同的32個線程的warp交換出去,換進來的warp然后被32個核心執行。這個交換和我們單一處理器系統一樣快,因此當一個warp被換進或換出時,每個線程沒有數據被觸及(touched)。每個線程有它自己的寄存器,每個warp跟蹤正在執行那條指令。換進一個新的warp只是將一組核心指向不同的一組線程去執行;這里沒有其它開銷。Warps執行或者換出知道所有都完成。看圖3.1。

著我們這個簡單的例子中一張紋理的內存獲取延遲能導致warp交換出去。在實際中warps會因為更短的延遲被交換出去,因為交換的成本非常低。這里還有一些其它的技術用來優化執行,但是warp-swapping是所有GPU使用的主要的延遲隱藏(latency-hiding)機制。此過程的效率如何涉及多個因素。例如,如果這里只有少量的線程,然后只有少量的warps會被創建,從而導致延遲隱藏(latency hiding)有問題。

著色器程序的結構是影響效率的一個重要特征。一個主要因素是每個線程使用的寄存器數量。在我們的例子中我們假設可以一次將2000個線程全部駐留在GPU上。每個線程關聯的著色器程序所需的寄存器越多,能駐留在GPU中的線程就更少,因此warps也更少。warps的短缺可能意味著掛起(stall)不能通過交換減輕。駐留的warps被叫做“飛行中”,駐留的數量叫做占用(occupancy)。高占用意味著這兒有許多可用與處理的warps,因此空閑處理器可能更少。占用率低通常會導致性能不佳。內存獲取的頻率同樣影響需要多少延遲隱藏(latency hiding)。Lauritzen概述了占用被寄存器的數量和一個著色器使用共享內存的影響。Wronski討論了理想的占用率如何根據一個著色器執行的操作類型而變化。

影響整體效率的另一個因素是動態分支,由"if"語句和循環造成。加入在一個著色器程序中遇到一條“if”語句,如果所有的線程求值采用相同的分支,warp可以繼續而不用考慮其它分支。然而,如果一些線程,或者甚至只是一個線程,采用另一條路徑,那么warp必須執行這兩個分支,扔掉每個特定線程不需要的結果。這個問題叫做線程分歧(thread divergence),其中一些線程可能需要執行一個循環迭代或者執行一個"if"路徑,而其它warp內的線程不需要,在此期間只能讓這些不需要的線程處于空閑狀態。

所有的GPU實現這種架構想法,導致系統有嚴格的限制但是每瓦特有大量的算力。明白系統如何運轉(operates)將會幫助作為程序員的你更高效的使用它提供的算力。在后面的小節里我們討論GPU如何實現渲染管道,可編程著色器如何運轉(operate),和GPU每個階段的演化和功能。

3.2 GPU管道概述

GPU實現概念的幾何處理,光柵化,和像素處理管道階段在第2章中描述。它們被分成幾個硬件階段有不同程度的可配置性和可編程性。圖3.2顯示了不同階段顏色根據它們可編程和可配置的程度。注意這些物理階段的拆分和第2章中介紹的功能階段有點不一樣。

我們這里描述GPU的邏輯模型,通過一組API暴露給程序員。就像18和23章中討論的,這個邏輯管道的實現,物理模型,依賴于硬件供應商。一個在邏輯模型中的固定功能階段或許通過在相鄰的可編程階段添加命令在GPU上執行。在管道中的一個程序或許會被拆分成多個元素被獨立的子單元(sub-units)執行,或者完全由一個單獨的通道(pass)執行。邏輯模型可以幫助您推斷會影響性能的原因,但是它應該不要誤解為GPU實際實現管道的方式。

頂點著色器時一個完全可編程的階段,用來實現幾何處理階段。幾何著色器是一個完全可編程的階段,在圖元(點,線,和三角形)的頂點上操作。它可以用來執行每圖元著色操作,銷毀圖元,或者創建新的圖元。曲面細分(tessellation)階段和幾何著色階段都是可選的,不是所有的GPU都支持它們,尤其是在移動設備上。

裁剪,三角形設置(triangle setup),和三角形遍歷(triangle traversal)通過固定功能硬件實現。屏幕映射受窗口和視口設置的影響,內部形成了一個簡單的縮放和重新定位。像素著色器階段是完全可編程的。盡管合并(merger)階段不是可編程的,它是高度可配置的并且可以設置執行許多操作。它實現"合并"(merging)的功能階段,負責修改顏色,z-buffer,混合,模板和其它輸出相關的緩沖區。像素著色器的執行與合并階段形成了概念的像素處理階段在第2章介紹。

隨著時間的流逝,GPU管道已從硬編碼操作演變為增強靈活性和控制力。可編程著色器階段的介紹是這一演變過程中最重要的一步。下一節將介紹各個可編程階段共有的功能。

3.3 可編程著色器階段

現代著色器程序使用統一的著色器設計。這意味著頂點,像素,幾何,和曲面細分相關的著色器共享一個通用的編程模型。在內部它們有相同的指令集架構(ISA)。實現此模型的處理器在DirectX中叫做通用著色器核心,有這種核心的GPU被稱為有統一著色器架構。這種類型的架構背后的想法是著色器處理器可用于多種角色,GPU可以根據需要來分配這些。例如,一組由小三角形組成的網格比由兩個三角形組成的大正方形需要更多的頂點著色器處理。一種具有單獨的頂點和像素著色器核心池的GPU意味著為了讓所有核心忙碌的理想工作分配是僵硬地提前決定的。在統一著色器核心中,GPU可以決定如何平衡此負載。

描述整個著色器編程模型大大超出了本書的范圍,并且有許多文檔,書,和網站已經這么做了。著色器使用類似C(C-like)的著色語言進行編程,比如DirectX的高級著色語言(HLSL)和OpenGL的著色語言(GLSL)。DirectX的HLSL可以被編譯成虛擬機字節碼(virtual machine bytecode),也叫做中間語言(IL或DXIL),以提供硬件獨立性。中間表示也可以允許著色器程序離線編譯和存儲。這種中間語言由驅動程序轉換為特定GPU的ISA。控制臺編程通常避免中間語言步驟,因為那時系統中只有一個ISA。

基本數據類型是32位單精度浮點數的標量和向量,盡管向量只是著色器代碼的一部分,在硬件中并不支持就像

上面概述的。現代GPU同樣原生地支持32位整數和64位浮點數。浮點數向量通常包含數據如位置(xyzw),法線,矩陣行,顏色(rgba),或者紋理坐標(uvwq)。整數通常用于表示計數,索引,或者位掩碼。聚合數據類型例如結構,數組,和矩陣同樣也支持。

繪圖調用會調用圖形API來繪制一組圖元,因此導致圖形管道來執行和運行其著色器。每個可編程著色器階段有兩種類型的輸入:統一輸入(uniform inputs),這些值在整個繪圖調用中保持不變(但兩次繪圖調用間可以改變),和可變輸入(varying inputs),從三角形頂點或光柵化過來的數據。例如,像素著色器或許提供一個光源的顏色作為統一(uniform)值,三角形表面的位置每像素改變因此是可變值(varying)。一個紋理是一種特殊類型的統一(uniform)輸入,曾經總是應用于表面的一個顏色圖像,但是現在在這里可以被認為是任意大數據的數組。

底層的虛擬機為不同類型的輸入和輸出提供特殊的寄存器。統一值(uniforms)可用的常量寄存器的數量遠大于可變(varying)值或輸出可用的寄存器數量。這是因為可變(varying)輸入和輸出需要為每個頂點和像素單獨存放,因此對于需要多少個有一個自然的限制。統一(uniform)輸入只被存儲一次并且被繪圖調用內的所有頂點和像素重用。虛擬機還具有通用臨時寄存器,用于暫存空間。可以使用臨時寄存器中的整數值對所有類型的寄存器進行數組索引。著色器虛擬機的輸入和輸出如圖3.3所示。

圖形計算中常見的運算可在現代GPU中高效的執行。著色語言提供(expose)了這些操作中最常見的(例如加和乘)通過運算符例如*和+。其余的通過固有的函數提供,即,atan(), sqrt(), log(), 和一些其它的,為GPU優化的。還存在一些更復雜運算的函數,比如向量法線和反射,叉乘,和矩陣轉置和行列式的計算。

術語流程控制指的是使用分支指令改變代碼執行流程。流程控制相關的指令用來實現高級語言構造例如“if”和“case”語句,還有不同類型的循環語句。著色器支持兩種類型的流程控制。靜態流程控制分支基于統一(uniform)輸入的值。這意味著代碼流在整個繪制調用中是不變的。靜態流程控制的主要好處是允許可以在各種不同情況下使用的同一個著色器(即,不同數量的光源)。這里沒有線程分歧(thread divergence),因為所有的調用都采用相同的代碼路徑。動態流程控制基于可變(varying)輸入的值,意味著每個片段可以不同地執行代碼。這比靜態流程控制強大的多但會降低性能,尤其是如果代碼流在著色器調用間不規則地改變。

總結

以上是生活随笔為你收集整理的预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 超碰在线天天 | 亚洲精品乱码久久久久久蜜桃麻豆 | 18视频网站在线观看 | 国产乱码一区二区三区播放 | 日本一区二区在线免费 | 性欧美丰满熟妇xxxx性仙踪林 | 欧美日韩一区二区综合 | 大尺度做爰呻吟舌吻网站 | 99久久综合 | 欧美色图五月天 | 夜夜撸小说 | 成人免费视频国产免费 | 在线观看中文字幕av | 亚洲一区二区三区精品视频 | 午夜精品久久久久久久四虎美女版 | 美腿丝袜亚洲综合 | 日本不卡网 | 国产麻豆精品在线 | 五月婷婷在线视频 | 看av网站 | 一个色综合导航 | 日韩欧美亚洲精品 | 亚洲一区二区三区四区五区午夜 | 97综合| 亚洲精品喷潮一区二区三区 | 秋霞午夜 | 亚洲欧美日韩动漫 | 穿越异世荒淫h啪肉np文 | 国产高潮流白浆喷水视频 | 久久精品一 | 99热这里只有精品首页 | 国产精品亚洲AV色欲三区不卡 | 久久av一区二区三区漫画 | 日本在线高清视频 | 告诉我真相俄剧在线观看 | 国产色拍 | 少妇被按摩师摸高潮了 | 成人免费视 | 国产精品变态另类虐交 | www.av在线 | 亚洲国产欧美日韩在线 | 黄视频网站在线 | 用力使劲高潮了888av | 欧美一区二区在线观看视频 | 懂色av一区二区夜夜嗨 | 男女日屁视频 | 2020av视频 | 美丽的小蜜桃2:美丽人生 | 日韩少妇 | 亚洲清纯唯美 | 在线日韩中文字幕 | 国产日韩欧美视频在线 | 亚洲成人xxx | 撸大师av | 欧美午夜精品久久久久久人妖 | xxxx69国产 | 视频这里只有精品 | 香蕉成人在线视频 | 午夜偷拍福利视频 | 97一区二区三区 | 深夜视频免费在线观看 | 天天综合永久入口 | 在线免费观看日韩av | 69日影院 | 国产21区 | 亚洲国产精 | 青青免费在线视频 | 毛片毛片毛片毛片毛片毛片 | 亚洲妇女体内精汇编 | 午夜国产福利 | 日本一区二区三区在线观看 | 又色又爽又黄无遮挡的免费视频 | 欧洲xxxxx| 天天干天天日夜夜操 | 少妇与公做了夜伦理 | 成人av免费在线 | xxxwww在线观看 | 亚洲天堂麻豆 | 亚洲精品一区中文字幕乱码 | 男生和女生一起差差差视频 | 欧美日韩高清一区二区三区 | 91麻豆网| 欧美日韩综合一区二区 | 成人依依网 | 欧美一区二区三区国产 | 强开小受嫩苞第一次免费视频 | 午夜xxx| 国产黄色大片视频 | 色av影院| 国产乱码久久久久久 | 白又丰满大屁股bbbbb | 国产精品免费观看视频 | 欧美影视一区二区 | 麻豆蜜桃wwww精品无码 | 自拍偷拍综合 | 日韩中文字幕视频在线 | 91漂亮少妇露脸在线播放 | 日本一区二区三区网站 | 久久精品aⅴ无码中文字字幕重口 |