public static void FloatKernel(GpuArrayWrite <float> output, d3 gridDim, d3 blockDim, d3 blockId, d3 threadId) { var index = blockId.d3Dex(gridDim) * blockDim.Volume() + threadId.d3Dex(blockDim); var totalVolume = blockDim.Volume() * gridDim.Volume(); output.AddGpuData( val: (2 * index - totalVolume) / (float)totalVolume, index: index, block: blockId, thread: threadId); }
public static void RunGpuKernel(d3 blocks, d3 threads, Action <d3, d3, d3, d3> kernel) { foreach (var blockId in blocks.Raster()) { foreach (var threadId in threads.Raster()) { kernel(blocks, threads, blockId, threadId); } } }
public static IEnumerable <d3> Raster(this d3 bounds) { for (var iBx = 0; iBx < bounds.X; iBx++) { for (var iBy = 0; iBy < bounds.Y; iBy++) { for (var iBz = 0; iBz < bounds.Z; iBz++) { yield return(new d3(x: iBx, y: iBy, z: iBz)); } } } }
public void AddGpuData(T val, int index, d3 block, d3 thread) { _array[index].Add(new GpuData <T>(index: index, order: _array[index].Count(), val: val, block: block, thread: thread)); }
public static int d3Dex(this d3 d3Id, d3 d3Dim) { return(d3Id.X + d3Id.Y * d3Dim.X + d3Id.Z * d3Dim.X * d3Dim.Y); }
public static Action <d3, d3, d3, d3> FloatKernelWrap(GpuArrayWrite <float> gpuArrayWrite, d3 gridDim, d3 blockDim) { return((d3 gd, d3 bd, d3 blockId, d3 threadId) => FloatKernel(gpuArrayWrite, gd, bd, blockId, threadId)); }
public static void IntKernel(GpuArrayWrite <int> output, d3 gridDim, d3 blockDim, d3 blockId, d3 threadId) { output.AddGpuData(1, blockId.X * blockDim.X + threadId.X, blockId, threadId); }
public static int Volume(this d3 what) { return(what.X * what.Y * what.Z); }