Thats how i tried to do this, but If i wan’t to write more than once I’m getting stuck with invalid context.
Originaly it was like this:
{
memObjects = new cl_mem[6];
}
memObjects[0] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg1, null);
memObjects[1] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg2, null);
memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg3, null);
memObjects[3] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg4, null);
memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg5, null);
memObjects[5] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg6, null);```
I was just recreating the buffers every single loop so I'm trying to make it like this:
```if(memObjects == null)
{
memObjects = new cl_mem[6];
//}
memObjects[0] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg1, null);
memObjects[1] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg2, null);
memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * 1, Arg3, null);
memObjects[3] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg4, null);
memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg5, null);
memObjects[5] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, Sizeof.cl_float * n, Arg6, null);
}
else
{
clEnqueueWriteBuffer( commandQueue, memObjects[0], false, 0, (Sizeof.cl_float * 1), Arg1, 0, null, null);
clEnqueueWriteBuffer( commandQueue, memObjects[1], false, 0, (Sizeof.cl_float * 1), Arg2, 0, null, null);
clEnqueueWriteBuffer( commandQueue, memObjects[2], false, 0, (Sizeof.cl_float * 1), Arg3, 0, null, null);
clEnqueueWriteBuffer( commandQueue, memObjects[3], false, 0, (Sizeof.cl_float * n), Arg4, 0, null, null);
clEnqueueWriteBuffer( commandQueue, memObjects[4], false, 0, (Sizeof.cl_float * n), Arg5, 0, null, null);
clEnqueueWriteBuffer( commandQueue, memObjects[5], false, 0, (Sizeof.cl_float * n), Arg6, 0, null, null);
}```
The problem is that I'm getting this:
[Javascript]Exception in thread "Thread-3" org.jocl.CLException: CL_INVALID_CONTEXT
at org.jocl.CL.checkResult(CL.java:562)
at org.jocl.CL.clEnqueueWriteBuffer(CL.java:11953)
at zefir.ZefirMath.calcNr(ZefirMath.java:419)
at zefir.ZefirView$thread.run(ZefirView.java:1036)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "AsyncOpThread-1" org.jocl.CLException: CL_INVALID_EVENT
at org.jocl.CL.checkResult(CL.java:562)
at org.jocl.CL.clWaitForEvents(CL.java:9918)
at org.jocl.CL$3.run(CL.java:1688)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)[/Javascript]
Line 419 is the second clEnqueueWriteBuffer - line 15 here.
Additionally I've noticed something interesting about new nvidia drivers.
Originally to use openCL on nvidia cards we had(As i remember) install:
nvidia dev drivers
nvidia cuda toolkit with opencl support
ati stream stdk
and now I noticed that it works out of box with my stock(not dev) drivers, without ati stream sdk and cuda toolkit. On ubuntu I was unable to install stream sdk and it worked without it. On windows, As I installed ati stream sdk to check if support for CPU + GPU was possible for nvidia gpu's I noticed it doesn't change anything so I've removed it and because of that openCL stopped working so i had to install stream sdk again(or maybe I could reinstall nvidia driver).
To sum it up: new nvidia drivers support openCL out of box - don't bother installing stream sdk.