1 //---------------------------------------------------------------------------
2 // Base Class of CalcUnit
3 //---------------------------------------------------------------------------
5 //---------------------------------------------------------------------------
8 int QCalcUnit::gNqubits;
9 int QCalcUnit::gProcMask;
10 int QCalcUnit::gProcBit;
12 int QCalcUnit::gNumprocs;
15 //---------------------------------------------------------------------------
20 QCalcUnit::insert0(unsigned int i0, unsigned int BitNum) {
21 unsigned int msk = (1<<BitNum) -1;
22 return ((~msk & i0) << 1) | (msk & i0);
24 //---------------------------------------------------------------------------
29 QCalcUnit::insert1(unsigned int i0, unsigned int BitNum) {
30 unsigned int msk = (1<<BitNum) -1;
31 return ((~msk & i0) << 1) | (1 << BitNum) | (msk & i0);
34 //---------------------------------------------------------------------------
35 // for MPI calculation
36 //---------------------------------------------------------------------------
38 //---------------------------------------------------------------------------
43 QCalcUnit::initmpi(int N, int myid, int numprocs) {
44 // numproc must be a power of 2.
53 gMdata = 1 << (N - gProcBit);
55 gProcMask = (gNumprocs - 1) << (N-gProcBit);
59 //---------------------------------------------------------------------------
61 QCalcUnit::getOriginalID(int id){
62 return gMyID << ((gNqubits-gProcBit))|id;
64 //----------------------------------------------------------------------------
66 QCalcUnit::getProcFromID(int id){
67 return (id >> (gNqubits - gProcBit));
69 //----------------------------------------------------------------------------
71 QCalcUnit::initdata(double R[], double I[]) {
72 for (int i = 0; i < gMdata; i++) {
80 //----------------------------------------------------------------------------
85 QCalcUnit::showdata(double R[], double I[]) {
86 for (int i = 0; i < gMdata; i++) {
87 printf("proc=%3d: idx = %03d:%f,%f\n",
88 gMyID, getOriginalID(i), R[i], I[i]);
91 //----------------------------------------------------------------------------
93 * Common procedure to prepare data
95 * true: need to store data
96 * false: don't need to store
99 QCalcUnit::setup(const double R[], const double I[],
100 const unsigned int &ix0, const unsigned int &ix1,
101 double &r0, double &i0,
102 double &r1, double &i1) {
107 unsigned int idx0 = ix0 & ((1<<(gNqubits-gProcBit))-1);
108 unsigned int idx1 = ix1 & ((1<<(gNqubits-gProcBit))-1);
110 int p0 = getProcFromID(ix0);
111 int p1 = getProcFromID(ix1);
114 // Communication with MPI
116 if (p0 != gMyID && p1 != gMyID) {
120 if (p0 == gMyID && p1 == gMyID) {
127 if (p0 == gMyID && p1 != gMyID) {
129 MPI_Isend(&r0, 1, MPI_DOUBLE, p1, TAG,MPI_COMM_WORLD,&req);
130 MPI_Irecv(&r1, 1, MPI_DOUBLE, p1, TAG, MPI_COMM_WORLD, &req);
131 MPI_Wait(&req, &status);
134 MPI_Isend(&i0, 1, MPI_DOUBLE, p1, TAG, MPI_COMM_WORLD, &req);
135 MPI_Irecv(&i1, 1, MPI_DOUBLE, p1, TAG, MPI_COMM_WORLD, &req);
136 MPI_Wait(&req, &status);
138 if (p0 != gMyID && p1 == gMyID) {
140 MPI_Isend(&r1, 1, MPI_DOUBLE, p0, TAG, MPI_COMM_WORLD, &req);
141 MPI_Irecv(&r0, 1, MPI_DOUBLE, p0, TAG, MPI_COMM_WORLD, &req);
142 MPI_Wait(&req, &status);
145 MPI_Isend(&i1, 1, MPI_DOUBLE, p0, TAG, MPI_COMM_WORLD, &req);
146 MPI_Irecv(&i0, 1, MPI_DOUBLE, p0, TAG, MPI_COMM_WORLD, &req);
147 MPI_Wait(&req, &status);
151 //----------------------------------------------------------------------------
153 * Common procedure to store data
155 void QCalcUnit::store(double R[], double I[],
156 const unsigned int &ix0, const unsigned int &ix1,
157 const double &r0, const double &i0,
158 const double &r1, const double &i1) {
159 int p0 = getProcFromID(ix0);
160 int p1 = getProcFromID(ix1);
161 unsigned int idx0 = ix0 & ((1<<(gNqubits-gProcBit))-1);
162 unsigned int idx1 = ix1 & ((1<<(gNqubits-gProcBit))-1);
173 //----------------------------------------------------------------------------