68 static std::shared_ptr<DistributedGpuLibrary> GetDistributedGpuLibrary();
69 static std::shared_ptr<DistributedMpiGpuLibrary> GetDistributedMpiGpuLibrary();
70 static bool IsDistributedGpuAvailable()
noexcept;
71 static void FinalizeDistributedMpiGpuBackend();
73 static bool InitGpuLibraryWithMute();
77 static int ResolveGpuDevice(
int deviceId = -1);
80 static std::shared_ptr<GpuLibrary> GetGpuLibrary(
int deviceId = -1);
85 class ScopedGpuDevice {
87 explicit ScopedGpuDevice(
int deviceId);
89 ScopedGpuDevice(
const ScopedGpuDevice&) =
delete;
90 ScopedGpuDevice& operator=(
const ScopedGpuDevice&) =
delete;
95 static std::unique_ptr<GpuLibStateVectorSim> CreateGpuLibStateVectorSim(
int deviceId = -1) {
96 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
97 auto gpuLibrary = GetGpuLibrary(deviceId);
98 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
100 return std::make_unique<GpuLibStateVectorSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
103 static std::unique_ptr<GpuDensityMatrix> CreateGpuDensityMatrix(
int deviceId = -1) {
104 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
105 auto gpuLibrary = GetGpuLibrary(deviceId);
106 if (!gpuLibrary || !gpuLibrary->HasDensityMatrixAPI())
return nullptr;
107 return std::make_unique<GpuDensityMatrix>(gpuLibrary, gpuLibrary->GetCreationDevice());
110 static std::unique_ptr<GpuMPO> CreateGpuMPO(
int deviceId = -1) {
111 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
112 auto gpuLibrary = GetGpuLibrary(deviceId);
113 if (!gpuLibrary || !gpuLibrary->HasMPOAPI())
return nullptr;
114 return std::make_unique<GpuMPO>(gpuLibrary, gpuLibrary->GetCreationDevice());
117 static std::unique_ptr<GpuLibMPSSim> CreateGpuLibMPSSim(
int deviceId = -1) {
118 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
119 auto gpuLibrary = GetGpuLibrary(deviceId);
120 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
122 return std::make_unique<GpuLibMPSSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
125 static std::unique_ptr<GpuLibTNSim> CreateGpuLibTensorNetSim(
int deviceId = -1) {
126 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
127 auto gpuLibrary = GetGpuLibrary(deviceId);
128 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
130 return std::make_unique<GpuLibTNSim>(gpuLibrary, gpuLibrary->GetCreationDevice());
133 static std::shared_ptr<GpuStabilizer> CreateGpuStabilizerSimulator(
int deviceId = -1) {
134 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
135 auto gpuLibrary = GetGpuLibrary(deviceId);
136 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
137 return std::make_shared<GpuStabilizer>(gpuLibrary, gpuLibrary->GetCreationDevice());
140 static std::shared_ptr<GpuPauliPropagator>
141 CreateGpuPauliPropagatorSimulator(
int deviceId = -1) {
142 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
143 auto gpuLibrary = GetGpuLibrary(deviceId);
144 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
145 return std::make_shared<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
148 static std::unique_ptr<GpuPauliPropagator>
149 CreateGpuPauliPropagatorSimulatorUnique(
int deviceId = -1) {
150 auto initializationLock = GpuLibrary::GetInstance()->LockInitialization();
151 auto gpuLibrary = GetGpuLibrary(deviceId);
152 if (!gpuLibrary || !gpuLibrary->IsValid())
return nullptr;
153 return std::make_unique<GpuPauliPropagator>(gpuLibrary, gpuLibrary->GetCreationDevice());
157 static std::atomic_int requestedGpuDeviceId;
158 static thread_local int scopedGpuDeviceId;
173 return questLibrary && questLibrary->IsValid();
177 if (!questLibrary || !questLibrary->IsValid())
return nullptr;
182 return std::make_shared<PathIntegralSimulator>();
186 static std::shared_ptr<QuestLibSim> questLibrary;
187 static std::atomic_bool firstTimeQuest;