8#include "quest/include/quest.h"
17#include <unordered_map>
48static constexpr int NUM_QUBITS_IN_CACHE = 6;
50int getNumCachedQubits() {
51 return NUM_QUBITS_IN_CACHE;
60deployInfo getSupportedDeployments() {
66 bool omp = env.isMultithreaded;
67 bool mpi = env.isDistributed;
68 bool gpu = env.isGpuAccelerated;
75 if (gpu && omp && mpi) { out.push_back({
"GPU + OMP + MPI", 1, 1, 1});
if (one)
return out; }
76 if (gpu && mpi) { out.push_back({
"GPU + MPI", 1, 1, 0});
if (one)
return out; }
77 if (gpu && omp) { out.push_back({
"GPU + OMP", 0, 1, 1});
if (one)
return out; }
78 if (gpu) { out.push_back({
"GPU", 0, 1, 0});
if (one)
return out; }
79 if (mpi && omp) { out.push_back({
"CPU + OMP + MPI", 1, 0, 1});
if (one)
return out; }
80 if (mpi) { out.push_back({
"CPU + MPI", 1, 0, 0});
if (one)
return out; }
81 if (omp) { out.push_back({
"CPU + OMP", 0, 0, 1});
if (one)
return out; }
82 if (
true) { out.push_back({
"CPU", 0, 0, 0});
if (one)
return out; }
85 DEMAND( !out.empty() );
97quregCache createCachedStatevecsOrDensmatrs(
bool isDensMatr) {
102 for (
auto [label, mpi, gpu, omp] : getSupportedDeployments())
108void createCachedQuregs() {
111 DEMAND( statevecs1.empty() );
112 DEMAND( statevecs2.empty() );
113 DEMAND( densmatrs1.empty() );
114 DEMAND( densmatrs2.empty() );
116 statevecs1 = createCachedStatevecsOrDensmatrs(
false);
117 statevecs2 = createCachedStatevecsOrDensmatrs(
false);
118 densmatrs1 = createCachedStatevecsOrDensmatrs(
true);
119 densmatrs2 = createCachedStatevecsOrDensmatrs(
true);
122void destroyCachedQuregs() {
125 DEMAND( ! statevecs1.empty() );
126 DEMAND( ! statevecs2.empty() );
127 DEMAND( ! densmatrs1.empty() );
128 DEMAND( ! densmatrs2.empty() );
131 statevecs1, statevecs2,
132 densmatrs1, densmatrs2};
134 for (
auto& cache : caches)
135 for (
auto& [label, qureg]: cache)
144quregCache getCachedStatevecs() {
147 DEMAND( !statevecs1.empty() );
151quregCache getCachedDensmatrs() {
154 DEMAND( !densmatrs1.empty() );
159quregCache getAltCachedStatevecs() {
162 DEMAND( !statevecs2.empty() );
166quregCache getAltCachedDensmatrs() {
169 DEMAND( !densmatrs2.empty() );
180void createCachedFullStateDiagMatrs() {
183 DEMAND( matrices.empty() );
186 for (
auto [label, mpi, gpu, omp] : getSupportedDeployments())
190void destroyCachedFullStateDiagMatrs() {
193 DEMAND( !matrices.empty() );
195 for (
auto& [label, matrix]: matrices)
201matrixCache getCachedFullStateDiagMatrs() {
204 DEMAND( !matrices.empty() );
215qvector getRefStatevec() {
216 return getZeroVector(getPow2(NUM_QUBITS_IN_CACHE));
218qmatrix 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)
const int TEST_ALL_DEPLOYMENTS
qmatrix getZeroMatrix(size_t dim)