Qrack  1.7
General classical-emulating-quantum development framework
oclengine.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017, 2018. All rights reserved.
4 //
5 // This is a multithreaded, universal quantum register simulation, allowing
6 // (nonphysical) register cloning and direct measurement of probability and
7 // phase, to leverage what advantages classical emulation of qubits can have.
8 //
9 // Licensed under the GNU General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/gpl-3.0.en.html
11 // for details.
12 
13 #pragma once
14 
15 #include "config.h"
16 
17 #if !ENABLE_OPENCL
18 #error OpenCL has not been enabled
19 #endif
20 
21 #include <map>
22 #include <mutex>
23 
24 #ifdef __APPLE__
25 #include <OpenCL/cl.hpp>
26 #else
27 #include <CL/cl.hpp>
28 #endif
29 
30 namespace Qrack {
31 
32 class OCLDeviceCall;
33 
35 
36 typedef std::shared_ptr<OCLDeviceContext> DeviceContextPtr;
37 
38 enum OCLAPI {
60 };
61 
63 protected:
64  std::lock_guard<std::recursive_mutex> guard;
65 
66 public:
67  // A cl::Kernel is unique object which should always be taken by reference, or the OCLDeviceContext will lose
68  // ownership.
69  cl::Kernel& call;
71 
72 protected:
73  OCLDeviceCall(std::recursive_mutex& m, cl::Kernel& c)
74  : guard(m)
75  , call(c)
76  {
77  }
78 
79  friend class OCLDeviceContext;
80 
81 private:
82  OCLDeviceCall& operator=(const OCLDeviceCall&) = delete;
83 };
84 
86 public:
87  cl::Platform platform;
88  cl::Device device;
89  cl::Context context;
90  cl::CommandQueue queue;
91 
92 protected:
93  std::recursive_mutex mutex;
94  std::map<OCLAPI, cl::Kernel> calls;
95 
96 public:
97  OCLDeviceContext(cl::Platform& p, cl::Device& d)
98  : platform(p)
99  , device(d)
100  , mutex()
101  {
102  context = cl::Context(d);
103  queue = cl::CommandQueue(context, d);
104  }
105  OCLDeviceCall Reserve(OCLAPI call) { return OCLDeviceCall(mutex, calls[call]); }
106  friend class OCLEngine;
107 };
108 
110 class OCLEngine {
111 public:
113  static OCLEngine* Instance();
115  DeviceContextPtr GetDeviceContextPtr(const int& dev = -1);
117  std::vector<DeviceContextPtr> GetDeviceContextPtrVector();
122  void SetDeviceContextPtrVector(std::vector<DeviceContextPtr> vec, DeviceContextPtr dcp = nullptr);
124  int GetDeviceCount() { return all_device_contexts.size(); }
126  void SetDefaultDeviceContext(DeviceContextPtr dcp);
127 
128 private:
129  std::vector<DeviceContextPtr> all_device_contexts;
130  DeviceContextPtr default_device_context;
131 
132  OCLEngine(); // Private so that it can not be called
133  OCLEngine(OCLEngine const&); // copy constructor is private
134  OCLEngine& operator=(OCLEngine const& rhs); // assignment operator is private
136 
137  void InitOCL();
138 
139  unsigned long PowerOf2LessThan(unsigned long number);
140 };
141 
142 } // namespace Qrack
Definition: oclengine.hpp:51
Definition: oclengine.hpp:46
OCLDeviceCall(const OCLDeviceCall &)
Definition: oclengine.hpp:62
Definition: oclengine.hpp:43
cl::Context context
Definition: oclengine.hpp:89
Definition: oclengine.hpp:53
OCLAPI
Definition: oclengine.hpp:38
Definition: oclengine.hpp:56
Definition: oclengine.hpp:45
Definition: oclengine.hpp:44
Definition: oclengine.hpp:41
Definition: oclengine.hpp:40
static OCLEngine * m_pInstance
Definition: oclengine.hpp:135
OCLDeviceCall(std::recursive_mutex &m, cl::Kernel &c)
Definition: oclengine.hpp:73
OCLDeviceContext(cl::Platform &p, cl::Device &d)
Definition: oclengine.hpp:97
std::shared_ptr< OCLDeviceContext > DeviceContextPtr
Definition: oclengine.hpp:34
Definition: oclengine.hpp:39
Definition: oclengine.hpp:47
std::vector< DeviceContextPtr > all_device_contexts
Definition: oclengine.hpp:129
OCLDeviceCall & operator=(const OCLDeviceCall &)=delete
Definition: oclengine.hpp:85
Definition: oclengine.hpp:48
std::lock_guard< std::recursive_mutex > guard
Definition: oclengine.hpp:64
Definition: oclengine.hpp:50
Definition: oclengine.hpp:58
cl::Device device
Definition: oclengine.hpp:88
Definition: oclengine.hpp:49
Definition: oclengine.hpp:57
Definition: oclengine.hpp:54
std::recursive_mutex mutex
Definition: oclengine.hpp:93
std::map< OCLAPI, cl::Kernel > calls
Definition: oclengine.hpp:94
OCLDeviceCall Reserve(OCLAPI call)
Definition: oclengine.hpp:105
"Qrack::OCLEngine" manages the single OpenCL context.
Definition: oclengine.hpp:110
Definition: oclengine.hpp:55
Definition: oclengine.hpp:42
cl::Platform platform
Definition: oclengine.hpp:87
DeviceContextPtr default_device_context
Definition: oclengine.hpp:130
Definition: oclengine.hpp:52
Definition: oclengine.hpp:59
Definition: complex16simd.hpp:21
cl::Kernel & call
Definition: oclengine.hpp:69
cl::CommandQueue queue
Definition: oclengine.hpp:90
int GetDeviceCount()
Get the count of devices in the current list.
Definition: oclengine.hpp:124