25 #include "common/cudaengine.cuh"
29 #if ENABLE_OPENCL || ENABLE_CUDA
44 template <
typename... Ts>
49 std::vector<QInterfaceEngine> engines{ engine2, engine3 };
53 return std::make_shared<QEngineCPU>(args...);
55 return std::make_shared<QStabilizer>(args...);
57 return std::make_shared<QUnitClifford>(args...);
60 return std::make_shared<QBdt>(engines, args...);
62 return std::make_shared<QBdtHybrid>(engines, args...);
65 return std::make_shared<QPager>(engines, args...);
67 return std::make_shared<QStabilizerHybrid>(engines, args...);
69 return std::make_shared<QUnit>(engines, args...);
71 return std::make_shared<QTensorNetwork>(engines, args...);
74 return std::make_shared<QEngineOCL>(args...);
78 return std::make_shared<QEngineCUDA>(args...);
80 #if ENABLE_OPENCL || ENABLE_CUDA
82 return std::make_shared<QHybrid>(args...);
84 return std::make_shared<QUnitMulti>(engines, args...);
91 template <
typename... Ts>
95 std::vector<QInterfaceEngine> engines{ engine2 };
99 return std::make_shared<QEngineCPU>(args...);
101 return std::make_shared<QStabilizer>(args...);
103 return std::make_shared<QUnitClifford>(args...);
106 return std::make_shared<QBdt>(engines, args...);
108 return std::make_shared<QBdtHybrid>(engines, args...);
111 return std::make_shared<QPager>(engines, args...);
113 return std::make_shared<QStabilizerHybrid>(engines, args...);
115 return std::make_shared<QUnit>(engines, args...);
117 return std::make_shared<QTensorNetwork>(engines, args...);
120 return std::make_shared<QEngineOCL>(args...);
124 return std::make_shared<QEngineCUDA>(args...);
126 #if ENABLE_OPENCL || ENABLE_CUDA
128 return std::make_shared<QHybrid>(args...);
130 return std::make_shared<QUnitMulti>(engines, args...);
141 return std::make_shared<QEngineCPU>(args...);
143 return std::make_shared<QStabilizer>(args...);
145 return std::make_shared<QUnitClifford>(args...);
148 return std::make_shared<QBdt>(args...);
150 return std::make_shared<QBdtHybrid>(args...);
153 return std::make_shared<QPager>(args...);
155 return std::make_shared<QStabilizerHybrid>(args...);
157 return std::make_shared<QUnit>(args...);
159 return std::make_shared<QTensorNetwork>(args...);
162 return std::make_shared<QEngineOCL>(args...);
166 return std::make_shared<QEngineCUDA>(args...);
168 #if ENABLE_OPENCL || ENABLE_CUDA
170 return std::make_shared<QHybrid>(args...);
172 return std::make_shared<QUnitMulti>(args...);
182 engines.erase(engines.begin());
186 return std::make_shared<QEngineCPU>(args...);
188 return std::make_shared<QStabilizer>(args...);
190 return std::make_shared<QUnitClifford>(args...);
193 if (engines.size()) {
194 return std::make_shared<QBdt>(engines, args...);
196 return std::make_shared<QBdt>(args...);
198 if (engines.size()) {
199 return std::make_shared<QBdtHybrid>(engines, args...);
201 return std::make_shared<QBdtHybrid>(args...);
204 if (engines.size()) {
205 return std::make_shared<QPager>(engines, args...);
207 return std::make_shared<QPager>(args...);
209 if (engines.size()) {
210 return std::make_shared<QStabilizerHybrid>(engines, args...);
212 return std::make_shared<QStabilizerHybrid>(args...);
214 if (engines.size()) {
215 return std::make_shared<QUnit>(engines, args...);
217 return std::make_shared<QUnit>(args...);
219 if (engines.size()) {
220 return std::make_shared<QTensorNetwork>(engines, args...);
222 return std::make_shared<QTensorNetwork>(args...);
225 return std::make_shared<QEngineOCL>(args...);
229 return std::make_shared<QEngineCUDA>(args...);
231 #if ENABLE_OPENCL || ENABLE_CUDA
233 return std::make_shared<QHybrid>(args...);
235 if (engines.size()) {
236 return std::make_shared<QUnitMulti>(engines, args...);
238 return std::make_shared<QUnitMulti>(args...);
246 #define DEVICE_COUNT (OCLEngine::Instance().GetDeviceCount())
248 #define DEVICE_COUNT (CUDAEngine::Instance().GetDeviceCount())
250 template <
typename... Ts>
253 #if ENABLE_OPENCL || ENABLE_CUDA
254 bool isOcl = oc && (DEVICE_COUNT > 0);
255 bool isOclMulti = oc && md && (DEVICE_COUNT > 1);
257 bool isOclMulti =
false;
261 std::vector<QInterfaceEngine> simulatorType;
273 if (pg && simulatorType.size()) {
283 if (sh && (!sd || simulatorType.size())) {
296 std::reverse(simulatorType.begin(), simulatorType.end());
298 if (!simulatorType.size()) {
299 #if ENABLE_OPENCL || ENABLE_CUDA
Definition: complex16x2simd.hpp:25
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:50
@ QINTERFACE_QPAGER
Create a QPager, which breaks up the work of a QEngine into equally sized "pages.".
Definition: qinterface.hpp:95
@ QINTERFACE_CUDA
Create a QEngineCUDA, leveraging CUDA hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:65
@ QINTERFACE_STABILIZER_HYBRID
Create a QStabilizerHybrid, switching between a QStabilizer and a QHybrid as efficient.
Definition: qinterface.hpp:90
@ QINTERFACE_HYBRID
Create a QHybrid, switching between QEngineCPU and QEngineOCL as efficient.
Definition: qinterface.hpp:70
@ QINTERFACE_BDT_HYBRID
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:80
@ QINTERFACE_BDT
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:75
@ QINTERFACE_TENSOR_NETWORK
Circuit-simplification layer, with (optional) recourse to cuTensorNetwork.
Definition: qinterface.hpp:120
@ QINTERFACE_QUNIT_CLIFFORD
Clifford-specialized QUnit.
Definition: qinterface.hpp:115
@ QINTERFACE_OPENCL
Create a QEngineOCL, leveraging OpenCL hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:60
@ QINTERFACE_STABILIZER
Create a QStabilizer, limited to Clifford/Pauli operations, but efficient.
Definition: qinterface.hpp:85
@ QINTERFACE_QUNIT
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that's needed ...
Definition: qinterface.hpp:104
@ QINTERFACE_QUNIT_MULTI
Create a QUnitMulti, which distributes the explicitly separated "shards" of a QUnit across available ...
Definition: qinterface.hpp:110
@ QINTERFACE_CPU
Create a QEngineCPU leveraging only local CPU and memory resources.
Definition: qinterface.hpp:55
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:28
QInterfacePtr CreateQuantumInterface(QInterfaceEngine engine1, QInterfaceEngine engine2, QInterfaceEngine engine3, Ts... args)
Factory method to create specific engine implementations.
Definition: qfactory.hpp:45
QInterfacePtr CreateArrangedLayers(bool md, bool sd, bool sh, bool bdt, bool pg, bool tn, bool hy, bool oc, Ts... args)
Definition: qfactory.hpp:251
void reverse(BidirectionalIterator first, BidirectionalIterator last, bitCapInt stride)