OpenCL 設備上的圖像對象和採樣器

1.設備上的圖像對象:image2d_t和image3d_t
當主機將一個圖像對象傳遞到設備上,設備上的內核函數會將它作爲一個內核參數來訪問。這個參數的數據類型和圖像的維度有關。如果接受的是二維圖像對象,參數的數據類型就是image2d_t,如果接受的是三維圖像對象,參數的數據類型就是image3d_t.
緩存對象參數可以接受__global或__kernel等修飾符來指定在設備上存儲緩存對象的位置。但因爲很多設備都是將圖像保存在特定的內存中,image2d_t和image3d_t的前面通常會有__read_only或__write_only等修飾符。換言之,一個圖像可以讀,可以寫,但不能同時兼而有之。
圖像對象的默認修飾符是__read_only,最前面的下劃線可以省去。
假設,內核想從三維圖像my_mpeg中讀取數據,並將處理結果保存在二維圖像my_jpg中。那麼在用clCreateImage3D和clCreateImage2D函數創建完兩個cl_mem結構之後,主機應用程序可能需要用到下面的代碼行來設定內核參數:

clSetKernelArg(kernel, 0, sizeof(cl_mem), &my_mpeg);
clSetKernelArg(kernel, 1, sizeof(cl_mem), &my_jpg);

假設處理函數的函數名爲image_proc,它唯一的兩個參數是圖像對象和採樣器。內核函數的聲明如下:

__kernel void image_proc(read_only image3d_t empg,write_only image2d_t ejpg)

這些參數並不是指針。和緩存對象中的數據不同,圖像數據並不希望通過直接使用內存操作來進行訪問。

2.設備上的採樣器:sampler_t;
主機應用程序可以通過調用setKernelArg函數,將cl_sampler對象傳遞給內核。內核將這些參數作爲sampler_t結構來接受,和圖像對象不同,你可以使用__global或__constant修飾符,將這些採樣器對象放在全局內存或常數內存中。
例如,如果主機要將採樣器參數傳遞給名爲image_proc的內核,作爲它唯一的參數,內核函數的聲明如下;

__kernel void image_proc(__global sampler_t sampler)

opencl提供了更爲簡單的處理採樣器的方法。只需要在內核函數中加入一條語句,就可以創建一個sampler_t結構,並設定它的屬性。有了這條語句,就不用麻煩調用clSetKernel函數:

const sampler_t sampler_name = sampler_properties;

sampler_properties表達式配置了採樣器的屬性,讓內核知道如何 從圖像中讀取數據。這些屬性的名字和clCreateSampler函數的參數很相似。內核中採樣器屬性的取值範圍如下;

(1)CLK_NORMALIZED_COORDS_TRUE或CLK_NORMALIZED_COORDS_FALSE--設定圖像座標是否爲歸一化形式(0.01.0).默認的,座標是歸一化形式。
(2)CLK_ADDRESS_CLAMP,CLK_ADDRESS_CLAMP_TO_EDGE,CLK_ADDRESS_REPEAT,CLK_ADDRESS_MIRRORED_REPEAT,或CLKADDRESS_NONE--定義座標超出圖像邊界範圍的像素點的顏色取值。
(3)CLK_FILTER_NEAREST or CLK_FILTER_LINEAR-- 指明像素點之間顏色 取值的插值方式。

作爲例子,下面語句中定義的sampler_t結構告訴內核座標是歸一化形式,圖像邊界範圍之外的座標應該被限制爲圖像邊界上的像素點的顏色取值,像素插值方法爲最近鄰插值法:

__constant sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE |
 CLK_ADDRESS_CLAMP_TO_EDGE |  CLK_FILTER_NEAREST ;

在創建完採樣器後,可以將其作爲openCL的一個函數,來讀取圖像數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章