예제 #1
0
        public void cudaMalloc_cudaFree_cudaMemcpy_test_cudaMemset_test()
        {
            int  length    = 1024 * 2;
            byte testValue = 5;

            byte[] test   = new byte[length];
            byte[] result = new byte[length];

            IntPtr d_ptr  = IntPtr.Zero;
            var    size   = length * sizeof(byte);
            var    status = CudaRuntimeApi.cudaMalloc(ref d_ptr, (ulong)size);

            Assert.AreEqual(status, cudaError.cudaSuccess);
            Console.WriteLine($"ptr : {d_ptr}");

            GCHandle gchTest     = GCHandle.Alloc(test, GCHandleType.Pinned);
            GCHandle gchResult   = GCHandle.Alloc(result, GCHandleType.Pinned);
            IntPtr   h_ptrTest   = Marshal.UnsafeAddrOfPinnedArrayElement(test, 0);
            IntPtr   h_ptrResult = Marshal.UnsafeAddrOfPinnedArrayElement(result, 0);

            status = CudaRuntimeApi.cudaMemcpy(d_ptr, h_ptrTest, (ulong)size, cudaMemcpyKind.HostToDevice);
            Assert.AreEqual(status, cudaError.cudaSuccess);

            status = CudaRuntimeApi.cudaMemset(d_ptr, testValue, (ulong)size);
            Assert.AreEqual(status, cudaError.cudaSuccess);

            status = CudaRuntimeApi.cudaMemcpy(h_ptrResult, d_ptr, (ulong)size, cudaMemcpyKind.DeviceToHost);
            Assert.AreEqual(status, cudaError.cudaSuccess);

            for (int i = 0; i < length; i++)
            {
                Assert.AreEqual(result[i], testValue);
            }

            status = CudaRuntimeApi.cudaFree(d_ptr);
            Assert.AreEqual(status, cudaError.cudaSuccess);

            gchTest.Free();
            gchResult.Free();
        }