2012-09-16 62 views
2

我看到人們在C代碼中使用內聯PTX彙編代碼的一些代碼示例。 CUDA工具包中的Doc提到PTX功能強大,爲何如此?如果我們在C代碼中使用這些代碼,我們會得到什麼好處?Inline PTX彙編代碼是否強大?

+5

這個問題有點像問「是長根繩子嗎?」。沒有確切的答案。在某些情況下,對編譯器發出的PTX指令有明確的控制是有利的或必要的,以及其他情況下不適用的情況。 PTX仍然只是GPU運行代碼的中間代表。 – talonmies

+0

我期待的一些例子,其中可以顯示PTX的權力,這將說服我。我承認,這是一般的問題,但我需要一些例子,在那裏我可以說服自己,用PTX爲您提供了CUDA-C不能給 –

+2

內嵌PTX,您可以訪問通過CUDA intrinsincs不暴露說明一些額外的力量,讓你申請編譯器缺乏或語言規範禁止的優化。對於使用內聯PTX有利的工作示例,請參閱:http://stackoverflow.com/questions/6162140/128-bit-integer-on-cuda/6220499#6220499 – njuffa

回答

8

內嵌PTX,您可以訪問通過CUDA intrinsincs不暴露說明,並讓您應用在編譯器要麼缺乏或語言規範禁止優化。對於使用內嵌PTX有利的工作示例,請參閱: 128 bit integer on cuda?

使用內聯PTX的128位添加只需要四條指令,因爲它可以直接訪問進位標誌。作爲HLL,C/C++不具有進位標誌的表示,作爲一個給定的硬件平臺可能沒有進位標誌(例如MIPS),一個單一的進位標誌(例如X86,sm_2x),或甚至多個進位標誌。相較於128位加法和減法的4指令PTX版本中,這些操作可能會在C編碼如下:

#define SUBCcc(a,b,cy,t0,t1,t2) \ 
    (t0=(b)+cy, t1=(a), cy=t0<cy, t2=t1<t0, cy=cy+t2, t1-t0) 
#define SUBcc(a,b,cy,t0,t1) \ 
    (t0=(b), t1=(a), cy=t1<t0, t1-t0) 
#define SUBC(a,b,cy,t0,t1) \ 
    (t0=(b)+cy, t1=(a), t1-t0) 
#define ADDCcc(a,b,cy,t0,t1) \ 
    (t0=(b)+cy, t1=(a), cy=t0<cy, t0=t0+t1, t1=t0<t1, cy=cy+t1, t0=t0) 
#define ADDcc(a,b,cy,t0,t1) \ 
    (t0=(b), t1=(a), t0=t0+t1, cy=t0<t1, t0=t0) 
#define ADDC(a,b,cy,t0,t1) \ 
    (t0=(b)+cy, t1=(a), t0+t1) 

unsigned int cy, t0, t1, t2; 

res.x = ADDcc (augend.x, addend.x, cy, t0, t1); 
res.y = ADDCcc (augend.y, addend.y, cy, t0, t1); 
res.z = ADDCcc (augend.z, addend.z, cy, t0, t1); 
res.w = ADDC (augend.w, addend.w, cy, t0, t1); 

res.x = SUBcc (minuend.x, subtrahend.x, cy, t0, t1); 
res.y = SUBCcc (minuend.y, subtrahend.y, cy, t0, t1, t2); 
res.z = SUBCcc (minuend.z, subtrahend.z, cy, t0, t1, t2); 
res.w = SUBC (minuend.w, subtrahend.w, cy, t0, t1); 

加法和減法以上可能編譯成的人數約三至四倍由相應的內嵌PTX版本使用的指令。

+0

性能如何?這樣的代碼注入是否會提升性能? –

+1

在我指出的例子中,使用內聯PTX可以最小化所需的指令數量。如果應用程序的指令吞吐量有限,這有助於應用程序的性能顯然,只有在它提供了明顯的好處的情況下,纔會使用這樣的低級接口,但這適用於在任何平臺上使用內聯彙編。關於過早優化的標準警告適用。 – njuffa