public static long GetConvolutionForwardWorkspaceSize(IAllocator allocator, DNNConvolutionFwdAlgo algo, Cpu.ConvolutionDesc2d cd, TensorShape x, TensorShape w, TensorShape y) { if (!(allocator is CudaAllocator)) { throw new InvalidOperationException("allocator must be a CUDA allocator"); } var cudaAllocator = (CudaAllocator)allocator; using (var dnn = cudaAllocator.Context.DNNForDevice(cudaAllocator.DeviceId)) { var convDesc = GetConvDescriptor(cd, x.ElementType); using (var xDesc = GetDescriptor(x)) using (var wDesc = GetFilterDescriptor(w)) using (var yDesc = GetDescriptor(y)) { return(dnn.Value.GetConvolutionForwardWorkspaceSize( xDesc, wDesc, convDesc, yDesc, (cudnnConvolutionFwdAlgo)algo)); } } }
public static void ConvForward(DNNConvolutionFwdAlgo algo, Cpu.ConvolutionDesc2d cd, CudaStorage workspace, Tensor x, Tensor w, Tensor y) { using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x)) { var convDesc = GetConvDescriptor(cd, x.ElementType); using (var workspacePtr = new CudaDeviceVariable <byte>(workspace.DevicePtrAtElement(0), false, workspace.ByteLength)) using (var xPtr = GetDeviceVar(x)) using (var wPtr = GetDeviceVar(w)) using (var yPtr = GetDeviceVar(y)) using (var xDesc = GetDescriptor(x)) using (var wDesc = GetFilterDescriptor(w)) using (var yDesc = GetDescriptor(y)) { dnn.Value.ConvolutionForward(1, xDesc, xPtr, wDesc, wPtr, convDesc, (cudnnConvolutionFwdAlgo)algo, workspacePtr, 0, yDesc, yPtr); } } }