public static bool SetParallel <T>(this ICompressibleFunction <T> compressibleFunction, bool enable) where T : unmanaged, IComparable <T> { compressibleFunction.IsParallel = enable & OpenCL.Enable; if (compressibleFunction.IsParallel) { string kernelNameBase = compressibleFunction.FunctionName.Replace(" ", ""); compressibleFunction.ForwardKernelName = kernelNameBase + "Forward"; compressibleFunction.BackwardgWKernelName = kernelNameBase + "gWBackward"; compressibleFunction.BackwardgXKernelName = kernelNameBase + "gXBackward"; string kernelSource = compressibleFunction.KernelSource; if (compressibleFunction.Activation is ICompressibleActivation <T> activator) { //アクティベーションを活性化 kernelSource = activator.KernelSource + kernelSource.Replace("/*ForwardActivate*/", "ForwardActivate"); } ComputeProgram program = OpenCL.CreateProgram <T>(kernelSource); compressibleFunction.ForwardKernel = program.CreateKernel(compressibleFunction.ForwardKernelName); compressibleFunction.BackwardgWKernel = program.CreateKernel(compressibleFunction.BackwardgWKernelName); compressibleFunction.BackwardgXKernel = program.CreateKernel(compressibleFunction.BackwardgXKernelName); } return(compressibleFunction.IsParallel); }
public static Real[] GetActivatedgy(this ICompressibleFunction compressibleFunction, NdArray y) { Real[] activatedgy = new Real[y.Grad.Length]; for (int i = 0; i < activatedgy.Length; i++) { activatedgy[i] = compressibleFunction.Activation.BackwardActivate(y.Grad[i], y.Data[i]); } return(activatedgy); }