-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathadder_n10_cpu_omp.cpp
76 lines (65 loc) · 2.26 KB
/
adder_n10_cpu_omp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// ---------------------------------------------------------------------------
// DM-Sim: Density-Matrix Quantum Circuit Simulation Environement
// ---------------------------------------------------------------------------
// Ang Li, Senior Computer Scientist
// Pacific Northwest National Laboratory(PNNL), U.S.
// Homepage: http://www.angliphd.com
// GitHub repo: http://www.github.com/pnnl/DM-Sim
// PNNL-IPID: 31919-E, ECCN: EAR99, IR: PNNL-SA-143160
// BSD Lincese.
// ---------------------------------------------------------------------------
// File: adder_n10_cpu_omp.cpp
// A 10-qubit adder example based on OpenMP using CPU backend.
// ---------------------------------------------------------------------------
#include <stdio.h>
#include "../src/util_cpu.h"
#include "../src/dmsim_cpu_omp.hpp"
//Use the DMSim namespace to enable C++/CUDA APIs
using namespace DMSim;
//You can define circuit module functions as below.
void majority(Simulation &sim, const IdxType a, const IdxType b, const IdxType c)
{
sim.append(Simulation::CX(c, b));
sim.append(Simulation::CX(c, a));
sim.append(Simulation::CCX(a, b, c));
}
void unmaj(Simulation &sim, const IdxType a, const IdxType b, const IdxType c)
{
sim.append(Simulation::CCX(a, b, c));
sim.append(Simulation::CX(c, a));
sim.append(Simulation::CX(a, b));
}
int main()
{
//=================================== Initialization =====================================
srand(RAND_SEED);
int n_qubits = 10;
int n_cpus = 8;
//Obtain a simulator object
Simulation sim(n_qubits, n_cpus);
//Add the gates to the circuit
sim.append(Simulation::X(1));
sim.append(Simulation::X(5));
sim.append(Simulation::X(6));
sim.append(Simulation::X(7));
sim.append(Simulation::X(8));
//Call user-defined module functions
majority(sim, 0, 5, 1);
majority(sim, 1, 6, 2);
majority(sim, 2, 7, 3);
majority(sim, 3, 8, 4);
sim.append(Simulation::CX(4, 9));
unmaj(sim, 3, 8, 4);
unmaj(sim, 2, 7, 3);
unmaj(sim, 1, 6, 2);
unmaj(sim, 0, 5, 1);
//Upload to GPU, ready for execution
sim.upload();
//Run the simulation
sim.sim();
//Measure
auto* res = sim.measure(5);
print_measurement(res, n_qubits, 5);
delete res;
return 0;
}