2015-01-01 75 views
2

這可能是一件顯而易見的事情,但我不知道,因爲我對裝配和操作系統級別的東西很陌生,所以對我一無所知。WebGL或CUDA代碼如何實際轉換爲GPU指令?

當你在WebGL或CUDA中編寫着色器等時,代碼實際上是翻譯成GPU指令?

我想了解如何編寫優化圖形渲染的超級低級代碼,以便在硬件/軟件邊界準確查看GPU指令的執行方式。

我知道,例如,對於CUDA,您購買其圖形卡(GPU),該圖形卡以某種方式實現以優化圖形操作。但是,如果沒有C,你怎麼編程(在一般意義上)呢?

這個問題的原因是因爲在previous question,我覺得你不能直接使用程序集編程GPU,所以我有點困惑。

如果你看看像CUDA by example文檔,這一切都只是C代碼(雖然他們有事情像cudaMalloccudaFree,我不知道是什麼在做幕後)。但是在引擎蓋下,那C必須被編譯成彙編或者至少是機器代碼什麼的,對嗎?如果是這樣,訪問GPU如何?

基本上我沒有看到如何在C或GLSL以下的水平如何指示GPU本身執行操作。你能解釋一下嗎?是否有一些程序集演示了它如何工作,或者類似的東西?或者,除了x86上的16個「CPU寄存器」之外,還有另一套「GPU寄存器」嗎?

+0

openGL SE GLSL和webGL着色語言有點相似,它們只是翻譯不兼容的東西,並將它傳遞給SE編譯器 –

+0

我從未見過任何'GPU Assembly'代碼,但它很清楚,編譯器(用於圖形驅動程序中包含的OpenGL + GLSL)爲您的特定設備生成二進制機器碼。這個二進制代碼可以在設備上執行,是的,'GPU寄存器'確實存在。 – dari

+2

谷歌搜索「cuda在線文檔」可以獲得CUDA生態系統的完整文檔,包括它們的編譯器和編譯器API,它們使用的中間虛擬機指令集以及二進制後端工具(包括ELF實用程序和反彙編程序)的文檔。我只是不相信你已經努力回答在發佈之前提出的任何問題..... – talonmies

回答

3

GPU驅動程序將其編譯爲GPU可以理解的內容,這與x86機器代碼完全不同。例如,以下是AMD R600彙編代碼片段:

00 ALU: ADDR(32) CNT(4) KCACHE0(CB0:0-15) 
0 x: MUL R0.x, KC0[0].x, KC0[1].x 
    y: MUL R0.y, KC0[0].y, KC0[1].y 
1 z: MUL R0.z, KC0[0].z, KC0[1].z 
    w: MUL R0.w, KC0[0].w, KC0[1].w 
01 EXP_DONE: PIX0, R0 
END_OF_PROGRAM 

該機器代碼版本將由GPU執行。驅動程序編排代碼到GPU的傳輸並指示它運行它。這一切都是非常特定的設備,並在nvidia的情況下,無證(至少,沒有正式記錄)。

該片段中的R0是一個寄存器,但在GPU寄存器中通常工作方式有點不同。它們存在於「每個線程」中,並以一種共享資源的方式存在(從某種意義上說,在一個線程中使用多個寄存器意味着同時激活的線程較少)。爲了讓許多線程同時處於活動狀態(GPU如何容忍內存延遲,而CPU使用亂序執行和大緩存),GPU通常擁有數以萬計的寄存器。

+0

謝謝,那麼將搜索「AMD R600彙編代碼」。那麼,一般的共識是否永遠不要這樣做?或者有沒有可以做到這一點的情況?一些後續問題:http://gamedev.stackexchange.com/questions/90567/do-any-of-the-best-graphics-engines-have-custom-gpu-specific-assembly-code –

+2

@LancePollard我wouldn不要說*永遠不會*,但是很難,很多工作,並且沒有太多的回報。當然,如果你想繼續這樣做,就去做 - 如果沒有其他的話,這很有趣。我可能會選擇英特爾集成GPU,它們有很好的文檔記錄。 – harold

+0

@LancePollard - 您可能需要記住,R600的硬件已經過時了幾代,現在已經過時了,而且GPGPU並不適合開始使用,所以這可能不是最好的投資方式時間進入。 –

3

這些語言通過編譯器轉換爲機器碼。該編譯器只是各種API的驅動程序/運行時的一部分,並且完全是特定於實現的。我們習慣在CPU平臺上使用通用指令集的家族,比如x86,arm或其他。不同的GPU都有自己的不兼容 insruction集。此外,沒有任何API可以在這些GPU上上傳和運行任意二進制文件。而且還有一些公開可用的文檔,具體取決於供應商。

這個問題的原因是因爲在上一個問題中,我得到的感覺是你不能直接使用程序集編程GPU,所以我有點困惑。

嗯,你可以。理論上,至少。如果你不關心你的代碼只能在一個小型的ASIC系列上工作的事實,並且如果你有所有必要的文檔,並且如果你願意實現一些允許運行這些二進制文件的GPU接口,你能行的。如果你想走這條路,你可以看看Mesa3D project,因爲它爲許多GPU提供了開源驅動,包括基於llvm的編譯器基礎架構來生成特定架構的二進制文件。

在實踐中,沒有有用的方式裸機大規模的GPU編程。

+0

後續問題:http://gamedev.stackexchange.com/questions/90567/do-any -of最最好的圖形引擎具備的,定製的GPU特定彙編代碼。還問哈羅德,一般人的共識是不要這樣做的(因爲有時候沒有記錄),或者在某些情況下可以做到這一點? –

+5

誰可以聲明爲「好」或「不好」?它是由你決定。這種方法的問題在於,它實際上只是一大筆工作,實際上只有很少的收穫。正如我所說的,你必須實現自己的基礎架構才能與GPU交談,然後才能做到這一點。做裸機GPU編程當然有一些_hack的價值。 – derhass