技术开发 频道

CUDA Texture Part.2 Linear Memory

  簡單的範例

  上面已經把要使用 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;
        }
}

   在這裡,是建立了四個大小是 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] );
}

   可以看到這邊的程式非常簡單,就是用一個 for 迴圈,把整個陣列掃一遍,並把 aImg1 和 aImg2 的值都乘上 0.5 後加起來。

0
相关文章