I am trying to work on this code but everytime I gets runtime error "error: field may not be qualified with an address space global uint64_t external;
Here is my data structure in hdr.h:
typedef unsigned long uint64_t;
typedef struct _elem
{
global uint64_t external;
} elem;
typedef struct _buf
{
global elem *kbuf;
}buf;
My OpenCL kernel is:
#include "hdr.h"
__kernel void svmtest(global buf *tx) {
if(get_global_id(0) == 0)
printf((__constant char *)" %u %s\n", (tx[0].kbuf->external), "test");
}
My OpenCL C code in brief is as follows:
parent =(elem*)clSVMAlloc(context, CL_MEM_READ_WRITE|CL_MEM_SVM_FINE_GRAIN_BUFFER , sizeof(elem),0);
buf *p =(buf*)clSVMAlloc(context, CL_MEM_READ_WRITE|CL_MEM_SVM_FINE_GRAIN_BUFFER , sizeof(buf),0);
parent->external = 9;
p[0].kbuf = parent;
status = clSetKernelArgSVMPointer(kernel, index++, p);
status= clSetKernelExecInfo(
kernel,
CL_KERNEL_EXEC_INFO_SVM_PTRS,
sizeof(parent), &parent
);
However if I change uint64_ external to uint64_t * external in hdr.h and modify the code accordingly then everything works fine. Can't I pass values in structures, is it must to pass a pointer?