Beispiel #1
0
        public IntPtr CreateBufferHost <T>(Span <T> span) where T : unmanaged
        {
            var error = new int[1];

            var result = Bindings.OpenCl.CreateBuffer(
                Handle,
                CLEnum.MemUseHostPtr,
                (UIntPtr)(span.Length * Marshal.SizeOf <T>()),
                span,
                new Span <int>(error)
                );

            if (result == IntPtr.Zero)
            {
                throw new Exception("Failed to allocate device host memory!");
            }

            var retainError = (CLEnum)Bindings.OpenCl.RetainMemObject(result);

            if (retainError != CLEnum.Success)
            {
                throw new Exception("Failed to retain device host memory!");
            }

            OpenBuffers.Add(result);

            return(result);
        }
Beispiel #2
0
        public IntPtr CreateBuffer(uint size, CLEnum flags)
        {
            var result = Bindings.OpenCl.CreateBuffer(
                Handle,
                flags,
                (UIntPtr)size,
                Span <byte> .Empty,
                Span <int> .Empty
                );

            if (result == IntPtr.Zero)
            {
                throw new Exception("Failed to allocate device memory!");
            }

            var error = (CLEnum)Bindings.OpenCl.RetainMemObject(result);

            if (error != CLEnum.Success)
            {
                throw new Exception("Failed to retain device memory!");
            }

            OpenBuffers.Add(result);

            return(result);
        }
Beispiel #3
0
        private void ReleaseUnmanagedResources()
        {
            Accelerator.OpenContexts.Remove(this);

            foreach (var buffer in OpenBuffers)
            {
                Bindings.OpenCl.ReleaseMemObject(buffer);
            }

            OpenBuffers.Clear();

            foreach (var program in DevicePrograms.ToArray())
            {
                program.Dispose();
            }

            DevicePrograms.Clear();

            Bindings.OpenCl.ReleaseCommandQueue(Queue);

            Bindings.OpenCl.ReleaseContext(Handle);
        }
Beispiel #4
0
        public unsafe IntPtr AllocBufferHost(uint size)
        {
            /* TODO: Figure out why this fails */

            var error = 0;
            var ptr   = 0;

            var result = Bindings.OpenCl.CreateBuffer(
                Handle,
                CLEnum.MemAllocHostPtr | CLEnum.MemReadWrite,
                (UIntPtr)size,
                &ptr,
                &error
                );

            if (result == IntPtr.Zero)
            {
                throw new Exception("Failed to allocate device host memory!");
            }

            OpenBuffers.Add(result);

            return(result);
        }
Beispiel #5
0
        public void ReleaseBuffer(IntPtr buffer)
        {
            Bindings.OpenCl.ReleaseMemObject(buffer);

            OpenBuffers.Remove(buffer);
        }