/// <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); }
/// <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); }