Как исправить ошибку clSetKernelArg CL_INVALID_MEM_OBJECT в Haskell OpenCLRaw? - PullRequest
0 голосов
/ 01 июля 2011

Я пытался использовать 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

1 Ответ

1 голос
/ 04 июля 2011

Я обнаружил, что мне нужно передать направление указателя буфера mem, а не самого указателя. Это правильный способ звонить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...