private unsafe void TestKernel(Context c, CommandQueue cq, Kernel argIOKernel) { Mem outArgBuffer = c.CreateBuffer((MemFlags)((ulong)MemFlags.ALLOC_HOST_PTR|(ulong)MemFlags.READ_WRITE), sizeof(IOKernelArgs), IntPtr.Zero); byte[] data = new byte[sizeof(IOKernelArgs)]; Output("Testing kernel - Argument return"); argIOKernel.SetArg(0, 1); argIOKernel.SetArg(1, 65L); argIOKernel.SetArg(2, 38.4f); argIOKernel.SetArg(3, outArgBuffer); Event ev; cq.EnqueueTask(argIOKernel,0,null,out ev); cq.Finish(); if ((int)ev.ExecutionStatus < 0) { Error(cq.Device.Name + ": argIOKernel failed with error code " + (ErrorCode)ev.ExecutionStatus); ev.Dispose(); } else { outArgBuffer.Read(cq, 0L, data, 0, sizeof(IOKernelArgs)); IntPtr outArgPtr = cq.EnqueueMapBuffer(outArgBuffer, true, MapFlags.READ, IntPtr.Zero, (IntPtr)sizeof(IOKernelArgs)); IOKernelArgs args = (IOKernelArgs)Marshal.PtrToStructure(outArgPtr, typeof(IOKernelArgs)); cq.EnqueueUnmapMemObject(outArgBuffer, outArgPtr); if (args.outInt != 1) Error(cq.Device.Name + ": argIOKernel failed to return correct arguments"); if (args.outLong != 65) Error(cq.Device.Name + ": argIOKernel failed to return correct arguments"); if (args.outSingle != 38.4f) Error(cq.Device.Name + ": argIOKernel failed to return correct arguments"); } }
private unsafe void TestVecKernel(Context c, CommandQueue cq, Kernel k) { Float2 f2 = new Float2(0.0f,1.0f); float[] memory = new float[2]; fixed (float* pMemory = memory) { Mem mem = c.CreateBuffer((MemFlags)((ulong)MemFlags.READ_WRITE | (ulong)MemFlags.USE_HOST_PTR), 4 * 2, pMemory); k.SetArg(0, f2); k.SetArg(1, mem); cq.EnqueueTask(k); cq.EnqueueBarrier(); IntPtr pMap = cq.EnqueueMapBuffer(mem, true, MapFlags.READ, 0, 2 * 4); cq.EnqueueUnmapMemObject(mem, pMap); } }
private void TestCommandQueueAsync(Context c, CommandQueue cq, Kernel kernel ) { List<Event> events = new List<Event>(); Event clEvent; Output("Testing asynchronous task issuing (clEnqueueTask) and waiting for events"); // Issue a bunch of slow operations kernel.SetArg(0, 5000000); for (int i = 0; i < 10; i++) { cq.EnqueueTask(kernel, 0, null, out clEvent); events.Add(clEvent); } // Issue a bunch of fast operations kernel.SetArg(0, 500); for (int i = 0; i < 10; i++) { cq.EnqueueTask(kernel, 0, null, out clEvent); events.Add(clEvent); } Event[] eventList = events.ToArray(); cq.EnqueueWaitForEvents(eventList.Length, eventList); while (events.Count > 0) { if ((int)events[0].ExecutionStatus < 0) { Output(cq.Device.Name + ": TestCommandQueueAsync failed with error code " + (ErrorCode)events[0].ExecutionStatus); } events[0].Dispose(); events.RemoveAt(0); } }
private void TestMem(Context c, CommandQueue cq, Dictionary<string, Kernel> kernelDictionary) { int size = 8192; byte[] testData = new byte[size]; Output( "Testing Mem class" ); //Output( "Allocating "+size+" bytes of READ_WRITE memory" ); using (Mem buffer = c.CreateBuffer(MemFlags.READ_WRITE, size, IntPtr.Zero)) { for (int i = 0; i < size / 2; i++) { testData[i] = 0; testData[size/2+i] = 1; } //Output("Mem.MemSize=" + size); if (buffer.MemSize.ToInt64() != size) Error("Mem.Size!=input size"); //Output("Mem.MemType=" + buffer.MemType); if (buffer.MemType != MemObjectType.BUFFER) Error("Mem.MemType!=MemObjectType.BUFFER"); //Output("Mem.MapCount=" + buffer.MapCount); if (buffer.MapCount != 0) Error("Mem.MapCount!=0"); buffer.Write(cq, 0L, testData, 0, size); Kernel k = kernelDictionary["TestReadWriteMemory"]; k.SetArg(0, buffer); k.SetArg(1, (long)size); Event bleh; cq.EnqueueTask(k,0,null,out bleh); cq.EnqueueBarrier(); cq.Finish(); buffer.Read(cq, 0L, testData, 0, size); for (int i = 0; i < size / 2; i++) { if (testData[i] != 1) { Error("TestReadWriteMemory failed"); break; } if( testData[size / 2 + i] != 0 ) { Error("TestReadWriteMemory failed"); break; } } } //Output("Allocating " + size + " bytes of READ memory"); using (Mem buffer = c.CreateBuffer(MemFlags.READ_ONLY, size, IntPtr.Zero)) { //Output("Mem.MemSize=" + size); if (buffer.MemSize.ToInt64() != size) Error("Mem.Size!=input size"); //Output("Mem.MemType=" + buffer.MemType); if (buffer.MemType != MemObjectType.BUFFER) Error("Mem.MemType!=MemObjectType.BUFFER"); //Output("Mem.MapCount=" + buffer.MapCount); if (buffer.MapCount != 0) Error("Mem.MapCount!=0"); Kernel k = kernelDictionary["TestReadMemory"]; k.SetArg(0, buffer); k.SetArg(1, (long)size); cq.EnqueueTask(k); cq.Finish(); } //Output("Allocating " + size + " bytes of WRITE memory"); using (Mem buffer = c.CreateBuffer(MemFlags.WRITE_ONLY, size, IntPtr.Zero)) { Array.Clear(testData, 0, size); //Output("Mem.MemSize=" + size); if (buffer.MemSize.ToInt64() != size) Error("Mem.Size!=input size"); //Output("Mem.MemType=" + buffer.MemType); if (buffer.MemType != MemObjectType.BUFFER) Error("Mem.MemType!=MemObjectType.BUFFER"); //Output("Mem.MapCount=" + buffer.MapCount); if (buffer.MapCount != 0) Error("Mem.MapCount!=0"); Kernel k = kernelDictionary["TestWriteMemory"]; k.SetArg(0, buffer); k.SetArg(1, (long)size); cq.EnqueueTask(k); cq.Finish(); buffer.Read(cq, 0L, testData, 0, size); for (int i = 0; i < size; i++) { if (testData[i] != 1) { Error("TestWriteMemory failed"); break; } } } TestReadWriteCopyOps(c, cq); TestImageReadWriteCopyOps(c, cq); TestTransfersBetweenImageAndBuffers(c, cq); TestMapBuffer(c, cq); TestEnqueueNDRangeKernel(c, cq, kernelDictionary["EmptyKernel"]); TestBufferRectFunctions(c, cq); }