private CUdeviceptr GetDeviceMemory(object vector, ref int n) { CUDevicePtrEx ptrEx = _gpu.GetDeviceMemory(vector) as CUDevicePtrEx; n = (n == 0 ? ptrEx.TotalSize : n); return(ptrEx.DevPtr); }
//private int MSizeOf<T>() //{ // return Marshal.SizeOf(typeof(T)); //} /// <summary> /// Frees the specified data array on device. /// </summary> /// <param name="devArray">The device array to free.</param> public override void Free(object devArray) { VerifyOnGPU(devArray); CUDevicePtrEx ptrEx = (CUDevicePtrEx)_deviceMemory[devArray]; HandleError(CUDARuntime.cudaFree(ptrEx.DevPtr)); _deviceMemory.Remove(devArray); }
private void CopyFromDevice <T>(Array devArray, int devOffset, Array hostArray, int hostOffset, int count) { CUDevicePtrEx devPtrEx = GetDeviceMemory(devArray) as CUDevicePtrEx; int n = hostArray.Length; Type type = typeof(T); int elemSize = CUDA.MSizeOf(type); unsafe { GCHandle handle = GCHandle.Alloc(hostArray, GCHandleType.Pinned); IntPtr hostPtr = new IntPtr(handle.AddrOfPinnedObject().ToInt64() + hostOffset * elemSize); CUdeviceptr devPtr = devPtrEx.DevPtr + devOffset * elemSize; cudaError rc = CUDARuntime.cudaMemcpy(hostPtr, devPtr, elemSize * n, cudaMemcpyKind.cudaMemcpyDeviceToHost); handle.Free(); HandleError(rc); } }
private CUdeviceptr GetDeviceMemory(object vector) { CUDevicePtrEx ptrEx = _gpu.GetDeviceMemory(vector) as CUDevicePtrEx; return(ptrEx.DevPtr); }