From 24ae4452eb705d5803df54744b22ea887feaafc4 Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Thu, 21 Mar 2024 01:32:40 -0400 Subject: [PATCH] Thu Mar 21 01:32:40 AM EDT 2024 --- Makefile | 3 + bin/QAnsel | Bin 186432 -> 143768 bytes build.sh | 48 +- .../{belltest_c.txt => chsh_inequality_c.txt} | 0 .../{belltest_q.txt => chsh_inequality_q.txt} | 14 +- examples/slow.txt | 19 +- obj/bytecode.o | Bin 0 -> 58832 bytes obj/complex.o | Bin 0 -> 53480 bytes obj/context.o | Bin 0 -> 9808 bytes obj/display.o | Bin 0 -> 12184 bytes obj/hardware.o | Bin 0 -> 2104 bytes obj/kernel_cpu.o | Bin 0 -> 3192 bytes obj/main.o | Bin 0 -> 13744 bytes obj/openqasm.o | Bin 0 -> 44968 bytes src/.kernel.tmp.1 | 145 ++++++ src/.kernel.tmp.2 | Bin 0 -> 5188 bytes src/bytecode.c | 7 +- src/bytecode.h | 145 ++++++ src/bytecode.o | Bin 0 -> 58832 bytes src/complex.c | 29 +- src/complex.h | 101 ++++ src/complex.o | Bin 0 -> 49344 bytes src/context.c | 1 + src/context.h | 26 ++ src/context.o | Bin 0 -> 9808 bytes src/display.c | 4 + src/display.h | 11 + src/display.o | Bin 0 -> 12184 bytes src/finaldone | Bin 0 -> 143600 bytes src/gates.c | 53 --- src/hardware.c | 2 + src/hardware.h | 20 + src/hardware.o | Bin 0 -> 1848 bytes src/interface.html | 40 -- src/kernel.cl | 2 + src/kernel.h | 48 ++ src/kernel_cpu.c | 150 ++++++ src/kernel_cpu.cl | 150 ++++++ src/kernel_cpu.o | Bin 0 -> 3192 bytes src/kernel_gpu.c | 436 ++++++++++++++++++ src/kernel_gpu.cl | 436 ++++++++++++++++++ src/main.c | 2 +- src/main.h | 11 + src/main.o | Bin 0 -> 13744 bytes src/openqasm.c | 2 + src/openqasm.h | 18 + src/openqasm.o | Bin 0 -> 44968 bytes src/qansel.h | 72 --- 48 files changed, 1751 insertions(+), 244 deletions(-) rename examples/{belltest_c.txt => chsh_inequality_c.txt} (100%) rename examples/{belltest_q.txt => chsh_inequality_q.txt} (87%) create mode 100644 obj/bytecode.o create mode 100644 obj/complex.o create mode 100644 obj/context.o create mode 100644 obj/display.o create mode 100644 obj/hardware.o create mode 100644 obj/kernel_cpu.o create mode 100644 obj/main.o create mode 100644 obj/openqasm.o create mode 100644 src/.kernel.tmp.1 create mode 100644 src/.kernel.tmp.2 create mode 100644 src/bytecode.h create mode 100644 src/bytecode.o create mode 100644 src/complex.h create mode 100644 src/complex.o create mode 100644 src/context.h create mode 100644 src/context.o create mode 100644 src/display.h create mode 100644 src/display.o create mode 100755 src/finaldone delete mode 100644 src/gates.c create mode 100644 src/hardware.h create mode 100644 src/hardware.o delete mode 100644 src/interface.html create mode 100644 src/kernel.h create mode 100644 src/kernel_cpu.c create mode 100644 src/kernel_cpu.cl create mode 100644 src/kernel_cpu.o create mode 100644 src/kernel_gpu.c create mode 100644 src/kernel_gpu.cl create mode 100644 src/main.h create mode 100644 src/main.o create mode 100644 src/openqasm.h create mode 100644 src/openqasm.o diff --git a/Makefile b/Makefile index 29c84d5..3683099 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,9 @@ all: simple: sh build.sh simple +cl: + sh build.sh cl + commit: git add src/ examples/ Makefile build.sh git commit -m "`date`" diff --git a/bin/QAnsel b/bin/QAnsel index 347663844e56a383667a53a3863b25cce2464905..f6ac158f043c105a25dd0835276ddb033820d61d 100755 GIT binary patch delta 33291 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 diff --git a/build.sh b/build.sh index f2c500d..47d8c03 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,5 @@ #!/bin/sh -echo "$1" - echo "Verifying build commands exist..." for i in cat grep sed xxd gcc rm printf uname do @@ -13,27 +11,49 @@ do done echo "Verified." echo "Building..." -cat src/kernel.cl | grep -vi '{gpu_only}' | sed -e 's/__global //' -e 's/__kernel //' > src/kernel_cpu.cl +cat src/kernel.cl | grep -vi '{gpu_only}' | sed -e 's/__global //' -e 's/__kernel //' > src/kernel_cpu.c cat src/kernel.cl | grep -vi '{cpu_only}' > src/.kernel.tmp.1 tmp="$(cat src/.kernel.tmp.1)" printf "%s\0" "$tmp" > src/.kernel.tmp.2 -xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl +xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' -e 's/unsigned/static unsigned/' > src/kernel_gpu.c +if [ "$1" = "cl" ] +then + exit +fi + +#check if x86_64 x86="" if [ "$(uname -m)" = "x86_64" ] then x86=" -D__x86_64__" fi + if [ "$1" = "simple" ] then - bcmd="gcc src/main.c -g -o bin/QAnsel -lm$x86" -else - bcmd="gcc src/main.c -g -o bin/QAnsel -lm$x86 -D__PTHREAD__ -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread" -fi -echo "$bcmd" -if $($bcmd) -then - echo "Built." + cflags="-I/usr/include/SDL2" else - echo "Failed." + cflags="-I/usr/include/SDL2 -D__PTHREAD__ -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT" fi -rm -f src/.kernel* src/kernel_* \ No newline at end of file + +cd src/ + +rm -r ../obj 2>/dev/null +mkdir ../obj 2>/dev/null + +fcmd="gcc -o ../bin/QAnsel" +for i in complex context display hardware bytecode openqasm main +do + bcmd="gcc $i.c -c -o ../obj/$i.o $cflags" + echo "$bcmd" + $($bcmd) + fcmd="$fcmd $i.o" +done +bcmd="gcc kernel_cpu.c -c -o ../obj/kernel_cpu.o $cflags" && echo "$bcmd" && $($bcmd) +echo $bcmd +$($bcmd) + + +cd ../obj +fcmd="$fcmd kernel_cpu.o -lm -D_REENTRANT -lSDL2 -lOpenCL -pthread" +echo "$fcmd" +$($fcmd) diff --git a/examples/belltest_c.txt b/examples/chsh_inequality_c.txt similarity index 100% rename from examples/belltest_c.txt rename to examples/chsh_inequality_c.txt diff --git a/examples/belltest_q.txt b/examples/chsh_inequality_q.txt similarity index 87% rename from examples/belltest_q.txt rename to examples/chsh_inequality_q.txt index 8dab919..815e7c2 100644 --- a/examples/belltest_q.txt +++ b/examples/chsh_inequality_q.txt @@ -1,3 +1,4 @@ +//CHSH Inequality Bell Test qreg q[3]; creg c[4]; @@ -9,59 +10,48 @@ measure q[0] -> c[0]; measure q[1] -> c[1]; reset q[0]; reset q[1]; -barrier q; //Two players are also provided // an entangled qubit. h q[0]; cx q[0], q[1]; -barrier q; //Player X strategy //if(c[0]==0) do nothing if(c[0]==1) ry(pi/2) q[0]; -barrier q; //Player Y strategy if(c[1]==0) ry(pi/4) q[1]; if(c[1]==1) ry(-pi/4) q[1]; -barrier q; //Transfer to host measure q[0] -> c[2]; measure q[1] -> c[3]; -barrier q; //a xor b cx q[0], q[1]; measure q[1] -> c[3]; -barrier q; //Load x and y reset q[0]; if(c[0]==1) x q[0]; reset q[1]; if(c[1]==1) x q[1]; -barrier q; //x and y ccx q[0], q[1], q[2]; measure q[2] -> c[2]; -barrier q; //Load (a xor b) and (x and y) reset q[0]; if(c[2]==1) x q[0]; reset q[1]; if(c[3]==1) x q[1]; -barrier q; //(a xor b) = (x and y) cx q[0], q[1]; x q[1]; -barrier q; //Store final results measure q[1] -> c[0]; - -sample c[0]; \ No newline at end of file +sample c[0]; diff --git a/examples/slow.txt b/examples/slow.txt index 65eb3a9..6397512 100644 --- a/examples/slow.txt +++ b/examples/slow.txt @@ -1,20 +1,3 @@ -//This normally runs really slow and thus is a good -// illustration of how to use various optimization -// settings. -// -o 0 No optimization -// -o 1 Threads -// -o 2 GPU -// -o 3 Threads+GPU -// -o 4 Queue -// -o 5 Queue+Threads -// -o 6 Queue+GPU -// -o 7 Queue+Threads+GPU -// -//The command queue will group together all -// consecutive single-qubit instructions. This -// program will run almost as fast as if there is -// just a single instruction. - qreg q[12]; h q[0]; x q[1]; @@ -28,4 +11,4 @@ x q[8]; x q[9]; x q[10]; x q[11]; -born q; \ No newline at end of file +born q; diff --git a/obj/bytecode.o b/obj/bytecode.o new file mode 100644 index 0000000000000000000000000000000000000000..4379a3f3e76fdfd53cd90e84ce7d9dabf99f836a GIT binary patch literal 58832 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 literal 0 HcmV?d00001 diff --git a/obj/complex.o b/obj/complex.o new file mode 100644 index 0000000000000000000000000000000000000000..41776dd0f1fb1eedabf115c97919a03f26fdf97f GIT binary patch literal 53480 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 literal 0 HcmV?d00001 diff --git a/obj/context.o b/obj/context.o new file mode 100644 index 0000000000000000000000000000000000000000..83f557e3c0c86a8d3288ad79270510e51d89fbf9 GIT binary patch literal 9808 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 SFc-$z|3Lb0a+c^%xBm}VV>CJd literal 0 HcmV?d00001 diff --git a/obj/display.o b/obj/display.o new file mode 100644 index 0000000000000000000000000000000000000000..8e7c04be660548d8573cb15327e95d0c045f13a2 GIT binary patch literal 12184 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 literal 0 HcmV?d00001 diff --git a/obj/hardware.o b/obj/hardware.o new file mode 100644 index 0000000000000000000000000000000000000000..9057ffc98fb474806b47306b69958f251535e105 GIT binary patch literal 2104 zcmb`I&r1|h9KheGshOooM4*Sc7)Cj)QXnF+wyh2&3YCW-8^_(*6x|)0nMIADVjvIMwS z9oBQr!cX0NoveJqM6+0yxn?O@F<18EH+lq^2d1`f7L!#lt6$}Ycgx8`jNj>i=_6V_ z?~C7y`NLB3aJSl5sAy(sfnv>`a@GIM`3rjxTmuo)iNv@*bkkW{v2*&!s4;59hDWYm zB2%2hsvz2vJ3`y+)%v?TI^V$I2Y}%~>BVXCOz+E<#Oe0i5CBW`O&|x6n*AH0|3Td? zuAyfCdgy;j{wq=cWT7F>E8-uB z^L>hC+e>fQo@1m$%JrOto6iMCOgy%8zO!ao)*~md&;b*8gumsd++2qJikGsG1}j-d zfPvc0r0p$E;SDX%&ZR9szrOBzfs=0P7NU#Ji+yc}@drOvkn_Y_K;x}2A0&?P_`sN7 zCa%Vh9K*T)9AB+(Tbnv2-X@Owo`k{s>cp`Q4wg6>%=s=C70&nmT;Y7b+Y0CV6^6f+ z4eTY*fmhedYI)*Npz@#ZxHV^DsfuuMj_Z38hin_*kg*DauPW7NvM8){sA&Zfp73b>=NOL~xao}u6Lx-BdCb4tGqTeLe;e7eW zg@AR?ltgH4O&|mmYF2YG| T%h@nA3@{mEh7L2xF9x~(aJNKOA=C0|c9=PXz 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 literal 0 HcmV?d00001 diff --git a/obj/openqasm.o b/obj/openqasm.o new file mode 100644 index 0000000000000000000000000000000000000000..46135d258be73aa5bb6516905d6f48a18609970c GIT binary patch literal 44968 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 XuyUwf;!t0E3Z-b8mu;-ITL1q69TO7b literal 0 HcmV?d00001 diff --git a/src/.kernel.tmp.1 b/src/.kernel.tmp.1 new file mode 100644 index 0000000..52960f9 --- /dev/null +++ b/src/.kernel.tmp.1 @@ -0,0 +1,145 @@ + +__kernel void kernel_dot +( + __global float* ptrR, + __global float* ptrA, + __global float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB +) +{ + const int rowsR = rowsA; + const int colsR = colsB; + const int rowR = get_global_id(0); //{gpu_only} + const int colR = get_global_id(1); //{gpu_only} + + float rR = 0; + float iR = 0; + + for (int i = 0; i < colsA; i++) + { + const float rA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2)]; + const float iA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2) + (size_t)1]; + const float rB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2)]; + const float iB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + + rR += first + lasts; + iR += outer + inner; + } + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2)] = rR; + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1] = iR; +} + +__kernel void kernel_knk +( + __global float* ptrR, + __global float* ptrA, + __global float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB +) +{ + const int rowsR = rowsA * rowsB; + const int colsR = colsA * colsB; + const int rowR = get_global_id(0); //{gpu_only} + for (int colR = 0; colR < colsR; colR++) + { + const int rowA = rowR / rowsB; + const int colA = colR / colsB; + const int rowB = rowR % rowsB; + const int colB = colR % colsB; + + const int posA = rowA * (colsA * 2) + (colA * 2); + const int posB = rowB * (colsB * 2) + (colB * 2); + + const float rA = ptrA[posA]; + const float iA = ptrA[posA + 1]; + const float rB = ptrB[posB]; + const float iB = ptrB[posB + 1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + ptrR[rowR * (colsR * 2) + (colR * 2)] = first + lasts; + ptrR[rowR * (colsR * 2) + (colR * 2) + 1] = outer + inner; + } +} + +__kernel void kernel_knk_2x2 +( + __global float* ptrR, + __global float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7 +) +{ + const int rowsR = rowsA * 2; + const int colsR = colsA * 2; + const int rowR = get_global_id(0) * 2; //{gpu_only} + + for (int colR = 0; colR < colsR; colR += 2) + { + const int rowA = rowR / 2; + const int colA = colR / 2; + const float rA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2)]; + const float iA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2) + (size_t)1]; + + for (int i = 0; i < 4; i++) + { + float rB, iB; + switch (i) + { + case 0: rB = gate0; iB = gate1; break; + case 1: rB = gate2; iB = gate3; break; + case 2: rB = gate4; iB = gate5; break; + case 3: rB = gate6; iB = gate7; break; + } + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + switch (i) + { + case 0: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 1: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 2: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 3: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + } + + } + } +} diff --git a/src/.kernel.tmp.2 b/src/.kernel.tmp.2 new file mode 100644 index 0000000000000000000000000000000000000000..c0f9568fd58d3f5e95433b7a0948709e24f69166 GIT binary patch literal 5188 zcmds4OK+P%5bl{@v6n~?N3y|rNO5z3pWtg1A;%%k$_OGLP20%-y)&~97T6_;Ory43 zZ05D|{C4otbe~m4mb33Azh~lqdS5o4?=g7NbeETRo18u5<)%4hPffKxb8%uPClQ=& zS=0^VMZ>D{rIz9?aa-m?B1#U_Q8MuY@0DC>Euiq4-3arm9ut+2Ny>dDXd-WyH8SFq z-}{ST#pd(Z-P3bg7WvP^(BM!fwCRu{rI1yqvJl4$3YQciR94K#3~>^JpReR_ykdMd z3rI#pjpY%MOT#f}Kz-tGe$9VnX%kRPr_5LHlwSq}$&UgyYq`9`xfLGv58;y@g2zi= zLdStsBBDxkROF{pqgr+xH$wvMy2ErF!Y4hX7ZsHZ^EjXTRSZlX2R?)ae-cs8ev%(} z1!DqT9E0;!Vy{H`++>v!;tnBR6eI*?b6d(cbyI^S5<*MbW9Ze{4HNFn7|FHHK-&US zxB;=?NrEZH1d&45%+`tB%8Zu{<6H~tQ`+rR3Nrv_96Zm8iTh&zA7CQ30RpPXWec1* zM+id-B51DqLhr}O2ZdrZfrxi#c`dPQE#6#kChrGC8ai=qy4=nRih)rSBinOwelQ5q z8csM_I~lcxVr1<^S<}PNChMuJrE@q|KFGuSDHCu?F5!#FUe{mHl#V1y6aQ#U@nTG% z9pKRc7nEs$CNF2~ZD2*GT-G!&lIOyj&d5IlXjlY%2s@|?WZ4jdbn?Z^Ep&hb@!q2j zkP@N^D=v;;OB(%%j=-0;IU&5^5=AX)?qFhN*ln6@VJC-na%3kj?c{Si`NB@Vw3Dyi z+Vil6eW=2KO*|V2P!|mMJ+jr^`KaCB1!#C5M)nnLh-uOzY|FNI1RfgC1|lPi9wCvr z6%oO@=t+c9!cpKFehno`6q0t#Ii2g)06CppW9L0L_Fc@;t41AslZi;qV25gP7CH3` zZ?=!HLbt0GlDq0i*>38LEv{j|f@!5efD_gKaK-MbY_sp$)@q@l78z>Gaka=$!}!!` z7vpM6L+#Q~yRxbQ#-N|-8O3N6GH)2?;@KB;E}wlt=K|Un94w(Ipq`HwwUYs5L@bU* zE5rV(KR*@$On&D>$+Dg*T^OLDt{%0K3q-kszn|rf5v1#4GTj<)`_D~mNJaT;65DfU z!o)_`A5X0C#%M{n?*^at2Kx_p?1b)2nAqhfC$`rjQ$WEniS4;_d}58uMSSHSyu+8@ Dk9?U! literal 0 HcmV?d00001 diff --git a/src/bytecode.c b/src/bytecode.c index 0ca140f..6577ebc 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1,9 +1,4 @@ -typedef struct -{ - char n[128]; - unsigned char q0, q1, q2; - float arg0, arg1, arg2; -} QInstr; +#include "bytecode.h" const char* qansel_instruction_to_string(unsigned char instr) { diff --git a/src/bytecode.h b/src/bytecode.h new file mode 100644 index 0000000..f562277 --- /dev/null +++ b/src/bytecode.h @@ -0,0 +1,145 @@ +#ifndef __BYTECODE_H__ +#define __BYTECODE_H__ + +#include +#include "complex.h" +#include "context.h" +#include "display.h" + +typedef struct +{ + char n[128]; + unsigned char q0, q1, q2; + float arg0, arg1, arg2; +} QInstr; + +typedef struct +{ + int size; + unsigned char bytes[16]; + int barrier_width; + unsigned char barrier[QANSEL_QUBITS_MAX * 2]; + int next; + int prev; + int checked; + int op; + unsigned char ifop[16]; + int use_ifop; +} QBytecode; + +static float Identity[] = +{ + 1, 0, 0, 0, + 0, 0, 1, 0, +}; + +static float PauliX[] = +{ + 0, 0, 1, 0, + 1, 0, 0, 0, +}; + +static float PauliY[] = +{ + 0, 0, 0, 1, + 0,-1, 0, 0, +}; + +static float PauliZ[] = +{ + 1, 0, 0, 0, + 0, 0, -1, 0, +}; + +// 1/sqrt(2) +#define R 0.7071067811865475 +static float Hadamard[] = +{ + R, 0, R, 0, + R, 0, -R, 0, +}; + +static float PhaseS[] = +{ + 1, 0, 0, 0, + 0, 0, 0,-1, +}; + +// 1/sqrt(2) + 1/sqrt(2)i +static float PhaseT[] = +{ + 1, 0, 0, 0, + 0, 0, R,-R, +}; + +static float ControlledNOT[] = +{ + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, +}; + +const char* qansel_instruction_to_string(unsigned char instr); +void qansel_rand_init(); +float qansel_rand_s(float s); +float qansel_rand_h(); +float qansel_rand_t(QAnselContext* ctx); +void qansel_cnot(cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char bitA, unsigned char bitB); +void qansel_fredkin(cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char bitA, unsigned char bitB, unsigned char bitC); +void qansel_toffoli(cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char bitA, unsigned char bitB, unsigned char bitC); +float* qansel_unitary(float theta, float phi, float lambda); + +void qansel_queue_init +( + cpx_mtx_t* queueVector, + int qubitCount, + int dofree +); + +void qansel_instruction_queue +( + cpx_mtx_t** queueVector, + int qubitCount, + unsigned char instr, + unsigned char index, + float arg0, + float arg1, + float arg2 +); + +void qansel_instruction +( + QAnselContext* ctx, + cpx_mtx_t* stateVector, + int qubitCount, + unsigned char instr, + unsigned char index, + float arg0, + float arg1, + float arg2, + //pass in this to flush the queue + cpx_mtx_t** queueVector +); +unsigned char qansel_measure(QAnselContext* ctx, cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char qubit); +int qansel_get_instruction_bitmax(unsigned char* ptr, int offset, int* bitmax, int* qbitmax); +int qansel_get_instruction_size(unsigned char instr); +void qansel_get_barrier(QBytecode** qbc, int idx); +void qansel_born(cpx_mtx_t* stateVector, int PC, int qubitCount, unsigned char q0); +void qansel_density_or_print(cpx_mtx_t* stateVector, unsigned char* bitVector, unsigned char density, int bitCount, int qubitCount, unsigned char a0); +float qansel_get_float(unsigned char* program, int offset); +short qansel_get_short(unsigned char* program, int offset); +int qansel_get_int(unsigned char* program, int offset); +void qansel_reset(QAnselContext* ctx, cpx_mtx_t* stateVector, unsigned char* bitVector, int qubitCount, int bitCount, unsigned char q0); +unsigned char qansel_compare(unsigned char* bitVector, int bitCount, int PC, unsigned char a0, short op); + +//computes program efficiency +// points are awarded for how long strings of single qubit +// instructions are +int qansel_efficiency(QBytecode* program, int programSize, int head); +int qansel_crawl(QAnselContext* ctx, unsigned char* program, int programSize, int* qubitCount, int* bitCount); +void qansel_reorder(QAnselContext* ctx, unsigned char* program, int programSize); +void qansel_run(QAnselContext* ctx, unsigned char* program, int programSize, int qubitCount, int bitCount, unsigned char* outputBitVector); +int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff, QAnselContext* ctx); + +#endif \ No newline at end of file diff --git a/src/bytecode.o b/src/bytecode.o new file mode 100644 index 0000000000000000000000000000000000000000..4379a3f3e76fdfd53cd90e84ce7d9dabf99f836a GIT binary patch literal 58832 zcmeI53w%`7weU|!kca4mih_zV3e+I4@KAY{B;?egB{d?spoE5)2c(1qlZgZ+7(1b6 zI!Q@Cu||y=Z|N=m#EKO)+E6DLO;Bv3qGFBLSnx_Z^co>blwiKK_FntUo;7nKR@?7> z_vguP=A852Yp=cb`*HTk+-5HR{(z_`Lmg4Z_l)43qK1+B*Wh)6xJ)q4HqJ8AT;317 zJ(Xs!<0-S(b0l{DA#iluu@rQ8{jTZ}TTs?jJrGa6m;tU@SM|99MYZ*H5bvA}((3vW z?fP8pdWd#?DyXybW9|9_?fPx)`W5ZENxObhyM9=^zF)ikrFM;xAv*(`)J3tn_=&p6 zR2R$D#Wm{U`|4u8x|pdhCaQ}|)y4VhB34}tqKlQ!W4b>F<`_rt%iAJOHIlnLN1ewV z!_A{U^QhPC^_jiOJ=am--zWSE`CP|G{^O3z;S+lnsyXiXaZ^x*%UgEDpkD$SGSWhbL=eh36yTl}SG3M*Y;X5f66cdzT! zzj->MTtoIMy!W_cc}NTbLxTay$U=goLTp;St=^9-Q<^K&{FP=S1m~Y)Hak3VP_p2r zQQTZ8Z<Gup+{xB z%a_(6?_+&wnE9>V)WN>Aqw;E4Agbnc5_Ex{pwqvp1lqS%cno=vi}AR)JP1r41oP9ZPO?N-NaSwh*pYf%9e7G-y?z z4Hdb(PzA77HHa$EF0Ue00m>R`RxoQCz(U!!BD*vth~DT37gcAzW}}nzk5`6N?AG?fS4t~u1kfbL#=*e$}vVepmHjFKHeN#XIhW3z1Wp|wAl>sWU1m}B_L2I=?90=nL8 zI7Xp$fRDdJAnQaRM}mQXIx}1y^e-J?`}@qIV-8K_VNlrzD$B4Z+T3#*DvyB5P81Fa zUsDMY{OBD}xl*V+cp56ZK;_4%vP&1%RJOxl!i3yeZes3W5@6t=7TBaf59t03g+t<| z>23?rjcI|Bq2e~W+d%iLDBK2LsvFl+_W-mKUC$1Hn)OHgvYLZx=m){Y<$d*8z(z0EOXlmP(qwpEx=rg-yKYJaFT;iYuIOr`o;7x05F^{6A&Xe%v zDQh#_7sCh-hSW_RF*q{vnFn1_(0Ey)L~!+`4%29p^wa7~80>hgEuzD)sJ18=>m1P> zRY)xfgE6Thx(t&pM_jeo2xq+p>E~*CKL!REkSL>vTj}79#*t!Hq_8m})nZ)g^8QJA z@R&zo^m25rdB9Qi*%y6%H8n2Z${scTGn=dyTJx5?nc|0^$kflA~t)s;}C?nY}vLdY=iihK|y-giB z3Bzw1nu9EMc+h)7N~9fkHT^XPN|CR0SOn-A91dN+cz~b+2E(4CgMTt0@fi#-(F<0{ zX^G3z92?1>RZhbk_kyk7r0~Fiw|kSqEyEJo=JF2klyw_!bhg5_2CU8HP>*)Fye0MC zv^pG5!MtI(S%W2{3QI`kVsA=$rCIB3t2DQTrX6GeLg?QiSDp0aYI1cqp7+X4ec(>9?^6sKe5Wyg$?OQib+ke0h#zLcJ4osa@rJq#pC zfs0T;I)>HNz{TKLj@8(QSxI8Sy8NPfJgV~7EIX|ZT=pmA~mfyxkV6;-G> zpsxcao+XoAa_;ByHa&YG#9oe) z2DA1#rZn9$gf85%!R3}*7Q+(ewo~UZyCAAv5LL%dZ-xm9 z7%Zj%uq0-7gXY&@u!%#*(D9?3S+vu*EKnfrKdRaPj+}!=wErEjzvN;}8W`AKZ^FoV zI9|n?2dvuzcHXUV(2=5_L#T&n1O!WV-jc&EFO0IhBEt{1V9H`uX_Hqz^Ds1iaDN1P zdB;=GtNG_22MNd4CDDd4zYQ+SW_WrM9b1#&-qVxdsJ;mLb5GAS$JTg3;vLm>(Coo@ z>9#qZp4hU)&QZW8qfbxISjQbh;qJ@FP@W@BPtQQd9XL8cn`&LvsZl|*D$Ty~vOdSn zaxJg(4QD!Om&lrQjit*XGKu7qCZ7rHk^UBY(RAjl)4F0 z-2ykM`xtCLsO-YguWh9I+{1(&sB}TeP#KfIh;9%985zO4J>+=vMc`$O5(x?MUJw!W zu(JlPB8RQ$06m$%0F_oU1Q*ij3v?O; zPN(1kJ6G=jk;Z|ID(us-QzXkEk)(kHFiaEzFptn=w82UWw4*vz&yc_{8RkHtK`yFC zcusOQq~4d;l?EtIM(2m{C9mGKu3opU_E}f>SU}3*^Nofx;H&cy>*^uv>Tc_*8n1@J zSEmQB&W5kRrUt0SMxaEV3L0YYZnZqElJI&FN??gR{ZP6k%hP;$x>BB|%2S*?T_QbP zAW!GWQ-t(_!H^RM?V?2!&l6&02Cns|;|wJsnHsKzV4L1>&47E+a8*DQM8kE7Akc7~ zfRwZvt{Xdt01q}?CqewnGeb38uYh!5j3~vv5W`v$MnGB_oo|6aWM|0qaF^;~vZ912 zg9?{8urg^>=g)1GVc7@^re9^JFMUR3()pc^$U(zkcOZ5ieGtC;QgL!@{Q*SH(=*jk zQ418tx{iv!!bRr{z+s_AwLwZb!I>VJ1jdJpz=RJTpWu_A+RDWPM&ZJ(r>xhp`3*JP ziG%Tpw<&^0PZMNHkMh<7-g+FHU+YYQCnf3I1kfC_w=0i`lj$Ptu@PT5nY#vvh}0{hQ;YHEbi<8L&1E9z3j*8+Bk@*P?-#>! zSRfZm*Z5W7j}!y)kpc_Xr|U(n8Qp#q$Fwf*9v42b@IILUCvTg#dKR3My<29A(@T|G z<_TW8B_7V0BJkW;IQCZty36;V_*D0K@&d+@@}keNjepThxyC={J3B+{0F2|i?Dc6{wt*HX0)DwXC0aEq4Ai)Ho&%7y>Qw>CP8lq{??TVG zE{|SA=CyLZy92Di)CqBd(j*sKcc{X)3lS_5$C^78+TE}Az^&k1uL8%s2nj(3UTYV4 zJ%&`PLc+V0?TG3W+TO2rYf9ej`04ww=wj7C@YP^z6F4+Pu4%fruynNd1{Pb>W2}_@ zO^=~k$Kq1_^(I`2Mfq5>(YkH?5)1l?)#>XE%cSx>SZNJM#j6l$u%M=&q)V$*ju8?l ztz0>Vh2g5cs}w7hT`5KLE8t5s$&O`W$p!DXYyw}QTp%zL0!sl?x2#9K+UlALNjR?I zj=~#6V#_M-LI$Rw<8tmup-|HTYp5V3bz7*zQfeW1yhExi1kH=sR&vDUeKB$?h6|wB z7uYyM(9|-3nAMv}FBFPc|CiT+sSyJa*+9~v?WD{h@*Gv8ntwU-z$u5dUg9&L(Zqb~ zrEO9XWE@W$xnA=N$J6E)_Ci7tw7u4Dt5kf-2P=TE5|`HMO=(W{n*QXFAw_e4-N{kt zlcDFh0}3G|3oeE2^PP(&5}qXO4S#S6!wxLVf$!p|LCK492=YxK&6za&yw^Djl;aquWR<17Ut{F+Eik6rlD9La8&>JM=bB(l zC+>oPP!^O-f(Hpk0PQ*+Vpqr_HQH4!eK=}&7+3Ox&>Okh;`AMwjY*J{fptr2Nn^S@eZi)yB)#iMGS{1b|B%m7F!$SRVNOT)es9- z+0}|GwPrBf7ZJHKT%-+9_u#6hmhK`l@O|!z<*>+MlzbNy)V3txNURT5b)q&85<_`-9E}7W zy{WTs)fP6EN6j|7O6DQc;_CUESO`q(^878zn;O}*B>|^9eSzsR2C&c~lN6o~Ti!6O zLml>lzFA>D5|XvH=n`s+V4WeCH0_TdkGep`d z3Dz{YchjL@X;4EUuNa_3;yCOij?HQcPDa*ak_Ly2+!?)S&LW{xdd0{g=n2MvEn*0W z@oU+V4}Qdzi6z?TjD{&ei`fAbLWd_hz6v4iHQ@o-L6ivmP;i%T+Y4w8Jdh9OMnVES zAs>wUJIs#2#D3(U^=|i=2Vop=aIV?A=}}KvN1vnOr!bjho;ob$kRzDzE#?8Vf{E!i z%mdw>_zI|;Q| zM6yX$xA1halJrYb93lgoz<6AhUW_Xw#Vk+R;i!@y%ZSKWP~ud`%ueam+qLaJb2~iy z-vkZNc4*}S<9R8QzMw7DOPMTma^BE6;3Vuu^q7ZX0snB6;}^$2mtB}IVk>Iy$5yh% zY?Y^GNM9q62s09BHI=n+?eaymb{A|bfx*{i*vi@LHCy4%Ywq`$%@A~R)aGY==6;CF zW<3tAs7vM+7!9KhYeQv==@)^Y4`aJvfU3fIOg|{~M{RyzDs}wgJkdHfq92^o1RMF* z7E_KVanvEZJ`7botb?Y~4Sf-Il|c-xqYK9#G6}u719CSSfg_q$eMAGhpwb$(aZl8% zxZ%|r;p~orX%^G%OGrLF)iM334p$1@4cV_hgjEyX0XoX@k3bCN-x8Pk7RMa^vvUsI=r%dYokW#P$aHpKX$B7xdqZ(Ig zw2||08aac?Hx2QkTzT1>hGWYwgy)nyUDbO;Cfp^;W_1ZnGDLJ2c|Wt(U*>}>E^f6X zibhAZS1qP&N@285+0?8uvcGJ?wiDXYxgs$)J&!39h^`4l)lkS(r!T{(Swj)g4@Ioj zCHQ3r^aH->teQjL0?YV~+GD_5Mq1=Tr#L z#*^F>Xl>Zrk8Ke?8ffkOT;!^}3%d8KrnU10@YJseOwZdr{xhJ*;O0w9f(8UOeLY1Y zprN(_wFXA3xCUdVNNWxFhTc!?Dw1pUqApgN4`StV&xS?I2Vs%(PRJyD|0&ko?<;Hb zJt=F6DDKv-@D^1eI&XmeKhP1H;4_8!D~aYoQ_9_X;OO*yEtA=gkU%?BVr_@q6k zny4-pG*Omad!cA4uThjQ%Iky5;VbGa_=j|=z_4i#wt$u9{jdTIp9qoA-figoTueM| z@=d7@i-&Uf$HM&CR}T|jT##8}We05jT={@2*t)8mfzcPNXuVz;GraTS{=&i1=o3ZA zR|1R1TGoCDJ3CYa!?G3<^+BH)u=wu6@d~W3*Q4)5?`Mhdezts?t8D44`&z1?U4StL zjnA*`PgUoP{#-@<@$Er#rRgv%1f#8v$@DhqMdCx)RAU=|aER27!Xo>Lj7;q%13UtzQMS{ z_I^hN_F*E_TmO}z4u`k^KNtq_=qx?F9tZ*RV-!i6tsIIU>A z&&9w4j+($(HG!cufk8Ea7#tt@%xzK7Y0+@>D-TYgfXv;3Qy53phEJd^@QAH8hI^Kp zmBRiMzZ{#2NsZX=l~ymNs*a~(22@7j1Ql-Qib=|*SM_#Cbei99F~wXJ|0M;D2w@&6 zhxQ@wN_xyjP}E36z}HAxwH_fc93f^iVy+T=%COjb7@o}MbgW2BPyBIWhI|Aj=5A?n z_Eu{Qz}egKzEgc(sM@DsiguR^Pq<43?_@g#tDv-D{S>smF7>Sc#o*>M@E{g*^Zdq3 z_s)fpJ`R?l>--A;EMqvl!*A{kzGaB%eyY!Ke~*lT!9|1@J)Fu^kAE;cy4jMA?VXqRFk6bJXf;Tp`A09%BjP6f3fef-eUK<9imymn?Bq?1KiG!t*7>LKXPM(@0?A z=zYG$#Ce7h7!Gsn+?EP+6&erg>ieT)K@^V>;3W+BzZtX5{Y7s}iseX7VeyGgaJGuq z2NL%P%R^?af7E8KpN7p`YlB*0MI~hB3hO%3K5O~l#h3wLUn|)++icx*I2buEzHr!# zK05D$FP}&~pGdsLpgK|lriAo3FrV8C{=_5+9+gy@O@Rr}ne4@<#g0FkO=t$L8OIEO z6%p~Q81@yLO;WVHtjXB;DvCp@IG)~?hN~jSiUv5Kke0=-2k2tn<1YNA&69%z1LCY22&}K$uBIB z>$+j!4Vwushvl4YU!m^&7>C|8FB01*@dbK(b$&B`Mc#xcmWqU7Aw{#n@zdvFIXuKj zN5xB624FqwbpQ8_X8yk8@PBez!~Rc>z%RiDvwe=ZHh81yRV@bUHCPp;bh8H11zy;? z0sk`s{dGP>>S;;GhP@@E!liQFnRU1Jm>(9jQ3WnTIyc5y3!ndJvn_m9jy_ z3KDh<&B$1rQ&fSWxVC<`uY|MTHxRNjwO%3iHDuN``qy$)uqZhTbYn32H#$CC>R${aogV zp3qTv=8oVK-B#zgDaILj*>Uj`<~pZNy><2al8nNF{EcPd3d8+Oi{wXm6iMhTLND<$ zcuDezNTI?aXB?(bo)Cl6JYjI+TxZ_Ii4%m3j5TJDj5#Sz1Rsz;i7VoY^KQw>a8D3% zy4)G3?nU}K0g(Ij3C@W@*SrvymC`~UNZvOZ2nJ8KOtT5FC`raD$%>V*Q+X448Dh8| zC2(C5;%E~{-ZvTui>>^0?Q7Q2fw3C(d_Db0#{4T+kROw%{nufVf~t z(ot3uY$>cfi&PRrbEf}n!+0){+P_J?AvuL90AZ93joc=#Em-@%piRVLfDNil%V5Ka z^$43G)kKJT#f474jm%Z8n5co+-l66t)RrxgcXrJg^$*z6h!CghCI{;Zih)uT6S}7g zbl#{tORJY}An&xe~=50p*-ll8bFn%huEBf~~L-Tf}=IyG8 z-k^;^JJr!|8;wGG4`Vy<PcE_FpgG@Q!p`^?CoC%>-$YaJbrP1D^Ys%}>s;h4zieok zku3gSN7&LLf${~BT{u_w>Kw_Jaw`|ljiiKPTwcl?kGVpGAK^?o?EIrX)DhVo^})y1 zom*q4CtOaE$l-E5rN&0%7GsT3Y`Bf0Qln_2QFMz@GR-KNZj{V0vPzBO4VmkWEV#%L zSL<>zi%W`fjO?6(;ym|8}vh?_%;Q;O@VJy;9r~qvQ2WvjUAsiVUCl=B+i_oB6t9iSKy=(i!-wzGk;@o zUh)6PmTHc3{FG_A~t5xx5}u6g(dmf&VoYRH6R6@IhKkk z#`ySI%fXuBZ#$rWalM1!u7SA-e8iDJXLTx97jnMRnk4V9Pk?i|yq4eZIQA`o&vTu6AiA3RFo-bg$<_GbeYo^?iaaTJIMw|T-Ya<7BUh`})Kj=?a{ z-B0d64DtVc%YO&CKLDE*gZ}S{R{miVs5s(LPUT_rL@SO?a<2~w|2`}H1af~b#Q$F` z|EtKo4|k|p`ad72!Y?OxyE0Nw?&Hx)<$o3WmSxOO?w9KBD}(MG<4OK?k{4||$m4(HjU+$YhX084 zJVf_QJdX6d<&=6vzYdoPHu68R;n&&l6*fEzINJZ_cV)P${c#ij zoVXY#fXEi&V=j~Om&%i|jd&t)F)jeNhk!>)x8ITc%n4G#A=0yl_{hs85aR>5{4?=a zh>LLn@OI+qlcc;D55Q#rc%*QTll+gblJa7F0GD6b$Pct>&+#P|Ot%Y6sYi?-;Bu^u z{A?R;+_=%5lU10VGbPK&T3?#6&Rv?ZK0nh9TTRx%&Tflk=iHo^m7^2b58=)!bz2fy zh3nR37G!7KRFYGY6Qr40YuH^zeolcw8|Y!jxOORA7QrJIH$HMn%`C~!TP{!6%hL^p zD>FNDU1m|Xk-7#Z!`I2vQez<)Q&gCrpOgKgYnB=}W#R&ChBleca2IC4%pPXh%CQJ- z%`1QhG{txsf{R1$)`Z--ja=CKo~76tuw_GLQBH=gBn#%@#`?kyRw{^aRPus%%K@Jj zDV|%DlcUs%XHXOk;Mr^Q3Y3$(FgLd_KTqA3Kom0JaaLAgu~8h961gDbw@$1_7_bDL zwSJ@Wrl(D4j=?((5rm9lH>^?=8MzyZ^4vM{$(Ax4cKl|n%W-Gs=b@5F_27D|-@ofY>MzGMbF0)j5=B~I=LU&V->vF|2 zyjLD84EexMrGdNy>0%j;l6-N7GN-(v6=FM<4vNp1r zlFt%V08mntD=$uEE8A)v-66f&a1Lv zmgZ!^p7|td7)TA)FsSbThRbBIwq<0&8rRwkh?F~TU5;Um-=X_5aEM$EA3SEtlfiic z{G=JjQ#5fJpj7rAU{A3&BH0(0! z8K>cov6J!Pbl<=@O(TqE#z)e98{;$_FxnZvi0+Rtekt8|Gfv&9af)&3zKkhN-@J^@~V8``~eRozf#^B z%NWlhzKZcY;(3hUL|l#MmHwNF|CHphoM9fS^6b?(&e0Tq*oNcJ6ykw;@W%j^JkAsF zP~p0V$@{Sg;6QmS3rc>v#&Kw-H?rxNeV+IJf5kO&*8f%AQsm{sz-iMdh%YaaA4$ z4FRQap#3;xSNbR0@P)*=oj2IXmuq~2rvFzqdLGr}b$ed7;hi>mjG+)196VlAH9i5{ zReVk2JYMNG@;;4UuIYKmMvwS8FS17uw_Vetm#fb-u9u(lsAI)=>3oI_PqpFqXnc}p z|6D3BsDHA?Gl^sRM8hW?8x=V6HTfxUuhO$alSk25R0zjW8{VUF)Zb3}2a12}F6$}s zO~k*$cpdREj5iXW#CR|9*^G~-^@kP2(d;<*sCX4J`E=6rM@@dRChw#H59*26c%sH9 zX}r#c4|aeM9IAX)P3vZjI~Z?JQbE;N^1^aST_NpJl_>*ywp#lh^b2Jxw0h`c*kOu5pag8p^Me znw}Y&{6HE2qu5N1FW2}L8h=pZS89B}#&PLH+0(9Zy}XV64hX@4;p*vJsPS3grt~yx ze744WH6E{V2dxXDem&gp+VEL6JeRmC|Em9TYw}Jl+-Ed?sm5Q{_*{(-rE-UM>f^f6 z8pr2hDjiBRuIqn5E(n@e1UtIE%ClixGw*$#&!A6ZTQIX z!kn=5yvl|r6Ib!tN%bz>hTpE~xmt_Y12(+DhQDFM4{O||=|5q^hkiF0UtRtp8$N@$ zitm3>{Yuc}7i!@yv60WPkzcFvNt&JwHr!*wx7zSp;>v#2&iqD`*X@5?Gpueb@}V3q86!V0i2cm%^KJ3`GpPNt#Mud>o&Yo z4vd!`?wuOf^*7-l6%Lfw^?asrU49@=_TWHyOj;G+sT$Yy6x#4T8rSu|qj6oo3n!Cs zV7PidmTO$s^J|Uk^6zL|m!C|}^Hq7?N#$)0aST^4&kLEnS}*&dCa;&zWg6Gx)ynj! zcJ)n7-U(r=bY6y&UO3R6rSMVwW{vCPw+iAaUaFnESCdcC^fYK(FF${?;juW`h6D9S z!$+-?Tu2=4)YJJ+ji-T|vj1I;>-n`28(%n-{i@ye5l8)cd;7E|uiLX%lh^I}MC0dz zE@e*)4hrE=;hv=OFr0W;d0_H`&y@bJvEer{zK!I|Z1}T`rw^0*U$o(`Gu}w@9gO>l z_Y%i=ErO3qhru}5g+rx7Gs#aQ&gDyO_tU;4UfUj3=SUdI2&H4acnYGygD?l zm!Fwf_~1bOI2Bg%l^Vw(s^YyG$DxYi>#;L{1NGpLO7TBw9E+afjs&=Y1LYIpqxcO8 za03VOWcVoln*_LlgL4OZCcYTXN+-K?T$i7SjV~Nr{}PSs@(*cT*WapfT|OQYm-OrH(%l*#2kt68U(om@jUTe% z194CeM+|&){V5t>25w4!p~jbMyh-EdYkUZHHgKT+QSecE=4(7v^lWmWw3NpzQoM)w0AM5Fqt=(s#YO}U#nt-KrNl8@%nGIFSthUayllfe8CUB? zpW5h;#X82^Os4=_HE!ad0Nxy0KUZz0~n_{+o( zGyZ4dM;L#d_)*5+BHqRLJH)#gSNn;37{`6(c=XDXm7X6GH|UII89xEKk6}E8?gulz zlJ18weuC~}89zz)BN*?adwri0+7pdmaExa1gNQpBKa==4#vR1t7(a*jB*sS)SNpy3 z7C&mA{Y)l5hU8~4uJ--t`=e0wGLlbV@)LR7h<7vo9`PQ=4-xNW{6pfRQG<2@Z}Af#4!=(! z4#hvB`@xJKr+e``g`@+~3F5I#{v_RxV7!m+M=>59E$tZ1_#om=#?K@^j&TR^IL6N* zK8f*>#PK~SJn)2{3yIHUd<^kfjE^Ob??>T*C;VJSJc03v#FH7HO5DXb{!SGhiy6O) zcq-#_i7#b*0rBOGFC?DM_|?Q$G5$m1*^FO9d=2CH9ugk;j4va;o^gCX2@f~p8N^E& z&mz8w@zuo38DC4hg7HG)m5dh?uVQ=y@fyZ&CBBXE+lbdP?jc^s_#MRS8TS$2&iGd1 zI~c!{_)f;}CccaD`-tym{6XRkjQ^T=Bjdj%?q~cF;?0adM!c2rCy4K7{AuECjQ@f7 z0mh#revt9!iMKP}LcD|Vmx&){{LjRXF#bC6ql~{ryo>R7h<7vo9`PQ=4-xNW{6pem zF&F9+I^!omJciDSe?<3#89z?<_}(KPO8x}h$1;AB?(uy{UA~X*M=>59BjrXjK8U!J z@iU2!W86U;-=EaOJ%{)t#zzv5XZ%9qGZ`O4d=}&Qo*y3b7{82o0^<{jCo?{kxQp=_ z#1}Ju74cNY=MrDa_yXd~8DB^|o$;%QuVVa%#IqT{hWHxBuOpt%_%h<_8DBx%&3Fd! zQpU50Z(@8k@p8u360czVbGol&T$RHr#z&Bz8pdxWzK!wQh}SaiAzsJ$9mMMy_YvRD z_*UXO7{8PFPR8#hzKikui0@|nLE;UJ|C)Fsc@Ee~Wk*`6$&A+#cQIa1 zd@_yNYBCVr6dKM-$c{5j$sj6XU`mWRWPFFH^1 zBaHu?_)*3u`OBq+`xryu({ywF{ZpJ?% z-oW@N;*E@-N&5YapHIA*@ym#}GX5~}{fs|Kyp8e4i63D6N#X|?e};HF<9mpAFy2J` zFyk)}Kf?Gv;zt>Og?Ja^HxTb;JcoD><8Kr1Wn8_FWSkM&&c9FcF^qped@$pk#D_8d zcjB>(e@uJ?8#rS8$M>BqkxRddy3uS!9F+PxZ9OFZXPh$Km;_-~{pm1k0{si$^ zjGs?><}rQ|@dU;%A)d_mc;YU`ClFuE_+;X#j87xJl<_NwFK2u<@pQ)L6JN!6BJpg- zP2y`9Uqn2g@f70g8NZgeoAET_rHo%sd=uj!!`#&06N zjqwuVwTy2hUdMPD@p{H@C%&EWEyQ;)?j^pH@oM6`82=^l-HhKwyn*q1h&M8RKXE_f z4-s!>{5Ql~8Go4ge#Rdq-p2Uj#1An3B=LicKSR8o@jb*l7;hqenDG~gA7OkS@uQ5t zLcELdSBZBs{s!?L#@{C1%lNy*jX|vaCmzH22gC<6-bs8I<9{a}%lOB{M=<^g@llL_ zMtn5mr-(Zlj~Y$wKjQ<5$1y&H_$0>9A|B89aN;u=KbQC{#?L1{kMWC$Cop~q@npuw z6L&E_f%sy^ClgO)d>Zkkj9)=~Iped5r!zjE_$tN|iDxrz5?{mkBI5asrx0Jy__f5{ zjHeMVW&C>Ln;2h7yqxh&;uVbN5U*rBk9Za1>xkDdeiQL+jF%9vWqc#?I>yV0*E4=Q z@$HOnA-;ogFY%p>R}A#N!wrLVObAXAzHQd^qu$jGs$<7USm=pU3z`#1k05gm^OJ|D#q6luVMTq;@cQ6AzsV)M&fmhml3aL{C48o8Q(&D2jgDi zI~lJgzKii+65q}EHN+bjzkzro<0?Jxs`}{3GHCjK6iU)SJxsJH%a#zejvAQ8IQ)7_TX60_#onL#?K^P%6KxR^Cre!#LF39OuT~eRN|G4FC|{Z z_;TVkj9*4}Zex5R@mj{G60c)?2Jw2vuOhyk@wvozFus8JPR17!-^KXV#CJ2kn);Up z#@7;WWW12LpYbY6w_)@itr}l#Tp-IsEaRgSBp<5N9M+X^ym(rn~@%M>$F#ZAY!;E(lKf?Imi63SBW8z(mFQf9-&A6&ZJ&db* z)XTW4N5(K&zEu05>QM~isvZqyT-BptjH`MS%ebmXBN$ipXcXgl-;?%@X1s~Glkqz! zea12FBOb^2R^pQwzms@8<98FE$@qQ5XEFXD@p+8@ns@@^za^f`_#?z!j6X(vG2>4V zPi6dR;!7F-1M%gIUrYV6`o9;doa`gMipl?(%565|m(G*Rxz&L4=iVVH_6vCuHF~+Gp>GztAla%dsqhPQ|YOG56j88 z`aP@!#?|j(tzumLz7>C8vXat^zlW%Pe~Q1~r+&YQzc;6Tk0}NXheO$~evfG!H;=rH4nmr4CGZ2ztLJ)?1qtKTz9W?cQA zQ8wf1_lznSSHD}t_jO-jN_&hc#T(bTGjD{myGWkbsH>u!{LCrhH-o0YPl#k1Q*JCS zHl_$#R457lh!Fhzk1+*)K__R*)jvv`THjw<2P&TGR{S@y`6?+G&*WA33gf@ALc6F~DQqbJZB);cL#(=>Gycz;Nbw*1kQ9ic zehuS~TUk{2wB1tt4=xO!+nKsf`gh8c^^LN4sPom@wQ!)X_2ge?c&+>?o=%L%U-?)2 z`<1-1U)?W*i%9X0e@{xN_th}|IMr1CRs7K&9ya<+xCy@vV>x-iY`~(x{i9Bv_kfJr fjreUCSEF&-!Q($1+#>lu^1k$xtNF!C?*IP+xXpR& literal 0 HcmV?d00001 diff --git a/src/complex.c b/src/complex.c index 6abeeb5..8916788 100644 --- a/src/complex.c +++ b/src/complex.c @@ -1,16 +1,4 @@ -#ifndef __cpx__ -#define __cpx__ -typedef struct -{ - float real, imaginary; -} cpx_t; - -typedef struct -{ - float *ptr; - int rows, cols; -} cpx_mtx_t; - +#include "complex.h" unsigned char* cpx_str(cpx_t* n) { unsigned char* r; @@ -183,18 +171,6 @@ void cpx_mtx_knk_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA /*-----------------------------------------------------------------------------------*/ /*THREADED*/ /*-----------------------------------------------------------------------------------*/ -typedef struct -{ - float* ptrR; - float* ptrA; - float* ptrB; - int rowsA; - int colsA; - int rowsB; - int colsB; - int delimeterStart; - int delimeterCount; -} cpx_thread_context; void* cpx_mtx_knk_threads_run(void *context) { @@ -822,6 +798,3 @@ void cpx_mtx_knk_metal_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int cpx_mtx_knk_metal_2x2(ptrR, ptrA, ptrB, rowsA, colsA, rowsB, colsB); #endif } - - -#endif \ No newline at end of file diff --git a/src/complex.h b/src/complex.h new file mode 100644 index 0000000..41efbac --- /dev/null +++ b/src/complex.h @@ -0,0 +1,101 @@ +#ifndef __COMPLEX_H__ +#define __COMPLEX_H__ + +#include +#include +#include +#include +#include +#include "hardware.h" +#include "kernel.h" + +#ifdef __PTHREAD__ +#include +#endif + +#ifdef __OPENCL__ +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS +#define CL_TARGET_OPENCL_VERSION 300 +#include +#define gpuerr(x) if (err != CL_SUCCESS) { fprintf(stderr, "GPU Error on line %i: %s.\n", __LINE__, clGetErrorString(x)); exit(1); } +static cl_platform_id cpx_mtx_platform_id; +static cl_device_id cpx_mtx_device_id; +static cl_context cpx_mtx_context; +static cl_command_queue cpx_mtx_command_queue; +static unsigned char* cpx_mtx_cache = NULL; +static size_t cpx_mtx_cache_len = 0; +#include "kernel_gpu.cl" +#endif + +typedef struct +{ + float real, imaginary; +} cpx_t; + +typedef struct +{ + float *ptr; + int rows, cols; +} cpx_mtx_t; + +unsigned char* cpx_str(cpx_t* n); +cpx_t cpx_new(float r, float i); +void cpx_mul(cpx_t* r, cpx_t* a, cpx_t* b); +float cpx_magsqr(cpx_t* n); +float cpx_mag(cpx_t* n); +void cpx_mtx_set(cpx_mtx_t* m, int row, int col, cpx_t* n); +void cpx_mtx_set2(cpx_mtx_t* m, int row, int col, float real, float imaginary); +void cpx_mtx_get(cpx_mtx_t* m, int row, int col, cpx_t* n); +void cpx_mtx_copy(cpx_mtx_t* m, cpx_mtx_t* n); +int cpx_mtx_cmp(cpx_mtx_t* m, cpx_mtx_t* n); +void cpx_mtx_init(cpx_mtx_t* m, int rows, int cols); +void cpx_mtx_free(cpx_mtx_t* m); +void cpx_mtx_print(cpx_mtx_t* m); +void cpx_mtx_dot(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); +void cpx_mtx_knk(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); +void cpx_mtx_knk_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); +/*-----------------------------------------------------------------------------------*/ +/*THREADED*/ +/*-----------------------------------------------------------------------------------*/ +typedef struct +{ + float* ptrR; + float* ptrA; + float* ptrB; + int rowsA; + int colsA; + int rowsB; + int colsB; + int delimeterStart; + int delimeterCount; +} cpx_thread_context; + +void* cpx_mtx_knk_threads_run(void *context); +void cpx_mtx_knk_threads(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); +void* cpx_mtx_knk_threads_2x2_run(void *context); + +void cpx_mtx_knk_threads_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); +void* cpx_mtx_dot_threads_run(void *context); +void cpx_mtx_dot_threads(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); + +/*-----------------------------------------------------------------------------------*/ +/*METAL*/ +/*-----------------------------------------------------------------------------------*/ +#ifdef __OPENCL__ +const char* clGetErrorString(cl_int err); +#endif + +unsigned char cpx_mtx_begin(unsigned char verbose); + +void cpx_mtx_clean(); + +void cpx_mtx_dot_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); + +void cpx_mtx_knk_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); + +//This only works if ptrA is NxM where both N and X are divisible by two, +// and ptrB is 2x2. If both are true, this is much more efficient than +// the standard knk_metal() function. +void cpx_mtx_knk_metal_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB); + +#endif \ No newline at end of file diff --git a/src/complex.o b/src/complex.o new file mode 100644 index 0000000000000000000000000000000000000000..7183f0250a09e4c0b920be825ab8b296e48e1852 GIT binary patch literal 49344 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 UzYnEl%718wo2eS|a@5ZMKOYf7CjbBd literal 0 HcmV?d00001 diff --git a/src/context.c b/src/context.c index e25abc8..04503bc 100644 --- a/src/context.c +++ b/src/context.c @@ -1,3 +1,4 @@ +#include "context.h" int qanselContextValidate(QAnselContext* ctx) { if (ctx->memory_limit == 0) ctx->memory_limit = QANSEL_QUBITS_MAX; diff --git a/src/context.h b/src/context.h new file mode 100644 index 0000000..a80670f --- /dev/null +++ b/src/context.h @@ -0,0 +1,26 @@ +#ifndef __CONTEXT_H__ +#define __CONTEXT_H__ + +#include +#include "qansel.h" +#include "complex.h" +#include "hardware.h" + +typedef struct +{ + unsigned char memory_limit; + unsigned char hardware_rng; + unsigned char verbose; + unsigned char optimization_level; + unsigned char sampling_bit; + float hidden_variable; + int display_delay; + int sampling_shots; + FILE* random_file; +} QAnselContext; + +int qanselContextValidate(QAnselContext* ctx); +int qanselContextBegin(QAnselContext* ctx); +int qanselContextEnd(QAnselContext* ctx); + +#endif \ No newline at end of file diff --git a/src/context.o b/src/context.o new file mode 100644 index 0000000000000000000000000000000000000000..83f557e3c0c86a8d3288ad79270510e51d89fbf9 GIT binary patch literal 9808 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 SFc-$z|3Lb0a+c^%xBm}VV>CJd literal 0 HcmV?d00001 diff --git a/src/display.c b/src/display.c index 489d378..b0519b6 100644 --- a/src/display.c +++ b/src/display.c @@ -1,3 +1,7 @@ +#include "qansel.h" +#include "complex.h" +#include "display.h" + #ifdef __SDL2__ void DrawThickLine(SDL_Renderer* renderer, int x1, int y1, int x2, int y2, int thickness) { int deltaX = x2 - x1; diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..9c555ad --- /dev/null +++ b/src/display.h @@ -0,0 +1,11 @@ +#ifndef __DISPLAY_H__ +#define __DISPLAY_H__ + +#include +#ifdef __SDL2__ +#include +void DrawThickLine(SDL_Renderer* renderer, int x1, int y1, int x2, int y2, int thickness); +#endif +int display(cpx_mtx_t* stateVector, uint8_t qubitCount, int delay); + +#endif \ No newline at end of file diff --git a/src/display.o b/src/display.o new file mode 100644 index 0000000000000000000000000000000000000000..8e7c04be660548d8573cb15327e95d0c045f13a2 GIT binary patch literal 12184 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 literal 0 HcmV?d00001 diff --git a/src/finaldone b/src/finaldone new file mode 100755 index 0000000000000000000000000000000000000000..925897b070af7769969d7bc3f99670de4cfabdca GIT binary patch literal 143600 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 Le^Nvsaw`5mRybUY literal 0 HcmV?d00001 diff --git a/src/gates.c b/src/gates.c deleted file mode 100644 index 63bbf90..0000000 --- a/src/gates.c +++ /dev/null @@ -1,53 +0,0 @@ - -float Identity[] = -{ - 1, 0, 0, 0, - 0, 0, 1, 0, -}; - -float PauliX[] = -{ - 0, 0, 1, 0, - 1, 0, 0, 0, -}; - -float PauliY[] = -{ - 0, 0, 0, 1, - 0,-1, 0, 0, -}; - -float PauliZ[] = -{ - 1, 0, 0, 0, - 0, 0, -1, 0, -}; - -// 1/sqrt(2) -#define R 0.7071067811865475 -float Hadamard[] = -{ - R, 0, R, 0, - R, 0, -R, 0, -}; - -float PhaseS[] = -{ - 1, 0, 0, 0, - 0, 0, 0,-1, -}; - -// 1/sqrt(2) + 1/sqrt(2)i -float PhaseT[] = -{ - 1, 0, 0, 0, - 0, 0, R,-R, -}; - -float ControlledNOT[] = -{ - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 1, 0, 0, 0, -}; \ No newline at end of file diff --git a/src/hardware.c b/src/hardware.c index 130d87e..0283ca2 100644 --- a/src/hardware.c +++ b/src/hardware.c @@ -1,3 +1,5 @@ +#include "hardware.h" + int qansel___get_core_count() { #if defined(_WIN32) || defined(_WIN64) diff --git a/src/hardware.h b/src/hardware.h new file mode 100644 index 0000000..d0cf307 --- /dev/null +++ b/src/hardware.h @@ -0,0 +1,20 @@ +#ifndef __HARDWARE_H__ +#define __HARDWARE_H__ + +#include +#if defined(_WIN32) || defined(_WIN64) +#include +#elif defined(__linux__) +#include +#include +#elif defined(__APPLE__) +#include +#endif + +int qansel___get_core_count(); +int qansel_get_core_count(); +unsigned long int qansel_get_time(); +int qansel_hardware_rand_supported(); +unsigned char qansel_hardware_rand(); + +#endif \ No newline at end of file diff --git a/src/hardware.o b/src/hardware.o new file mode 100644 index 0000000000000000000000000000000000000000..3a95cd204aa3962c55871ffab1c3d26e1718547f GIT binary patch literal 1848 zcmb_bL2DCH5T0#It2WwNJP7rWgNTA%(xM;e{0a4HgN*Bx%Mq-K2JB_Lp2-QL6o_k zZkoj%V|s`f?wZ<;*+{n;wm${=H@DL*#BUDp^bTm~P2)?W+FDPyKDI~Jnwq(uQL*OG zcH8?Y`I#-6o0*wRp1$lX7wvL#d_telQ)A=j&L~L7P>xM|xIkKMSQ||Y9N6IVo?s3G zHjHWN$ndkCnZx~8Ie?eYE`nzp#3cG`N52D}?K~#YS3CM6@N8!>i9WT~o97VJe+8Z` zIHTzEVScFWpV8_*`mwiPA?oe&B@-Mt65)fpGIx@P;AkzJ74f14cV})|@uMm@xHIDg z9uljhz*#(_&J9HdJz)G;@zNXlK2)&X+ymQn^eo-C%bv4hS=L?0x3U%2;i+2o$*X(W zN;xljOjTK6{bI=>2Jn@9&aO*}Y+|`~IcIs*)zymYJGriMc<@8&{P-O(e(i;pitu>0 z!Y38q!yZG-P(XO;*;0&`{yvTI(#O{^UiwJ7S1oxMkT5bhMLylZnC|C1%T4&H8mte&CP8!;ZSQA1zQ zee1E)O)cn`{an40eIVZ!wWdEdE ziqEfie9P<-y17JAOr2qf` literal 0 HcmV?d00001 diff --git a/src/interface.html b/src/interface.html deleted file mode 100644 index de7e2e4..0000000 --- a/src/interface.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - -
HXYZ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Q0---
Q1---
Q2
Q3---
Q4---
- - \ No newline at end of file diff --git a/src/kernel.cl b/src/kernel.cl index dcfdf50..a5731c3 100644 --- a/src/kernel.cl +++ b/src/kernel.cl @@ -1,3 +1,5 @@ +#include "kernel.h" //{cpu_only}} + __kernel void kernel_dot ( __global float* ptrR, diff --git a/src/kernel.h b/src/kernel.h new file mode 100644 index 0000000..f71b799 --- /dev/null +++ b/src/kernel.h @@ -0,0 +1,48 @@ +#ifndef __KERNEL_H__ +#define __KERNEL_H__ + +#include + +void kernel_dot +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB, + const int get_global_id_0, + const int get_global_id_1 +); + +void kernel_knk +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB, + const int get_global_id_0 +); + +void kernel_knk_2x2 +( + float* ptrR, + float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7, + const int get_global_id_0 +); + +#endif \ No newline at end of file diff --git a/src/kernel_cpu.c b/src/kernel_cpu.c new file mode 100644 index 0000000..842f3c5 --- /dev/null +++ b/src/kernel_cpu.c @@ -0,0 +1,150 @@ +#include "kernel.h" //{cpu_only}} + +void kernel_dot +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0, //{cpu_only} + const int get_global_id_1 //{cpu_only} +) +{ + const int rowsR = rowsA; + const int colsR = colsB; + const int rowR = get_global_id_0; //{cpu_only} + const int colR = get_global_id_1; //{cpu_only} + + float rR = 0; + float iR = 0; + + for (int i = 0; i < colsA; i++) + { + const float rA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2)]; + const float iA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2) + (size_t)1]; + const float rB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2)]; + const float iB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + + rR += first + lasts; + iR += outer + inner; + } + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2)] = rR; + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1] = iR; +} + +void kernel_knk +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * rowsB; + const int colsR = colsA * colsB; + const int rowR = get_global_id_0; //{cpu_only} + for (int colR = 0; colR < colsR; colR++) + { + const int rowA = rowR / rowsB; + const int colA = colR / colsB; + const int rowB = rowR % rowsB; + const int colB = colR % colsB; + + const int posA = rowA * (colsA * 2) + (colA * 2); + const int posB = rowB * (colsB * 2) + (colB * 2); + + const float rA = ptrA[posA]; + const float iA = ptrA[posA + 1]; + const float rB = ptrB[posB]; + const float iB = ptrB[posB + 1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + ptrR[rowR * (colsR * 2) + (colR * 2)] = first + lasts; + ptrR[rowR * (colsR * 2) + (colR * 2) + 1] = outer + inner; + } +} + +void kernel_knk_2x2 +( + float* ptrR, + float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7 + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * 2; + const int colsR = colsA * 2; + const int rowR = get_global_id_0 * 2; //{cpu_only} + + for (int colR = 0; colR < colsR; colR += 2) + { + const int rowA = rowR / 2; + const int colA = colR / 2; + const float rA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2)]; + const float iA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2) + (size_t)1]; + + for (int i = 0; i < 4; i++) + { + float rB, iB; + switch (i) + { + case 0: rB = gate0; iB = gate1; break; + case 1: rB = gate2; iB = gate3; break; + case 2: rB = gate4; iB = gate5; break; + case 3: rB = gate6; iB = gate7; break; + } + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + switch (i) + { + case 0: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 1: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 2: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 3: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + } + + } + } +} diff --git a/src/kernel_cpu.cl b/src/kernel_cpu.cl new file mode 100644 index 0000000..842f3c5 --- /dev/null +++ b/src/kernel_cpu.cl @@ -0,0 +1,150 @@ +#include "kernel.h" //{cpu_only}} + +void kernel_dot +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0, //{cpu_only} + const int get_global_id_1 //{cpu_only} +) +{ + const int rowsR = rowsA; + const int colsR = colsB; + const int rowR = get_global_id_0; //{cpu_only} + const int colR = get_global_id_1; //{cpu_only} + + float rR = 0; + float iR = 0; + + for (int i = 0; i < colsA; i++) + { + const float rA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2)]; + const float iA = ptrA[(size_t)rowR * ((size_t)colsA * (size_t)2) + ((size_t)i * (size_t)2) + (size_t)1]; + const float rB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2)]; + const float iB = ptrB[(size_t)i * ((size_t)colsB * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + + rR += first + lasts; + iR += outer + inner; + } + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2)] = rR; + ptrR[(size_t)rowR * ((size_t)colsR * (size_t)2) + ((size_t)colR * (size_t)2) + (size_t)1] = iR; +} + +void kernel_knk +( + float* ptrR, + float* ptrA, + float* ptrB, + const int rowsA, + const int colsA, + const int rowsB, + const int colsB + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * rowsB; + const int colsR = colsA * colsB; + const int rowR = get_global_id_0; //{cpu_only} + for (int colR = 0; colR < colsR; colR++) + { + const int rowA = rowR / rowsB; + const int colA = colR / colsB; + const int rowB = rowR % rowsB; + const int colB = colR % colsB; + + const int posA = rowA * (colsA * 2) + (colA * 2); + const int posB = rowB * (colsB * 2) + (colB * 2); + + const float rA = ptrA[posA]; + const float iA = ptrA[posA + 1]; + const float rB = ptrB[posB]; + const float iB = ptrB[posB + 1]; + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + ptrR[rowR * (colsR * 2) + (colR * 2)] = first + lasts; + ptrR[rowR * (colsR * 2) + (colR * 2) + 1] = outer + inner; + } +} + +void kernel_knk_2x2 +( + float* ptrR, + float* ptrA, + const int rowsA, + const int colsA, + const float gate0, + const float gate1, + const float gate2, + const float gate3, + const float gate4, + const float gate5, + const float gate6, + const float gate7 + , const int get_global_id_0 //{cpu_only} +) +{ + const int rowsR = rowsA * 2; + const int colsR = colsA * 2; + const int rowR = get_global_id_0 * 2; //{cpu_only} + + for (int colR = 0; colR < colsR; colR += 2) + { + const int rowA = rowR / 2; + const int colA = colR / 2; + const float rA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2)]; + const float iA = ptrA[(size_t)rowA * ((size_t)colsA * (size_t)2) + ((size_t)colA * (size_t)2) + (size_t)1]; + + for (int i = 0; i < 4; i++) + { + float rB, iB; + switch (i) + { + case 0: rB = gate0; iB = gate1; break; + case 1: rB = gate2; iB = gate3; break; + case 2: rB = gate4; iB = gate5; break; + case 3: rB = gate6; iB = gate7; break; + } + + //(rA + iA)(rB + iB) + const float first = rA * rB; + const float outer = rA * iB; + const float inner = iA * rB; + const float lasts = iA * iB; + switch (i) + { + case 0: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 1: + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)0) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 2: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)0) * (size_t)2) + (size_t)1] = outer + inner; + break; + case 3: + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2)] = first + lasts; + ptrR[((size_t)rowR + (size_t)1) * ((size_t)colsR * (size_t)2) + (((size_t)colR + (size_t)1) * (size_t)2) + (size_t)1] = outer + inner; + break; + } + + } + } +} diff --git a/src/kernel_cpu.o b/src/kernel_cpu.o new file mode 100644 index 0000000000000000000000000000000000000000..baa933a9b828e1d9c8108dbc24b81fba60be4f7f GIT binary patch literal 3192 zcmbtWUuauZ7(X{DTXnjdNQKG-D+nrXVe9n8iDb0LUBt)`gDp7PG|QOupSHKs38fFI z(#uU<9{Nym4|yn@{mEh7L2xF9x~(aJNKOA=C0|c9=PXz z-|zc#&iQ`dxydAd>kXf#F*P*yI;&|4Wi0ndO%4k&%nq?fS=6xZ7}iA2u*R+%Ry1ox z<~uE(>9itOY(8)CqRj&q-?n+H#W!r;X7R!W{r80(J;=*SC@u3{O1XIyE89F{#8+&- zVayr&H3+*9v=w8f|1#kAOEBjg_ z_gZ$h`zm(D^E-MsU!%RzCLI-qAiquOdewTXstW5(QW4R`Ns5#qEs7!$j?gYn0g;lz zOG&<~p*W{_Mo-=PyHc_Fc75IMJ6X;-8At9Q%DlIG?PSUwO9ol`+>&HE3#Kz*dd`Z> zg6TAvPT71`zs6G*FWEc|35@Rw#*53mESMb-%oe}+YXV;AhB730p(7kDT2NRNlv0ju z>js)YThSIQPP73k5R`WyP_qu|W?DX#U6FC|w(1y@3t9sQwAET&G_@G&D|+g-W2}#M zI|%B)S~n3B6ohf1!Vu)>ZNa3pep6M2H3!aclp-CaOh>8PhU_Lv*~N1XPxrakZ%lUgyIEaTD|*$6WNEwem?9ZW(JPqF&0$K+Vj4_i8cSiC zmNHor<#fV(Wc!Q2$R3yR@xKiyqWw0QR!ZRO{ZMR&98QbA%?bZ8z&7I%*bYpdcdPS1Bqq7v}p z)@hQd5)Mk`0QwT4R22uM(g1yuP^yrFP74&a0Nwv?0_8_Qs6|rIFaf7mgcU6zRbjn} zt@-t-Brc1PF8}FBK7HyQ4hPJqU;fR(n0ZJXWMuP4akn-^ZRygB+LpbwRo8ii`UL$& zpMbq%Y6Vs?*tPin1leZqK8rbxsXo&x_`wTO+`fx$;qc-Y!HyP;_%BBChW4*cIoBX= zzeTq$?YH8?9JSG^4?1o-$xE8x|MQdgDivI3pSaE&dg{wEUFYwY*qM%wSKD6bO!R#a z8)`ez9%>IAKX&5f7o~`Dwa{h2&^~#GY2yLy$YTea)8OuDVD!+q3!R-l9Qe%F@%RD% z9SttR_L{IV_HCU#SGB({?LXnl*W!QhQ+%UAshZdymA&l#J^pbVhT{`1Tolc2}A6Sg#N_HP-37b{^3|Cu9Wk`rV{&y`dwmA`*=GAG1ew##_%-}k5pOM zgR6b?dT_N578<=YXvX^RHbI=u7ke&@#0C>`rT_Ojf^g#GfG15@>K`AhH;}J;JPU;|S?;RoYfqdq zc;lakfx6|t#ves2 +#include "context.h" +#include "openqasm.h" + +void display_help(); +void main(int argc, char** argv); + +#endif diff --git a/src/main.o b/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9397f003e3f38cac24613ede0c4b20b01f243b9c GIT binary patch literal 13744 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 literal 0 HcmV?d00001 diff --git a/src/openqasm.c b/src/openqasm.c index ee0367e..0873a83 100644 --- a/src/openqasm.c +++ b/src/openqasm.c @@ -1,3 +1,5 @@ +#include "openqasm.h" + int qansel_read_script(char* script, char*** chunksReturn, int** chunkLinesReturn, int* countReturn) { int scriptSize = strlen(script); diff --git a/src/openqasm.h b/src/openqasm.h new file mode 100644 index 0000000..55f4673 --- /dev/null +++ b/src/openqasm.h @@ -0,0 +1,18 @@ +#ifndef __OPENQASM_H__ +#define __OPENQASM_H__ + +#include +#include +#include +#include "qansel.h" +#include "context.h" +#include "bytecode.h" + +int qansel_read_script(char* script, char*** chunksReturn, int** chunkLinesReturn, int* countReturn); +float qansel_parse_float_part(char* neg, char* str); +int qansel_parse_float(char* str, float* returnFloat); +int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatches, int* qubitCount, int* bitCount, unsigned char** binary, int* binarySize, QAnselContext* ctx, int samplingshots); +int qansel_process_chunks(char** chunks, int* associatedLines, int count, unsigned char** retBinary, int* retSize, QAnselContext* ctx, int samplingshots); +int qanselBuildFromSource(char* source, unsigned char** binary, int* binarySize, QAnselContext* ctx); + +#endif \ No newline at end of file diff --git a/src/openqasm.o b/src/openqasm.o new file mode 100644 index 0000000000000000000000000000000000000000..46135d258be73aa5bb6516905d6f48a18609970c GIT binary patch literal 44968 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 XuyUwf;!t0E3Z-b8mu;-ITL1q69TO7b literal 0 HcmV?d00001 diff --git a/src/qansel.h b/src/qansel.h index a1a6782..eca34d6 100644 --- a/src/qansel.h +++ b/src/qansel.h @@ -2,42 +2,6 @@ #define __QANSEL_H__ #define QANSEL_MAX_SIZE 1073741824 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(_WIN32) || defined(_WIN64) -#include -#elif defined(__linux__) -#include -#include -#elif defined(__APPLE__) -#include -#endif - -#ifdef __SDL2__ -#include -#endif - -#ifdef __OPENCL__ -#define CL_USE_DEPRECATED_OPENCL_1_2_APIS -#define CL_TARGET_OPENCL_VERSION 300 -#include -#define gpuerr(x) if (err != CL_SUCCESS) { fprintf(stderr, "GPU Error on line %i: %s.\n", __LINE__, clGetErrorString(x)); exit(1); } -cl_platform_id cpx_mtx_platform_id; -cl_device_id cpx_mtx_device_id; -cl_context cpx_mtx_context; -cl_command_queue cpx_mtx_command_queue; -unsigned char* cpx_mtx_cache = NULL; -size_t cpx_mtx_cache_len = 0; -#endif #define QANSEL_SHOTS_DEFAULT 1000 #define QANSEL_QUBITS_MAX 16 @@ -94,40 +58,4 @@ size_t cpx_mtx_cache_len = 0; #define QANSEL_ALL_CLASSIC 0x3F #define QANSEL_ALL 0xFF -typedef struct -{ - unsigned char memory_limit; - unsigned char hardware_rng; - unsigned char verbose; - unsigned char optimization_level; - unsigned char sampling_bit; - float hidden_variable; - int display_delay; - int sampling_shots; - FILE* random_file; -} QAnselContext; - -typedef struct -{ - int size; - unsigned char bytes[16]; - int barrier_width; - unsigned char barrier[QANSEL_QUBITS_MAX * 2]; - int next; - int prev; - int checked; - int op; - unsigned char ifop[16]; - int use_ifop; -} QBytecode; - -#include "kernel_cpu.cl" -#include "kernel_gpu.cl" -#include "hardware.c" -#include "complex.c" -#include "context.c" -#include "gates.c" -#include "display.c" -#include "bytecode.c" -#include "openqasm.c" #endif \ No newline at end of file -- 2.39.5