18#include <unordered_map>
40int getNumCachedQubits() {
48 return getNumQubitsInUnitTestedQuregs();
57deployInfo getSupportedDeployments() {
63 bool omp = env.isMultithreaded;
64 bool mpi = env.isDistributed;
65 bool gpu = env.isGpuAccelerated;
68 bool one = ! getWhetherToTestAllDeployments();
72 if (gpu && omp && mpi) { out.push_back({
"GPU + OMP + MPI", 1, 1, 1});
if (one)
return out; }
73 if (gpu && mpi) { out.push_back({
"GPU + MPI", 1, 1, 0});
if (one)
return out; }
74 if (gpu && omp) { out.push_back({
"GPU + OMP", 0, 1, 1});
if (one)
return out; }
75 if (gpu) { out.push_back({
"GPU", 0, 1, 0});
if (one)
return out; }
76 if (mpi && omp) { out.push_back({
"CPU + OMP + MPI", 1, 0, 1});
if (one)
return out; }
77 if (mpi) { out.push_back({
"CPU + MPI", 1, 0, 0});
if (one)
return out; }
78 if (omp) { out.push_back({
"CPU + OMP", 0, 0, 1});
if (one)
return out; }
79 if (
true) { out.push_back({
"CPU", 0, 0, 0});
if (one)
return out; }
82 DEMAND( !out.empty() );
94quregCache createCustomCachedQuregs(
int numQubits,
bool isDensityMatrix) {
99 for (
auto [label, mpi, gpu, omp] : getSupportedDeployments())
105void createCachedQuregs() {
108 DEMAND( statevecs1.empty() );
109 DEMAND( statevecs2.empty() );
110 DEMAND( densmatrs1.empty() );
111 DEMAND( densmatrs2.empty() );
113 int numQubits = getNumCachedQubits();
114 statevecs1 = createCustomCachedQuregs(numQubits,
false);
115 statevecs2 = createCustomCachedQuregs(numQubits,
false);
116 densmatrs1 = createCustomCachedQuregs(numQubits,
true);
117 densmatrs2 = createCustomCachedQuregs(numQubits,
true);
120void destroyCustomCachedQuregs(quregCache& cache) {
121 for (
auto& [label, qureg]: cache)
125void destroyCachedQuregs() {
128 DEMAND( ! statevecs1.empty() );
129 DEMAND( ! statevecs2.empty() );
130 DEMAND( ! densmatrs1.empty() );
131 DEMAND( ! densmatrs2.empty() );
133 std::vector<quregCache> caches = {
134 statevecs1, statevecs2,
135 densmatrs1, densmatrs2};
137 for (
auto& cache : caches)
138 destroyCustomCachedQuregs(cache);
146quregCache getCachedStatevecs() {
149 DEMAND( !statevecs1.empty() );
153quregCache getCachedDensmatrs() {
156 DEMAND( !densmatrs1.empty() );
161quregCache getAltCachedStatevecs() {
164 DEMAND( !statevecs2.empty() );
168quregCache getAltCachedDensmatrs() {
171 DEMAND( !densmatrs2.empty() );
176Qureg getArbitraryCachedStatevec() {
179 DEMAND( !statevecs1.empty() );
181 return statevecs1.begin()->second;
184Qureg getArbitraryCachedDensmatr() {
187 DEMAND( !densmatrs1.empty() );
189 return densmatrs1.begin()->second;
198void createCachedFullStateDiagMatrs() {
201 DEMAND( matrices.empty() );
204 for (
auto [label, mpi, gpu, omp] : getSupportedDeployments())
208void destroyCachedFullStateDiagMatrs() {
211 DEMAND( !matrices.empty() );
213 for (
auto& [label, matrix]: matrices)
219matrixCache getCachedFullStateDiagMatrs() {
222 DEMAND( !matrices.empty() );
233qvector getRefStatevec() {
234 return getZeroVector(getPow2(getNumCachedQubits()));
236qmatrix getRefDensmatr() {
FullStateDiagMatr createCustomFullStateDiagMatr(int numQubits, int useDistrib, int useGpuAccel, int useMultithread)
void destroyFullStateDiagMatr(FullStateDiagMatr matrix)
Qureg createCustomQureg(int numQubits, int isDensMatr, int useDistrib, int useGpuAccel, int useMultithread)
void destroyQureg(Qureg qureg)
qmatrix getZeroMatrix(size_t dim)