Opencl 将变量传递到内核

Opencl 将变量传递到内核,opencl,Opencl,我是OpenCL的新手,正在阅读《OpenCL在行动》一书。有一个我不理解的简单问题:如何向内核传递值并从内核返回值 首先,我们应该总是通过地址将参数传递到内核中吗 下面是两个简单的内核示例。在第一个例子中,虽然输出是作为函数参数的指针,但在内核的主体中,我们从未使用*output。而在另一个内核中,*s1和*s2被用作函数参数,我们实际上给*s1和*s2赋值,而不是给s1和s2赋值。有人能告诉我为什么在第一个内核中,值被分配给输出(而不是*output),而在第二个内核中,值被分配给*s1和*

我是OpenCL的新手,正在阅读《OpenCL在行动》一书。有一个我不理解的简单问题:如何向内核传递值并从内核返回值

首先,我们应该总是通过地址将参数传递到内核中吗

下面是两个简单的内核示例。在第一个例子中,虽然输出是作为函数参数的指针,但在内核的主体中,我们从未使用*output。而在另一个内核中,*s1和*s2被用作函数参数,我们实际上给*s1和*s2赋值,而不是给s1和s2赋值。有人能告诉我为什么在第一个内核中,值被分配给输出(而不是*output),而在第二个内核中,值被分配给*s1和*s2(而不是s1和s2)

我查看了许多参考资料,以找到一种向内核传递值和从内核返回值的通用方法,但我找不到任何通用规则

以下是内核:

1: 2:
你的问题不在于OpenCL,而在于C语言本身。请阅读一本关于C语言如何工作的书。你问什么是一个非常基本的问题

当您有一个指针时,(输出,s1,s2),您可以通过多种方式访问它<代码>输出指的是指针(地址),
*输出
指的是第一个元素(或指针指向的单个元素)的值,
输出[i]
指的是
i
第四个元素的值


*输出
输出[0]
是相同的,以及
*(输出+1)
输出[1]

谢谢您的回复。这清楚地说明了数组在函数中被调用时是如何工作的。很抱歉问了一些基本的问题,我也在读关于C/C++的书。
__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;
}
__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); 
}