/// <summary>
        /// Builds the kernel arguments.
        /// </summary>
        /// <typeparam name="TSource">The type of the source.</typeparam>
        /// <param name="inputs">The inputs.</param>
        /// <param name="kernel">The kernel.</param>
        /// <param name="length">The length.</param>
        /// <param name="returnInputVariable">The return result.</param>
        /// <returns></returns>
        private Dictionary <int, GenericArrayMemory> BuildKernelArguments(object[] inputs, ComputeKernel kernel, long length, int?returnInputVariable = null)
        {
            int i = 0;
            Dictionary <int, GenericArrayMemory> result = new Dictionary <int, GenericArrayMemory>();

            foreach (var item in inputs)
            {
                int size = 0;
                if (item.GetType().IsArray)
                {
                    var datagch            = GCHandle.Alloc(item, GCHandleType.Pinned);
                    GenericArrayMemory mem = new GenericArrayMemory(_context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.CopyHostPointer, item);
                    kernel.SetMemoryArgument(i, mem);
                    result.Add(i, mem);
                }
                else
                {
                    size = Marshal.SizeOf(item);
                    var datagch = GCHandle.Alloc(item, GCHandleType.Pinned);
                    kernel.SetArgument(i, new IntPtr(size), datagch.AddrOfPinnedObject());
                }

                i++;
            }

            return(result);
        }
Exemple #2
0
        /// <summary>
        /// Builds the kernel arguments.
        /// </summary>
        /// <typeparam name="TSource">The type of the source.</typeparam>
        /// <param name="method">The method.</param>
        /// <param name="inputs">The inputs.</param>
        /// <param name="kernel">The kernel.</param>
        /// <param name="length">The length.</param>
        /// <param name="returnInputVariable">The return result.</param>
        /// <returns></returns>
        private Dictionary <int, GenericArrayMemory> BuildKernelArguments(KernelFunction method, object[] inputs, ComputeKernel kernel, long length, int?returnInputVariable = null)
        {
            int i = 0;
            Dictionary <int, GenericArrayMemory> result = new Dictionary <int, GenericArrayMemory>();

            foreach (var item in inputs)
            {
                int size = 0;
                if (item.GetType().IsArray)
                {
                    var mode = method.Parameters.ElementAt(i).Value.IOMode;
                    var flag = ComputeMemoryFlags.ReadWrite;
                    if (mode == IOMode.Out)
                    {
                        flag |= ComputeMemoryFlags.AllocateHostPointer;
                    }
                    else
                    {
                        flag |= ComputeMemoryFlags.CopyHostPointer;
                    }
                    GenericArrayMemory mem = new GenericArrayMemory(_context, flag, (Array)item);
                    kernel.SetMemoryArgument(i, mem);
                    result.Add(i, mem);
                }
                else if (item.GetType().Name == "XArray" || item.GetType().BaseType.Name == "XArray")
                {
                    var mode = method.Parameters.ElementAt(i).Value.IOMode;
                    var flag = ComputeMemoryFlags.ReadWrite;
                    if (mode == IOMode.Out)
                    {
                        flag |= ComputeMemoryFlags.AllocateHostPointer;
                    }
                    else
                    {
                        flag |= ComputeMemoryFlags.CopyHostPointer;
                    }
                    GenericArrayMemory mem = new GenericArrayMemory(_context, flag, (XArray)item);
                    kernel.SetMemoryArgument(i, mem);
                    result.Add(i, mem);
                }
                else
                {
                    size = Marshal.SizeOf(item);
                    var datagch = GCHandle.Alloc(item, GCHandleType.Pinned);
                    kernel.SetArgument(i, new IntPtr(size), datagch.AddrOfPinnedObject());
                }

                i++;
            }

            return(result);
        }