Esempio n. 1
0
        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");
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
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);
        }