簡單的範例
上面已經把要使用 linear memory 的 CUDA texture 時所需要的基本功能都介紹過了,接下來就來給個簡單的範例吧~程式可以到這個連結下載。
Heresy 這邊用的例子,是把兩張圖做 alpha blending,也就是把兩張圖各自設定透明度,疊在一起看;不過為了簡化,所以沒有去讀圖檔,而是直接建立測試的資料。下面就是 main() 的部分
void main( int argc, char** argv )
{
int width = 1920,
height = 1200,
channel = 3;
// Setup test data
unsigned char *aImg1 = new unsigned char[ width*height*channel ],
*aImg2 = new unsigned char[ width*height*channel ],
*aRS1 = new unsigned char[ width*height*channel ],
*aRS2 = new unsigned char[ width*height*channel ];
for( int i = 0; i < width * height * channel; ++ i )
{
aImg1[i] = 0;
aImg2[i] = 255;
}
// CPU code
Blend_CPU( aImg1, aImg2, aRS1, width, height, channel );
// GPU Code
Blend_GPU( aImg1, aImg2, aRS2, width, height, channel );
// check
for( int i = 0; i < width * height * channel; ++ i )
if( aRS1[i] != aRS2[i] )
{
printf( "Error!!!!\n" );
break;
}
}
{
int width = 1920,
height = 1200,
channel = 3;
// Setup test data
unsigned char *aImg1 = new unsigned char[ width*height*channel ],
*aImg2 = new unsigned char[ width*height*channel ],
*aRS1 = new unsigned char[ width*height*channel ],
*aRS2 = new unsigned char[ width*height*channel ];
for( int i = 0; i < width * height * channel; ++ i )
{
aImg1[i] = 0;
aImg2[i] = 255;
}
// CPU code
Blend_CPU( aImg1, aImg2, aRS1, width, height, channel );
// GPU Code
Blend_GPU( aImg1, aImg2, aRS2, width, height, channel );
// check
for( int i = 0; i < width * height * channel; ++ i )
if( aRS1[i] != aRS2[i] )
{
printf( "Error!!!!\n" );
break;
}
}
在這裡,是建立了四個大小是 1920*1200*3 的 unsigned char 一維陣列來充當圖檔;其中,aImg1 和 aImg2 是當作來源,分別全部填入 0 和 255,而 aRS1 和 aRS2 則分別拿來儲存用 CPU 以及 GPU 計算後的結果。其中 Blend_CPU() 就是用 CPU 計算的函式、Blend_GPU() 則是用 GPU 計算的函式;在計算完後,結果會分別存在 aRS1 和 aRS2 中。最後「check」的部分,就是在驗證 CPU 和 GPU 計算的結果是否一致了~
而其中,Blend_CPU() 的內容是:
void Blend_CPU( unsigned char* aImg1, unsigned char* aImg2,
unsigned char* aRS,
int width, int height, int channel )
{
for( int i = 0; i < width * height * channel; ++ i )
aRS[i] = (unsigned char)( 0.5 * aImg1[i] + 0.5 * aImg2[i] );
}
unsigned char* aRS,
int width, int height, int channel )
{
for( int i = 0; i < width * height * channel; ++ i )
aRS[i] = (unsigned char)( 0.5 * aImg1[i] + 0.5 * aImg2[i] );
}
可以看到這邊的程式非常簡單,就是用一個 for 迴圈,把整個陣列掃一遍,並把 aImg1 和 aImg2 的值都乘上 0.5 後加起來。