public static extern CLError clEnqueueReleaseGLObjects( CLCommandQueue command_queue, uint num_objects, [In] CLMem[] mem_objects, uint num_events_in_wait_list, [In] CLEvent[] event_wait_list, ref CLEvent e);
public Event Acquire(CommandQueue commandQueue, Events eventWaitList) { CLEvent e = new CLEvent(); OpenCLError.Validate(OpenCLGLDriver.clEnqueueAcquireGLObjects(commandQueue.CLCommandQueue, memObjects.Length, memObjects, eventWaitList.Count, eventWaitList.OpenCLEventArray, ref e)); Acquired = true; return(new Event(e)); }
internal Event ExecuteInternal(SizeT[] globalWorkSize, SizeT[] localWorkSize, Events eventWaitList, SizeT[] globalWorkOffset) { if (localWorkSize == null || globalWorkSize.Length == localWorkSize.Length) { CLEvent e = new CLEvent(); OpenCLError.Validate(OpenCLDriver.clEnqueueNDRangeKernel(CommandQueue.CLCommandQueue, CLKernel, globalWorkSize.Length, globalWorkOffset, globalWorkSize, localWorkSize, eventWaitList.Count, eventWaitList.OpenCLEventArray, ref e)); return(new Event(e)); } else { throw new ArgumentException(Resources.LocalWorkSize_and_GlobalWorkSize_dimensions_do_not_agree); } }
private static Event WriteBytesInternal(CLMem openCLMem, CommandQueue commandQueue, Array array, Int64 bytesToCopy, Int64 arrayOffset, Int64 arraySize, Int64 bufferOffset, Int64 bufferSize, Events eventWaitList, WriteOperation writeDelegate) { if (bufferSize < bufferOffset + bytesToCopy) { throw new ArgumentException(Resources.Buffer_out_of_bounds); } if (arraySize < arrayOffset + bytesToCopy) { throw new ArgumentException(Resources.Array_out_of_bounds); } GCHandle valueHandle = GCHandle.Alloc(array, GCHandleType.Pinned); try { CLEvent e = new CLEvent(); unsafe { IntPtr valuePtr = new IntPtr((Byte *)(valueHandle.AddrOfPinnedObject().ToPointer()) + arrayOffset); OpenCLError.Validate ( writeDelegate ( commandQueue.CLCommandQueue, openCLMem, CLBool.True, new SizeT(bufferOffset), new SizeT(bytesToCopy), valuePtr, eventWaitList == null ? 0 : eventWaitList.Count, eventWaitList == null ? null : eventWaitList.OpenCLEventArray, ref e ) ); } return(new Event(e)); } finally { valueHandle.Free(); } }
internal static CLEvent[] GetOpenCLEventArray(Event[] events) { if (events != null && events.Length != 0) { CLEvent[] openclEvents = new CLEvent[events.Length]; for (UInt32 i = 0; i < events.Length; i++) { openclEvents[i] = events[i].CLEvent; } return(openclEvents); } else { return(null); } }
/// <summary> /// Multiply an array by a constant value /// </summary> internal static void Multiply() { try { CLError err = new CLError(); //Allocate memory float[] arr = new float[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; GCHandle arrGC = GCHandle.Alloc(arr, GCHandleType.Pinned); CLMem bufferFilter = OpenCLDriver.clCreateBuffer(ctx, CLMemFlags.ReadWrite | CLMemFlags.CopyHostPtr, new SizeT(arr.Length * sizeof(float)), arrGC.AddrOfPinnedObject(), ref err); //set parameters unsafe { OpenCLDriver.clSetKernelArg(kernel_mult, 0, new SizeT(sizeof(CLMem)), ref bufferFilter); } //Define grid & execute err = OpenCLDriver.clFinish(comQ); SizeT[] localws = { 5, 1 }; SizeT[] globalws = { 10, 1 }; CLEvent eventObj = new CLEvent(); err = OpenCLDriver.clEnqueueNDRangeKernel(comQ, kernel_mult, 2, null, globalws, localws, 0, null, ref eventObj); CLEvent[] eventObjs = new CLEvent[1]; eventObjs[0] = eventObj; OpenCLDriver.clWaitForEvents(1, eventObjs); // read buffer err = OpenCLDriver.clEnqueueReadBuffer(comQ, bufferFilter, CLBool.True, 0, 10 * sizeof(float), arrGC.AddrOfPinnedObject(), 0, null, ref eventObj); TableForm.ShowTableStatic(arr, "OpenCL Test"); } catch (Exception exc) { MessageBox.Show(exc.ToString()); } }
internal Event(CLEvent openclEvent) { this.CLEvent = openclEvent; }
internal static extern CLError clEnqueueAcquireGLObjects(CLCommandQueue command_queue, int num_objects, [In] CLMem[] mem_objects, int num_events_in_wait_list, [In] CLEvent[] event_wait_list, ref CLEvent e);