public void GroupedIndex2EntryPoint(int length) { var end = (int)Math.Sqrt(Accelerator.MaxNumThreadsPerGroup); for (int i = 1; i <= end; i <<= 1) { var stride = new Index2D(i, i); var extent = new KernelConfig( new Index2D(length, length), stride); using var buffer = Accelerator.Allocate1D <int>(extent.Size); buffer.MemSetToZero(Accelerator.DefaultStream); Execute(extent, buffer.View, stride, extent.GridDim.XY); var expected = new int[extent.Size]; for (int j = 0; j < length * length; ++j) { var gridIdx = Index2D.ReconstructIndex(j, extent.GridDim.XY); for (int k = 0; k < i * i; ++k) { var groupIdx = Index2D.ReconstructIndex(k, extent.GroupDim.XY); var idx = (gridIdx * stride + groupIdx).ComputeLinearIndex( extent.GridDim.XY); expected[idx] = idx; } } Verify(buffer.View, expected); } }
5, 6_000)] // Make sure linearIndices > int.MaxValue work. public void ReconstructIndex2( long linearIndex, int dimX, int dimY, int expectedX, int expectedY) { var index = Index2D.ReconstructIndex(linearIndex, new Index2D(dimX, dimY)); Assert.Equal(expectedX, index.X); Assert.Equal(expectedY, index.Y); }
private static Index2D Reconstruct2DIndex(Index2D totalDim, int linearIndex) => totalDim.ReconstructIndex(linearIndex);