public static MemoryBuffer Copy <T>(CLAPI instance, MemoryBuffer input) where T : struct { CLKernel k = null; if (CopyKernels.ContainsKey(instance)) { k = CopyKernels[instance]; } else { string clt = KernelParameter.GetDataString(KernelParameter.GetEnumFromType(typeof(T))); string src = COPY_KERNEL_SOURCE.Replace("__TYPE__", clt); CLProgram.TryBuildProgram(instance, src, "internal_copy_kernel.cl", out CLProgram prog); k = prog.ContainedKernels["copy"]; CopyKernels[instance] = k; } MemoryBuffer mb = CreateEmpty <T>( instance, (int)input.Size, input.Flags, "CopyOf:" + input, true ); k.SetBuffer(0, mb); k.SetBuffer(1, input); Run(instance, k, (int)mb.Size); return(mb); }
/// <summary> /// Public constructor /// </summary> /// <param name="instance">CLAPI Instance for the current thread</param> /// <param name="folderName">Folder name where the kernels are located</param> /// <param name="genDataVectorType">The DataVectorTypes used to compile the FL Database</param> public KernelDatabase(DataVectorTypes genDataVectorType) : base( OpenCLDebugConfig.Settings, "DB" ) { GenDataType = KernelParameter.GetDataString(genDataVectorType); loadedPrograms = new List <CLProgram>(); loadedKernels = new Dictionary <string, CLKernel>(); }
/// <summary> /// Public constructor /// </summary> /// <param name="instance">CLAPI Instance for the current thread</param> /// <param name="folderName">Folder name where the kernels are located</param> /// <param name="genDataVectorType">The DataVectorTypes used to compile the FL Database</param> public KernelDatabase(CLAPI instance, string folderName, DataVectorTypes genDataVectorType) : base( OpenCLDebugConfig.Settings, "DB" ) { GenDataType = KernelParameter.GetDataString(genDataVectorType); loadedPrograms = new List <CLProgram>(); loadedKernels = new Dictionary <string, CLKernel>(); if (Directory.Exists(folderName)) { LoadFolder(instance, folderName); } }
public static CLProgramBuildResult TryBuildProgram( CLAPI instance, string source, string filePath, out CLProgram program) { CLProgramBuildResult result = new CLProgramBuildResult( filePath, source, new List <CLProgramBuildError>() ); string[] kernelNames = FindKernelNames(source); if (kernelNames.Length == 0) { program = new CLProgram(filePath, new Dictionary <string, CLKernel>(), source); return(result); } Program prgHandle; try { prgHandle = CLAPI.CreateClProgramFromSource(instance, source); } catch (Exception e) { result.BuildErrors.Add(new CLProgramBuildError(ErrorType.ProgramBuild, e)); program = null; return(result); //We can not progress } Dictionary <string, CLKernel> kernels = new Dictionary <string, CLKernel>(); foreach (string kernelName in kernelNames) { try { Kernel k = CLAPI.CreateKernelFromName(prgHandle, kernelName); int kernelNameIndex = source.IndexOf(" " + kernelName + " (", StringComparison.InvariantCulture); kernelNameIndex = kernelNameIndex == -1 ? source.IndexOf(" " + kernelName + "(", StringComparison.InvariantCulture) : kernelNameIndex; KernelParameter[] parameter = KernelParameter.CreateKernelParametersFromKernelCode( source, kernelNameIndex, source.Substring( kernelNameIndex, source.Length - kernelNameIndex ). IndexOf( ')' ) + 1 ); if (k == null) { result.BuildErrors.Add( new CLProgramBuildError( ErrorType.KernelBuild, new OpenClException( $"Header parser completed on {kernelName} but the kernel could not be loaded." ) ) ); kernels.Add(kernelName, new CLKernel(instance, null, kernelName, parameter)); } else { kernels.Add(kernelName, new CLKernel(instance, k, kernelName, parameter)); } } catch (Exception e) { result.BuildErrors.Add(new CLProgramBuildError(ErrorType.KernelBuild, e)); //We can try other kernels } } program = new CLProgram(filePath, kernels, source); program.ClProgramHandle = prgHandle; return(result); }
public static string[] FindFunctions(string source, DataVectorTypes returnType, string[] prefixes) { return(FindFunctions(source, prefixes, KernelParameter.GetDataString(returnType))); }