public void GlobalSetup() { var r = new Random(); A = Enumerable.Range(0, N) .Select(i => r.NextDouble()) .ToArray(); B = Enumerable.Range(0, N) .Select(i => r.NextDouble()) .ToArray(); C1 = new double[N]; C2 = new double[N]; C3 = new double[N]; _lib = new DxLibrary("../../../../x64/Release/Native_Compute.dll"); _lib.Initialize(); _dev = _lib.CreateDevice(0); using (var str = new FileStream(Path.Combine("../../../../x64/Release", "SimpleShader.cso"), FileMode.Open)) { var data = DxLibrary.LoadShaderByteCode(str); _dev.CreateCsShader(data, "SimpleShader"); } }
//[Theory] //[TestCaseSource(typeof(TestParamSource), nameof(TestParamSource.ArraySizes))] public void SimpleAdd(int n) { var buff1 = Enumerable.Range(0, n) .Select(i => 1.0 * r.NextDouble()) .ToArray(); var buff2 = Enumerable.Range(0, n) .Select(i => 1.0 * r.NextDouble()) .ToArray(); var sum = new double[n]; for (var i = 0; i < n; i++) { sum[i] = buff1[i] + buff2[i]; } var result = new double[n]; var dirPath = Path.GetFullPath(Path.Combine( TestContext.CurrentContext.TestDirectory, DllPath)); var path = Path.Combine(dirPath, "Native_Compute.dll"); using (var dll = new DxLibrary(path)) { dll.Initialize(); var devs = dll.ListAvailableDevices(); var index = Array.FindIndex(devs, d => d.Description.Contains("1060")); using (var device = dll.CreateDevice(index)) { using (var str = new FileStream(Path.Combine(dirPath, "SimpleShader.cso"), FileMode.Open)) { var data = DxLibrary.LoadShaderByteCode(str); device.CreateCsShader(data, "SimpleShader"); } var handle1 = device.CreateStructuredBufferFromPinned(buff1, "int_buff_1"); var handle2 = device.CreateStructuredBufferFromPinned(buff2, "int_buff_2"); device.CreateStructuredBuffer(Marshal.SizeOf <double>(), n, "out_buff"); device.CreateCpuBuffer <double>(n, "cpu_buff"); device.CreateView("srv_1", "int_buff_1", ViewType.ShaderResource); device.CreateView("srv_2", "int_buff_2", ViewType.ShaderResource); device.CreateView("uav", "out_buff", ViewType.UnorderedAccess); device.SetupContext("SimpleShader", new[] { "srv_1", "srv_2" }, new[] { "uav" }); device.Dispatch((uint)n, 1, 1); device.BufferCopy("out_buff", "cpu_buff"); device.GrabFromCpuBuffer(result, "cpu_buff"); device.ClearContext(); device.RemoveView("srv_1", ViewType.ShaderResource); device.RemoveView("srv_2", ViewType.ShaderResource); device.RemoveView("uav", ViewType.UnorderedAccess); device.RemoveBuffer("cpu_buff"); device.RemoveBuffer("out_buff"); device.RemoveBuffer("int_buff_2"); device.RemoveBuffer("int_buff_1"); handle1.Free(); handle2.Free(); } } Assert.That(result, Is.EqualTo(sum).AsCollection); }