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 createCachedStatevecsOrDensmatrs(
bool isDensMatr) {
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 statevecs1 = createCachedStatevecsOrDensmatrs(
false);
114 statevecs2 = createCachedStatevecsOrDensmatrs(
false);
115 densmatrs1 = createCachedStatevecsOrDensmatrs(
true);
116 densmatrs2 = createCachedStatevecsOrDensmatrs(
true);
119void destroyCachedQuregs() {
122 DEMAND( ! statevecs1.empty() );
123 DEMAND( ! statevecs2.empty() );
124 DEMAND( ! densmatrs1.empty() );
125 DEMAND( ! densmatrs2.empty() );
128 statevecs1, statevecs2,
129 densmatrs1, densmatrs2};
131 for (
auto& cache : caches)
132 for (
auto& [label, qureg]: cache)
141quregCache getCachedStatevecs() {
144 DEMAND( !statevecs1.empty() );
148quregCache getCachedDensmatrs() {
151 DEMAND( !densmatrs1.empty() );
156quregCache getAltCachedStatevecs() {
159 DEMAND( !statevecs2.empty() );
163quregCache getAltCachedDensmatrs() {
166 DEMAND( !densmatrs2.empty() );
177void createCachedFullStateDiagMatrs() {
180 DEMAND( matrices.empty() );
183 for (
auto [label, mpi, gpu, omp] : getSupportedDeployments())
187void destroyCachedFullStateDiagMatrs() {
190 DEMAND( !matrices.empty() );
192 for (
auto& [label, matrix]: matrices)
198matrixCache getCachedFullStateDiagMatrs() {
201 DEMAND( !matrices.empty() );
212qvector getRefStatevec() {
213 return getZeroVector(getPow2(getNumCachedQubits()));
215qmatrix 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)