AnsweredAssumed Answered

Garbage output by array of struct in OpenCL

Question asked by skstronghold on Jul 20, 2012
Latest reply on Jul 25, 2012 by skstronghold

I'm a total beginner with OpenCL and I'm trying to make the following kernel to work. I am passing an array of structure to the kernel and trying to modify its value. My structure declaration is:

#define LIST_SIZE 10

#pragma pack(push, 1)

typedef struct pairt {

     int a;

     int b;

} pairt; 

#pragma pack(pop)

My host code to create buffer for passing this struct is:

pairt p[LIST_SIZE]; p_mem_obj = clCreateBuffer(context, CL_MEM_READ_WRITE, LIST_SIZE*sizeof(struct pairt), NULL, &ret);

ret = clEnqueueWriteBuffer(command_queue, p_mem_obj, CL_TRUE, 0, LIST_SIZE*sizeof(struct pairt), &p, 0, NULL, NULL);

My code for setting kernel arguments is:

ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&p_mem_obj);

size_t global_item_size = LIST_SIZE;

size_t local_item_size = 2;

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, &events[0]);

ret = clWaitForEvents(1, &events[0]);

ret = clReleaseEvent(events[0]);

ret = clEnqueueReadBuffer(command_queue, p_mem_obj, CL_TRUE, 0, LIST_SIZE*sizeof(struct pairt), p, 0, NULL, &events[1]);

ret = clWaitForEvents(1, &events[1]);

My kernel is:

struct __attribute__ ((packed)) pairt {

     int a;

     int b;

}; 

 

__kernel void simple_diff( __global struct pairt* p) {

     int i = get_global_id(0);

     __global struct pairt *tmp = &p[i];

 

     tmp->a = tmp->a * -1;

     tmp->b = tmp->b * -1; 

}

I initialized array with following values:

1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

17 18

19 20

but the values returned by kernel are:

-298660672 -32767

0 0

-4198172 0

-298660832 -32767

-4200052 0

-1 -2

-3 -4

-5 -6

-7 -8

-9 -10

I have no idea why this is happening?

Attachments

Outcomes