如何通過編程將GPU用于通用計算任務
發(fā)布時間:2008/5/28 0:00:00 訪問次數(shù):683
隨著現(xiàn)代圖形處理器(gpu)可編程能力及性能的提高,應用開發(fā)商們一直希望圖形硬件可以解決以前只有通用cpu才能完成的高密集計算任務。盡管利用通用gpu進行計算很有發(fā)展前景,但傳統(tǒng)圖像應用編程接口仍然將gpu抽象成一個包括紋理、三角形和像素在內(nèi)的圖像繪制器。尋找一種能夠使用這些基本元素的映射算法并不是一項簡單的操作,即便對最先進的圖形開發(fā)商而言也是如此。
幸運的是,基于gpu的計算從概念上講很容易理解,并且現(xiàn)有多種高級語言和軟件工具可以簡化gpu的編程工作。但是,開發(fā)商必須首先了解gpu在圖像繪制過程中是如何工作的,然后才能確定可用于計算的各個組件。
在繪制圖像時,gpu首先接收宿主系統(tǒng)以三角頂點形式發(fā)送的幾何數(shù)據(jù)。這些頂點數(shù)據(jù)由一個可編程的頂點處理器進行處理,該處理器可以完成幾何變換、亮度計算等任何三角形計算。接下來,這些三角形由一個固定功能的光柵器轉(zhuǎn)換成顯示在屏幕上的單獨“碎片(fragment)”。在屏幕顯示之前,每個碎片都通過一個可編程的碎片處理器計算最終顏色值。
計算碎片顏色的運算一般包括集合向量數(shù)學操作以及從“紋理”中提取存儲數(shù)據(jù),“紋理”是一種存儲表面材料顏色的位圖。最終繪制的場景可以顯示在輸出設備上,或是從gpu的存儲器重新復制到宿主處理器中。
可編程頂點處理器和碎片處理器提供了許多相同的功能和指令集。但是,大部分gpu編程人員只將碎片處理器用于通用計算任務,因為它通常提供更優(yōu)的性能,而且可以直接輸出到存儲器。
利用碎片處理器進行計算的一個簡單例子是對兩個向量進行相加。首先,我們發(fā)布一個大三角形,其所包含的碎片數(shù)量和向量大小(容納的元素)相同。產(chǎn)生的碎片通過碎片處理器進行處理,處理器以單指令多數(shù)據(jù)(simd)的并行方式執(zhí)行代碼。進行向量相加的代碼從存儲器中提取兩個待加元素,并根據(jù)碎片的位置進行向量相加,同時為結(jié)果分配輸出顏色。輸出存儲器保存了向量和,這個值在下一步計算中可以被任意使用。
可編程碎片處理器的isa類似于dsp或pentium sse的指令集,由四路simd指令和寄存器組成。這些指令包括標準數(shù)學運算、存儲器提取指令和幾個專用圖形指令。
gpu與dsp的比較
gpu在幾個主要方面有別于dsp架構(gòu)。其所有計算均使用浮點算法,而且目前還沒有位或整數(shù)運算指令。此外,由于gpu專為圖像處理設計,因此存儲系統(tǒng)實際上是一個二維的分段存儲空間,包括一個區(qū)段號(從中讀取圖像)和二維地址(圖像中的x、y坐標)。
此外,沒有任何間接寫指令。輸出寫地址由光柵處理器確定,而且不能由程序改變。這對于自然分布在存儲器之中的算法而言是極大的挑戰(zhàn)。最后一點,不同碎片的處理過程間不允許通信。實際上,碎片處理器是一個simd數(shù)據(jù)并行執(zhí)行單元,在所有碎片中獨立執(zhí)行代碼。
盡管有上述約束,但是gpu還是可以有效地執(zhí)行多種運算,從線性代數(shù)和信號處理到數(shù)值仿真。雖然概念簡單,但新用戶在使用gpu計算時還是會感到迷惑,因為gpu需要專有的圖形知識。這種情況下,一些軟件工具可以提供幫助。兩種高級描影語言cg和hlsl能夠讓用戶編寫類似c的代碼,隨后編譯成碎片程序匯編語言。這些語言編譯器可以從nvidia和微軟公司的網(wǎng)站免費下載。盡管這些語言大大簡化了描影匯編代碼的編寫,但實際應用時仍然必須使用圖形api來建立并發(fā)布計算任務。
brook是專為gpu計算設計,且不需要圖形知識的高級語言。因此對第一次使用gpu進行開發(fā)的工作人員而言,它可以算是一個很好的起點。brook是c語言的延伸,整合了可以直接映射到gpu的簡單數(shù)據(jù)并行編程構(gòu)造。
經(jīng)gpu存儲和操作的數(shù)據(jù)被形象地比喻成“流”(stream),類似于標準c中的數(shù)組。核心(kernel)是在流上操作的函數(shù)。在一系列輸入流上調(diào)用一個核心函數(shù)意味著在流元素上實施了隱含的循環(huán),即對每一個流元素調(diào)用核心體。brook還提供了約簡機制,例如對一個流中所有的元素進行和、最大值或乘積計算。
brook編譯器是一個源到源的編譯器,能夠把用戶的核心代碼映射成碎片匯編語言,并生成c++短代碼,從而鏈接到大型應用中。這允許用戶只把應用中的性能關鍵部分輸入brook。brook還完全隱藏了圖形api的所有細節(jié),并把gpu中類似二維存儲器系統(tǒng)這樣許多用戶不熟悉的部分進行了虛擬化處理。
用brook編寫的應用程序包括線性代數(shù)子程序、快速傅立葉轉(zhuǎn)換、光線追蹤和圖像處理。brook的編譯器和實時運行環(huán)境可以從http://brook網(wǎng)站上免費獲取。
sourceforge.net網(wǎng)
隨著現(xiàn)代圖形處理器(gpu)可編程能力及性能的提高,應用開發(fā)商們一直希望圖形硬件可以解決以前只有通用cpu才能完成的高密集計算任務。盡管利用通用gpu進行計算很有發(fā)展前景,但傳統(tǒng)圖像應用編程接口仍然將gpu抽象成一個包括紋理、三角形和像素在內(nèi)的圖像繪制器。尋找一種能夠使用這些基本元素的映射算法并不是一項簡單的操作,即便對最先進的圖形開發(fā)商而言也是如此。
幸運的是,基于gpu的計算從概念上講很容易理解,并且現(xiàn)有多種高級語言和軟件工具可以簡化gpu的編程工作。但是,開發(fā)商必須首先了解gpu在圖像繪制過程中是如何工作的,然后才能確定可用于計算的各個組件。
在繪制圖像時,gpu首先接收宿主系統(tǒng)以三角頂點形式發(fā)送的幾何數(shù)據(jù)。這些頂點數(shù)據(jù)由一個可編程的頂點處理器進行處理,該處理器可以完成幾何變換、亮度計算等任何三角形計算。接下來,這些三角形由一個固定功能的光柵器轉(zhuǎn)換成顯示在屏幕上的單獨“碎片(fragment)”。在屏幕顯示之前,每個碎片都通過一個可編程的碎片處理器計算最終顏色值。
計算碎片顏色的運算一般包括集合向量數(shù)學操作以及從“紋理”中提取存儲數(shù)據(jù),“紋理”是一種存儲表面材料顏色的位圖。最終繪制的場景可以顯示在輸出設備上,或是從gpu的存儲器重新復制到宿主處理器中。
可編程頂點處理器和碎片處理器提供了許多相同的功能和指令集。但是,大部分gpu編程人員只將碎片處理器用于通用計算任務,因為它通常提供更優(yōu)的性能,而且可以直接輸出到存儲器。
利用碎片處理器進行計算的一個簡單例子是對兩個向量進行相加。首先,我們發(fā)布一個大三角形,其所包含的碎片數(shù)量和向量大小(容納的元素)相同。產(chǎn)生的碎片通過碎片處理器進行處理,處理器以單指令多數(shù)據(jù)(simd)的并行方式執(zhí)行代碼。進行向量相加的代碼從存儲器中提取兩個待加元素,并根據(jù)碎片的位置進行向量相加,同時為結(jié)果分配輸出顏色。輸出存儲器保存了向量和,這個值在下一步計算中可以被任意使用。
可編程碎片處理器的isa類似于dsp或pentium sse的指令集,由四路simd指令和寄存器組成。這些指令包括標準數(shù)學運算、存儲器提取指令和幾個專用圖形指令。
gpu與dsp的比較
gpu在幾個主要方面有別于dsp架構(gòu)。其所有計算均使用浮點算法,而且目前還沒有位或整數(shù)運算指令。此外,由于gpu專為圖像處理設計,因此存儲系統(tǒng)實際上是一個二維的分段存儲空間,包括一個區(qū)段號(從中讀取圖像)和二維地址(圖像中的x、y坐標)。
此外,沒有任何間接寫指令。輸出寫地址由光柵處理器確定,而且不能由程序改變。這對于自然分布在存儲器之中的算法而言是極大的挑戰(zhàn)。最后一點,不同碎片的處理過程間不允許通信。實際上,碎片處理器是一個simd數(shù)據(jù)并行執(zhí)行單元,在所有碎片中獨立執(zhí)行代碼。
盡管有上述約束,但是gpu還是可以有效地執(zhí)行多種運算,從線性代數(shù)和信號處理到數(shù)值仿真。雖然概念簡單,但新用戶在使用gpu計算時還是會感到迷惑,因為gpu需要專有的圖形知識。這種情況下,一些軟件工具可以提供幫助。兩種高級描影語言cg和hlsl能夠讓用戶編寫類似c的代碼,隨后編譯成碎片程序匯編語言。這些語言編譯器可以從nvidia和微軟公司的網(wǎng)站免費下載。盡管這些語言大大簡化了描影匯編代碼的編寫,但實際應用時仍然必須使用圖形api來建立并發(fā)布計算任務。
brook是專為gpu計算設計,且不需要圖形知識的高級語言。因此對第一次使用gpu進行開發(fā)的工作人員而言,它可以算是一個很好的起點。brook是c語言的延伸,整合了可以直接映射到gpu的簡單數(shù)據(jù)并行編程構(gòu)造。
經(jīng)gpu存儲和操作的數(shù)據(jù)被形象地比喻成“流”(stream),類似于標準c中的數(shù)組。核心(kernel)是在流上操作的函數(shù)。在一系列輸入流上調(diào)用一個核心函數(shù)意味著在流元素上實施了隱含的循環(huán),即對每一個流元素調(diào)用核心體。brook還提供了約簡機制,例如對一個流中所有的元素進行和、最大值或乘積計算。
brook編譯器是一個源到源的編譯器,能夠把用戶的核心代碼映射成碎片匯編語言,并生成c++短代碼,從而鏈接到大型應用中。這允許用戶只把應用中的性能關鍵部分輸入brook。brook還完全隱藏了圖形api的所有細節(jié),并把gpu中類似二維存儲器系統(tǒng)這樣許多用戶不熟悉的部分進行了虛擬化處理。
用brook編寫的應用程序包括線性代數(shù)子程序、快速傅立葉轉(zhuǎn)換、光線追蹤和圖像處理。brook的編譯器和實時運行環(huán)境可以從http://brook網(wǎng)站上免費獲取。
sourceforge.net網(wǎng)
上一篇:ESD知識