灰度核心

讓我們構建一個核心來生成灰度影象。我們將使用為每個元件使用 uint 定義的影象資料和 RGBA 訂單。

__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
                                CLK_ADDRESS_CLAMP_TO_EDGE |
                                CLK_FILTER_LINEAR;

__kernel void Grayscale(__read_only image2d_t input, __write_only image2d_t output) {
    int2 gid = (int2)(get_global_id(0), get_global_id(1));
    int2 size = get_image_dim(input);

    if(all(gid < size)){
        uint4 pixel = read_imageui(input, sampler, gid);
        float4 color = convert_float4(pixel) / 255;
        color.xyz = 0.2126*color.x + 0.7152*color.y + 0.0722*color.z;
        pixel = convert_uint4_rte(color * 255);
        write_imageui(output, gid, pixel);
    }
}

現在讓我們一步一步地瀏覽該程式碼。第一行在 sampler_t 型別的__constant 記憶體區域中建立一個變數。此取樣器用於進一步指定對影象資料的訪問。有關完整文件,請參閱 Khronos 文件。

在我們呼叫核心之前,我們將輸入分配為 read_only,輸出分配為 write_only,因此我們在此處新增這些修飾符。

image2d 和 image3d 總是在全域性記憶體中分配,因此我們可以省略__global 修飾符。

然後我們得到我們的執行緒 id,它定義了我們要轉換為灰度的畫素。我們還查詢大小以確保我們的執行緒不訪問未分配的記憶體。如果你忘記了,這將定義你的核心崩潰。

在我們確定我們是合法執行緒之後,我們從輸入影象中讀取了畫素。然後我們將它轉​​換為 float 以避免丟失小數位,進行一些計算,將其轉換回來並將其寫入輸出。