2015-12-02 86 views
0

我是OpenCL的新手,正在閱讀OpenCL in Action一書。有一個簡單的問題,我不明白它:如何傳遞值並從內核返回它們。將變量傳遞到內核中

首先,我們是否應該總是通過地址傳遞參數到內核中?

然後,我有兩個簡單的內核示例如下。在第一個中,雖然輸出是指針作爲函數參數,但在內核體中我們從未使用過*輸出。而在另一個內核中,* s1和* s2用作函數參數,我們實際上將值賦給* s1和* s2,而不是s1和s2。任何人都可以告訴我爲什麼在第一個內核中將值分配給輸出(而不是*輸出),而在第二個內核中,我們將值分配給* s1和* s2(而不是s1和s2)。

我看了很多資源,找到一個通用的方法來傳遞和返回內核的價值,我找不到任何一般規則。

這裏是內核:

1:

__kernel void id_check(__global float *output) { 

    /* Access work-item/work-group information */ 
    size_t global_id_0 = get_global_id(0); 
    size_t global_id_1 = get_global_id(1); 
    size_t global_size_0 = get_global_size(0); 
    size_t offset_0 = get_global_offset(0); 
    size_t offset_1 = get_global_offset(1); 
    size_t local_id_0 = get_local_id(0); 
    size_t local_id_1 = get_local_id(1); 

    /* Determine array index */ 
    int index_0 = global_id_0 - offset_0; 
    int index_1 = global_id_1 - offset_1; 
    int index = index_1 * global_size_0 + index_0; 

    /* Set float data */ 
    float f = global_id_0 * 10.0f + global_id_1 * 1.0f; 
    f += local_id_0 * 0.1f + local_id_1 * 0.01f; 

    output[index] = f; 
} 

2:

__kernel void select_test(__global float4 *s1, 
          __global uchar2 *s2) { 

    /* Execute select */ 
    int4 mask1 = (int4)(-1, 0, -1, 0); 
    float4 input1 = (float4)(0.25f, 0.5f, 0.75f, 1.0f); 
    float4 input2 = (float4)(1.25f, 1.5f, 1.75f, 2.0f); 
    *s1 = select(input1, input2, mask1); 

    /* Execute bitselect */ 
    uchar2 mask2 = (uchar2)(0xAA, 0x55); 
    uchar2 input3 = (uchar2)(0x0F, 0x0F); 
    uchar2 input4 = (uchar2)(0x33, 0x33); 
    *s2 = bitselect(input3, input4, mask2); 
} 

回答

2

你的問題不在於OpenCL的,是用C語言本身。請閱讀關於C語言如何工作的書。這是一個非常基本的問題,你在問什麼。

當你有一個指針(output,s1,s2)時,你可以通過很多方式來訪問它。 output引用指針(地址),*output引用第一個元素(或指針指向的單個元素)的值,output[i]引用i th元素的值。

*outputoutput[0]是相同的,以及*(output+1)output[1]

+0

感謝您的回覆。這就明確了數組在函數中被調用時的工作方式。對於基本問題抱歉,我也在閱讀有關C/C++的內容。 – mfaieghi