示例#1
0
        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");
            }
        }
示例#2
0
        //[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);
        }