16#define _CRT_SECURE_NO_WARNINGS 1
23#pragma warning(disable : 4789)
24#include "simulators/statevector/qv_avx2.cpp"
33#define INCLUDED_BY_FACTORY
46std::atomic_int SimulatorsFactory::requestedGpuDeviceId{0};
47thread_local int SimulatorsFactory::scopedGpuDeviceId = -1;
50GpuLibraryRegistry& GpuLibraries() {
51 static GpuLibraryRegistry registry;
56std::shared_ptr<DistributedGpuLibrary> SimulatorsFactory::GetDistributedGpuLibrary() {
57 return DistributedGpuLibrary::GetInstance();
60std::shared_ptr<DistributedGpuLibrary> DistributedGpuLibrary::GetInstance() {
61 static auto lib = std::shared_ptr<DistributedGpuLibrary>(
new DistributedGpuLibrary());
65std::shared_ptr<DistributedMpiGpuLibrary> DistributedMpiGpuLibrary::GetInstance() {
66 static auto lib = std::shared_ptr<DistributedMpiGpuLibrary>(
new DistributedMpiGpuLibrary());
70bool SimulatorsFactory::IsDistributedGpuAvailable()
noexcept {
72 auto lib = GetDistributedGpuLibrary();
73 return lib->Load() && lib->GetGpuDeviceCount() > 0;
80std::shared_ptr<DistributedMpiGpuLibrary> SimulatorsFactory::GetDistributedMpiGpuLibrary() {
81 return DistributedMpiGpuLibrary::GetInstance();
84void SimulatorsFactory::FinalizeDistributedMpiGpuBackend() {
85 DistributedMpiGpuLibrary::GetInstance()->FinalizeBackend();
89 if (deviceId < 0)
throw std::invalid_argument(
"gpu_device must be nonnegative");
90 requestedGpuDeviceId = deviceId;
93int SimulatorsFactory::ResolveGpuDevice(
int deviceId) {
94 if (deviceId >= 0)
return deviceId;
95 if (scopedGpuDeviceId >= 0)
return scopedGpuDeviceId;
96 return requestedGpuDeviceId.load();
99SimulatorsFactory::ScopedGpuDevice::ScopedGpuDevice(
int deviceId)
100 : previous(scopedGpuDeviceId) {
101 scopedGpuDeviceId = ResolveGpuDevice(deviceId);
103SimulatorsFactory::ScopedGpuDevice::~ScopedGpuDevice() {
104 scopedGpuDeviceId = previous;
107std::shared_ptr<GpuLibrary> SimulatorsFactory::GetGpuLibrary(
int deviceId) {
108 return GpuLibraries().Acquire(ResolveGpuDevice(deviceId));
112 return bool(GetGpuLibrary());
115bool SimulatorsFactory::InitGpuLibraryWithMute() {
116 return bool(GpuLibraries().Acquire(ResolveGpuDevice(),
true));
120 return GpuLibraries().DeviceCount();
124 return bool(GpuLibraries().Acquire(ResolveGpuDevice(deviceId),
true));
129std::shared_ptr<QuestLibSim> SimulatorsFactory::questLibrary =
nullptr;
130std::atomic_bool SimulatorsFactory::firstTimeQuest =
true;
134 questLibrary = std::make_shared<QuestLibSim>();
135 if (!firstTimeQuest.exchange(
false)) questLibrary->SetMute(
true);
136 if (questLibrary->Init(
139#elif defined(__APPLE__)
140 "libmaestroquest.dylib"
147 questLibrary =
nullptr;
154 questLibrary = std::make_shared<QuestLibSim>();
155 firstTimeQuest =
false;
156 questLibrary->SetMute(
true);
157 if (questLibrary->Init(
160#elif defined(__APPLE__)
161 "libmaestroquest.dylib"
168 questLibrary =
nullptr;
177 auto sim = std::make_shared<Private::QCSimSimulator>();
179 sim->Configure(
"method",
"matrix_product_state");
181 sim->Configure(
"method",
"matrix_product_operator");
183 sim->Configure(
"method",
"stabilizer");
185 sim->Configure(
"method",
"tensor_network");
187 sim->Configure(
"method",
"pauli_propagator");
189 sim->Configure(
"method",
"path_integral");
191 sim->Configure(
"method",
"density_matrix");
193 sim->Configure(
"method",
"extended_stabilizer");
195 throw std::invalid_argument(
"Simulation Type not supported for QCSim");
201 auto sim = std::make_shared<Private::AerSimulator>();
203 sim->Configure(
"method",
"matrix_product_state");
205 sim->Configure(
"method",
"stabilizer");
207 sim->Configure(
"method",
"tensor_network");
209 sim->Configure(
"method",
"extended_stabilizer");
211 sim->Configure(
"method",
"density_matrix");
213 sim->Configure(
"method",
"statevector");
215 throw std::invalid_argument(
216 "Simulation Type not supported for Qiskit Aer");
221 return std::make_shared<Private::CompositeSimulator>(
225 return std::make_shared<Private::CompositeSimulator>(
230 throw std::invalid_argument(
"Distributed GPU supports only statevector");
231 return std::make_shared<Private::DistributedGpuSimulator>();
234 throw std::invalid_argument(
"Distributed MPI GPU supports only statevector");
235 return std::make_shared<Private::DistributedMpiGpuSimulator>();
246 auto sim = std::make_shared<Private::GpuSimulator>();
247 sim->Configure(
"gpu_device", std::to_string(ResolveGpuDevice()).c_str());
249 sim->Configure(
"method",
"matrix_product_state");
251 sim->Configure(
"method",
"matrix_product_operator");
253 sim->Configure(
"method",
"tensor_network");
255 sim->Configure(
"method",
"pauli_propagator");
257 sim->Configure(
"method",
"statevector");
259 sim->Configure(
"method",
"density_matrix");
268 throw std::invalid_argument(
269 "Simulation Type not supported for Quest Simulator");
270 else if (questLibrary && questLibrary->IsValid()) {
271 return std::make_shared<Private::QuestSimulator>();
278 throw std::invalid_argument(
"Simulator Type not supported");
287 auto sim = std::make_unique<Private::QCSimSimulator>();
289 sim->Configure(
"method",
"matrix_product_state");
291 sim->Configure(
"method",
"matrix_product_operator");
293 sim->Configure(
"method",
"stabilizer");
295 sim->Configure(
"method",
"tensor_network");
297 sim->Configure(
"method",
"pauli_propagator");
299 sim->Configure(
"method",
"path_integral");
301 sim->Configure(
"method",
"density_matrix");
303 sim->Configure(
"method",
"extended_stabilizer");
305 throw std::invalid_argument(
"Simulation Type not supported for QCSim");
311 auto sim = std::make_unique<Private::AerSimulator>();
313 sim->Configure(
"method",
"matrix_product_state");
315 sim->Configure(
"method",
"stabilizer");
317 sim->Configure(
"method",
"tensor_network");
319 sim->Configure(
"method",
"extended_stabilizer");
321 sim->Configure(
"method",
"density_matrix");
323 sim->Configure(
"method",
"statevector");
325 throw std::invalid_argument(
326 "Simulation Type not supported for Qiskit Aer");
331 return std::make_unique<Private::CompositeSimulator>(
335 return std::make_unique<Private::CompositeSimulator>(
340 throw std::invalid_argument(
"Distributed GPU supports only statevector");
341 return std::make_unique<Private::DistributedGpuSimulator>();
344 throw std::invalid_argument(
"Distributed MPI GPU supports only statevector");
345 return std::make_unique<Private::DistributedMpiGpuSimulator>();
356 auto sim = std::make_unique<Private::GpuSimulator>();
357 sim->Configure(
"gpu_device", std::to_string(ResolveGpuDevice()).c_str());
359 sim->Configure(
"method",
"matrix_product_state");
361 sim->Configure(
"method",
"matrix_product_operator");
363 sim->Configure(
"method",
"tensor_network");
365 sim->Configure(
"method",
"pauli_propagator");
367 sim->Configure(
"method",
"statevector");
369 sim->Configure(
"method",
"density_matrix");
378 throw std::invalid_argument(
379 "Simulation Type not supported for Quest Simulator");
380 else if (questLibrary && questLibrary->IsValid()) {
381 return std::make_unique<Private::QuestSimulator>();
388 throw std::invalid_argument(
"Simulator Type not supported");
static int GetGpuDeviceCount()
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
static bool IsGpuLibraryAvailable(int=-1)
static bool InitQuestLibrary()
static std::unique_ptr< ISimulator > CreateSimulatorUnique(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
static bool InitGpuLibrary()
static void SelectGpuDevice(int)
static bool InitQuestLibraryWithMute()
SimulationType
The type of simulation.
@ kExtendedStabilizer
Extended stabilizer simulation type.
@ kStatevector
statevector simulation type
@ kMatrixProductState
matrix product state simulation type
@ kDensityMatrix
Density matrix simulation type.
@ kStabilizer
Clifford gates simulation type.
@ kMatrixProductOperator
Matrix product operator simulation type.
@ kPauliPropagator
Pauli propagator simulation type.
@ kTensorNetwork
Tensor network simulation type.
@ kPathIntegral
Path integral simulation type.
SimulatorType
The type of simulator.
@ kCompositeQCSim
composite qcsim simulator type
@ kQCSim
qcsim simulator type
@ kQiskitAer
qiskit aer simulator type
@ kQuestSim
quest simulator type
@ kDistMpiGpuSim
state distributed across MPI ranks/GPUs
@ kCompositeQiskitAer
composite qiskit aer simulator type
@ kDistGpuSim
state distributed across local GPUs
@ kGpuSim
gpu simulator type