我是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);
}
感謝您的回覆。這就明確了數組在函數中被調用時的工作方式。對於基本問題抱歉,我也在閱讀有關C/C++的內容。 – mfaieghi