pointers - How to fix clSetKernelArg error CL_INVALID_MEM_OBJECT in Haskell OpenCLRaw? -
i trying use opencl using haskell. write simple program converting working 1 in c. appears work well, when assign memory object kernel parameters, fails cl_invalid_mem_object error. don't know fix because use same calls in c program , there works:
the programsource
opencl code
programsource :: string programsource = "__kernel void duparray(__global float *in, __global float *out ){ int id = get_global_id(0); out[id] = 2*in[id]; }"
and initializacion works until call of clsetkernelarg
fails just (errorcode (-38))
-- test opencl input <- newarray ([0,1,2,3,4] :: [cfloat]) right mem_in <- clcreatebuffer mycontext (memflagsjoin [clmemreadonly,clmemcopyhostptr]) (4*5) (castptr input) right mem_out <- clcreatebuffer mycontext clmemwriteonly (4*5) nullptr print (mem_in,mem_out) right program <- clcreateprogramwithsource mycontext programsource print program err <- clbuildprogram program [mydeviceid] "" buildprogramcallback nullptr print err right kernel <- clcreatekernel program "duparray" print kernel kaerr0 <- clsetkernelarg kernel 0 (fromintegral.sizeof $ mem_in) (castptr mem_in) kaerr1 <- clsetkernelarg kernel 1 (fromintegral.sizeof $ mem_out) (castptr mem_out) print (kaerr0,kaerr1)
i'm using openclraw, several modifications put on https://github.com/zhensydow/openclraw
i found need pass direction of mem buffer pointer, no pointer itself. rigth way call clsetkernelarg
:
dir_mem_in <- (malloc :: io (ptr mem)) poke dir_mem_in mem_in kaerr0 <- clsetkernelarg kernel 0 (fromintegral.sizeof $ mem_in) (castptr dir_mem_in) dir_mem_out <- (malloc :: io (ptr mem)) poke dir_mem_out mem_out kaerr1 <- clsetkernelarg kernel 1 (fromintegral.sizeof $ mem_out) (castptr dir_mem_out) print (kaerr0, kaerr1)
Comments
Post a Comment