Я пытался использовать OpenCL, используя HASKELL.Я пишу простую программу, конвертирующую рабочую в C. Она, кажется, работает хорошо, но когда я назначаю объект памяти параметрам ядра, она завершается с ошибкой CL_INVALID_MEM_OBJECT.Я не знаю, кого исправить, потому что я использую те же вызовы, что и в программе на C, и там это работает:
programSource
- это код OpenCL
programSource :: String
programSource = "__kernel void duparray(__global float *in, __global float *out ){ int id = get_global_id(0); out[id] = 2*in[id]; }"
И инициализация работаетпока вызов clSetKernelArg
не завершится с 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)
Я использую OpenCLRaw с несколькими модификациями, которые я надену https://github.com/zhensydow/OpenCLRaw