DLPrimitives
program_cache.hpp
1 #pragma once
2 #include <dlprim/context.hpp>
3 #include <mutex>
4 #include <map>
5 #include <unordered_map>
6 
7 namespace dlprim {
8  namespace gpu {
9 
10  inline int round_up(int x,int y)
11  {
12  return (x+(y-1))/y*y;
13  }
14 
15  inline cl::NDRange round_range(int x,cl::NDRange const &l)
16  {
17  size_t const *size = l;
18  x=round_up(x,size[0]);
19  return cl::NDRange(x);
20  }
21 
22  inline cl::NDRange round_range(int x,int y,cl::NDRange const &l)
23  {
24  size_t const *size = l;
25  x=round_up(x,size[0]);
26  y=round_up(y,size[1]);
27  return cl::NDRange(x,y);
28  }
29 
30  inline cl::NDRange round_range(int x,int y,int z,cl::NDRange const &l)
31  {
32  size_t const *size = l;
33  x=round_up(x,size[0]);
34  y=round_up(y,size[1]);
35  z=round_up(z,size[2]);
36  return cl::NDRange(x,y,z);
37  }
38 
39  extern std::map<std::string,std::string> kernel_sources;
40 
41  struct Parameter {
42  Parameter(std::string const &n,int v):
43  name(n), value(std::to_string(v))
44  {
45  }
46  Parameter(std::string const &n,std::string const &v):
47  name(n), value(v)
48  {
49  }
50 
51  std::string name;
52  std::string value;
53  };
54 
55  class Cache {
56  public:
57  static Cache &instance();
58 
59  static void fill_params(std::vector<Parameter> &)
60  {
61  }
62 
63  template<typename Val,typename... Args>
64  static void fill_params(std::vector<Parameter> &p,std::string const &n,Val v,Args... args)
65  {
66  p.push_back(Parameter(n,v));
67  fill_params(p,args...);
68  }
69 
70  template<typename Val,typename... Args>
71  cl::Program const &get_program(Context &ctx,std::string const &source,std::string const &n1,Val const &v1,Args...args)
72  {
73  std::vector<Parameter> p;
74  fill_params(p,n1,v1,args...);
75  return get_program(ctx,source,p);
76  }
77  cl::Program const &get_program(Context &ctx,std::string const &source)
78  {
79  std::vector<Parameter> p;
80  return get_program(ctx,source,p);
81  }
82  cl::Program const &get_program(Context &ctx,std::string const &source,std::vector<Parameter> const &params);
83 
84  template<typename Val,typename... Args>
85  static cl::Program build_program(Context &ctx,std::string const &source,std::string const &n1,Val const &v1,Args...args)
86  {
87  std::vector<Parameter> p;
88  fill_params(p,n1,v1,args...);
89  return build_program(ctx,source,p);
90  }
91  static cl::Program build_program(Context &ctx,std::string const &source)
92  {
93  std::vector<Parameter> p;
94  return build_program(ctx,source,p);
95  }
96  static cl::Program build_program(Context &ctx,std::string const &source,std::vector<Parameter> const &params);
97  private:
98  static std::string make_key(Context &ctx,std::string const &src,std::vector<Parameter> const &params);
99  std::unordered_map<std::string,cl::Program> cache_;
100  std::mutex mutex_;
101  };
102  }
103 }
105 
This is main object that represent the pair of OpenCL platform and device all other objects use it...
Definition: context.hpp:302
Definition: program_cache.hpp:55
Mane namespace.
Definition: context.hpp:9
Definition: program_cache.hpp:41