mfaieghi
mfaieghi

Reputation: 610

Passing variables into kernels

I'm new to OpenCL and am reading the book OpenCL in Action. There is a simple problem that I don't understand it: how to pass values to and return them from kernels.

First of all, are we supposed to always pass arguments by address into kernels?

Then, I have two simple sample of kernels below. In the first one, while output is pointer as function parameter, in body of kernel we never used *output. While in the other kernel, *s1 and *s2 are used as function parameters and we actually assign value to *s1 and *s2 instead of s1 and s2. Can anyone tell me why in the first kernel the value is assigned to output (and not *output) while in the second kernel we have the value assigned to *s1 and *s2 (and not s1 and s2).

I looked at many resources to find a general way to pass and return values to and from kernels by I couldn't find any general rule.

Here is the kernels:

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); 
}

Upvotes: 0

Views: 1609

Answers (1)

DarkZeros
DarkZeros

Reputation: 8410

Your problem is not with OpenCL, is with C language itself. Please read a book on how C language works. It is a VERY basic question what you are asking.

When you have a pointer, (output, s1, s2) you can access it by many ways. output refers to the pointer (adress), *output refers to the value at the first element (or single element pointed by the pointer), and output[i] refers to the ith element value.

*output and output[0] are the same, as well as *(output+1) and output[1].

Upvotes: 2

Related Questions