79 static std::shared_ptr<DistributedGpuLibrary> GetDistributedGpuLibrary();
80 static std::shared_ptr<DistributedMpiGpuLibrary> GetDistributedMpiGpuLibrary();
81 static bool IsDistributedGpuAvailable()
noexcept;
82 static void FinalizeDistributedMpiGpuBackend();
84 static bool InitGpuLibraryWithMute();
88 static int ResolveGpuDevice(
int deviceId = -1);
91 static std::shared_ptr<GpuLibrary> GetGpuLibrary(
int deviceId = -1);
99 explicit ScopedGpuDevice(
int deviceId);
101 ScopedGpuDevice(
const ScopedGpuDevice &) =
delete;
102 ScopedGpuDevice &operator=(
const ScopedGpuDevice &) =
delete;
108 static std::unique_ptr<GpuLibStateVectorSim> CreateGpuLibStateVectorSim(
int deviceId = -1)
110 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
111 auto gpuLibrary = GetGpuLibrary(deviceId);
112 if (!gpuLibrary || !gpuLibrary->IsValid())
115 return std::make_unique<GpuLibStateVectorSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
118 static std::unique_ptr<GpuDensityMatrix> CreateGpuDensityMatrix(
int deviceId = -1)
120 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
121 auto gpuLibrary = GetGpuLibrary(deviceId);
122 if (!gpuLibrary || !gpuLibrary->HasDensityMatrixAPI())
124 return std::make_unique<GpuDensityMatrix>(gpuLibrary, gpuLibrary->GetCreationDevice());
127 static std::unique_ptr<GpuMPO> CreateGpuMPO(
int deviceId = -1)
129 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
130 auto gpuLibrary = GetGpuLibrary(deviceId);
131 if (!gpuLibrary || !gpuLibrary->HasMPOAPI())
133 return std::make_unique<GpuMPO>(gpuLibrary, gpuLibrary->GetCreationDevice());
136 static std::unique_ptr<GpuLibMPSSim> CreateGpuLibMPSSim(
int deviceId = -1)
138 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
139 auto gpuLibrary = GetGpuLibrary(deviceId);
140 if (!gpuLibrary || !gpuLibrary->IsValid())
143 return std::make_unique<GpuLibMPSSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
146 static std::unique_ptr<GpuLibTNSim> CreateGpuLibTensorNetSim(
int deviceId = -1)
148 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
149 auto gpuLibrary = GetGpuLibrary(deviceId);
150 if (!gpuLibrary || !gpuLibrary->IsValid())
153 return std::make_unique<GpuLibTNSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
156 static std::shared_ptr<GpuStabilizer> CreateGpuStabilizerSimulator(
int deviceId = -1)
158 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
159 auto gpuLibrary = GetGpuLibrary(deviceId);
160 if (!gpuLibrary || !gpuLibrary->IsValid())
162 return std::make_shared<GpuStabilizer>(gpuLibrary, gpuLibrary->GetCreationDevice());
165 static std::shared_ptr<GpuPauliPropagator> CreateGpuPauliPropagatorSimulator(
int deviceId = -1)
167 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
168 auto gpuLibrary = GetGpuLibrary(deviceId);
169 if (!gpuLibrary || !gpuLibrary->IsValid())
171 return std::make_shared<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
174 static std::unique_ptr<GpuPauliPropagator> CreateGpuPauliPropagatorSimulatorUnique(
int deviceId = -1)
176 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
177 auto gpuLibrary = GetGpuLibrary(deviceId);
178 if (!gpuLibrary || !gpuLibrary->IsValid())
180 return std::make_unique<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
184 static std::atomic_int requestedGpuDeviceId;
185 static thread_local int scopedGpuDeviceId;
215 return std::make_shared<PathIntegralSimulator>();
219 static std::shared_ptr<QuestLibSim> questLibrary;
220 static std::atomic_bool firstTimeQuest;