Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _VIENNACL_PROGRAM_HPP_
00016 #define _VIENNACL_PROGRAM_HPP_
00017
00022 #include <string>
00023 #include <vector>
00024 #include "viennacl/ocl/forwards.h"
00025 #include "viennacl/ocl/handle.hpp"
00026 #include "viennacl/ocl/kernel.hpp"
00027
00028 namespace viennacl
00029 {
00030 namespace ocl
00031 {
00032 class program
00033 {
00034 friend class kernel;
00035
00036 typedef std::vector<viennacl::ocl::kernel> KernelContainer;
00037
00038 public:
00039 program() {}
00040 program(viennacl::ocl::handle<cl_program> const & h, std::string const & prog_name = std::string()) : handle_(h), name_(prog_name) {}
00041
00042 program(program const & other)
00043 {
00044 handle_ = other.handle_;
00045 name_ = other.name_;
00046 kernels_ = other.kernels_;
00047 }
00048
00049 viennacl::ocl::program & operator=(const program & other)
00050 {
00051 handle_ = other.handle_;
00052 name_ = other.name_;
00053 kernels_ = other.kernels_;
00054 return *this;
00055 }
00056
00057 std::string const & name() const { return name_; }
00058
00060 viennacl::ocl::kernel & add_kernel(std::string const & kernel_name)
00061 {
00062 viennacl::ocl::kernel temp(handle_, kernel_name);
00063 kernels_.push_back(temp);
00064 return kernels_.back();
00065 }
00066
00068 viennacl::ocl::kernel & get_kernel(std::string const & name)
00069 {
00070
00071 for (KernelContainer::iterator it = kernels_.begin();
00072 it != kernels_.end();
00073 ++it)
00074 {
00075 if (it->name() == name)
00076 return *it;
00077 }
00078 std::cerr << "ViennaCL: FATAL ERROR: Could not find kernel '" << name << "'" << std::endl;
00079 assert(!"Kernel not found");
00080 return kernels_[0];
00081 }
00082
00083 private:
00084 const viennacl::ocl::handle<cl_program> & handle() const { return handle_; }
00085
00086 viennacl::ocl::handle<cl_program> handle_;
00087 std::string name_;
00088 KernelContainer kernels_;
00089 };
00090 }
00091 }
00092
00093
00094 #endif