Garbage output by array of struct in OpenCL
===

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?