Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 /// <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>();
 }
Esempio n. 3
0
        /// <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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public static string[] FindFunctions(string source, DataVectorTypes returnType, string[] prefixes)
 {
     return(FindFunctions(source, prefixes, KernelParameter.GetDataString(returnType)));
 }