From 8feea5907c00d412eb6a9dc55a919113e9416265 Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Mon, 18 Mar 2024 18:14:19 -0400 Subject: [PATCH] Mon Mar 18 06:14:19 PM EDT 2024 --- bin/QAnsel | Bin 171624 -> 186432 bytes examples/hiddenvariable.txt | 24 -- src/bytecode.c | 587 +++++++++++++++++++++++++----------- src/complex.c | 72 ++--- src/context.c | 111 +++++++ src/hardware.c | 30 +- src/main.c | 75 ++--- src/openqasm.c | 59 ++-- src/qansel.h | 78 +++-- 9 files changed, 680 insertions(+), 356 deletions(-) delete mode 100644 examples/hiddenvariable.txt create mode 100644 src/context.c diff --git a/bin/QAnsel b/bin/QAnsel index df10cea7c469d53137bdd117d6d6f409af83e528..347663844e56a383667a53a3863b25cce2464905 100755 GIT binary patch literal 186432 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 literal 171624 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 diff --git a/examples/hiddenvariable.txt b/examples/hiddenvariable.txt deleted file mode 100644 index 747d512..0000000 --- a/examples/hiddenvariable.txt +++ /dev/null @@ -1,24 +0,0 @@ -qreg q[1]; -creg c[4]; - -hvar 12.34; -h q[0]; measure q[0] -> c[0]; -h q[0]; measure q[0] -> c[1]; -h q[0]; measure q[0] -> c[2]; -h q[0]; measure q[0] -> c[3]; -print c; - -rand; -h q[0]; measure q[0] -> c[0]; -h q[0]; measure q[0] -> c[1]; -h q[0]; measure q[0] -> c[2]; -h q[0]; measure q[0] -> c[3]; -print c; - -hvar 43.21; -h q[0]; measure q[0] -> c[0]; -h q[0]; measure q[0] -> c[1]; -h q[0]; measure q[0] -> c[2]; -h q[0]; measure q[0] -> c[3]; -print c; - diff --git a/src/bytecode.c b/src/bytecode.c index ac53737..6db18a8 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -26,7 +26,6 @@ const char* qansel_instruction_to_string(unsigned char instr) case QANSEL_INSTRUCTION_CCX: return "QANSEL_INSTRUCTION_CCX"; case QANSEL_INSTRUCTION_CSWAP: return "QANSEL_INSTRUCTION_CSWAP"; case QANSEL_INSTRUCTION_MEASURE: return "QANSEL_INSTRUCTION_MEASURE"; - case QANSEL_INSTRUCTION_SAMPLE: return "QANSEL_INSTRUCTION_SAMPLE"; case QANSEL_INSTRUCTION_DENSITY: return "QANSEL_INSTRUCTION_DENSITY"; case QANSEL_INSTRUCTION_BORN: return "QANSEL_INSTRUCTION_BORN"; case QANSEL_INSTRUCTION_IF_E: return "QANSEL_INSTRUCTION_JUMP_E"; @@ -35,10 +34,8 @@ const char* qansel_instruction_to_string(unsigned char instr) case QANSEL_INSTRUCTION_IF_GE: return "QANSEL_INSTRUCTION_JUMP_GE"; case QANSEL_INSTRUCTION_IF_L: return "QANSEL_INSTRUCTION_JUMP_L"; case QANSEL_INSTRUCTION_IF_LE: return "QANSEL_INSTRUCTION_JUMP_LE"; - case QANSEL_INSTRUCTION_RAND: return "QANSEL_INSTRUCTION_RAND"; - case QANSEL_INSTRUCTION_HVAR: return "QANSEL_INSTRUCTION_HVAR"; - case QANSEL_INSTRUCTION_RESET: return "QANSEL_INSTRUCTION_RESET"; case QANSEL_INSTRUCTION_PRINT: return "QANSEL_INSTRUCTION_PRINT"; + case QANSEL_INSTRUCTION_RESET: return "QANSEL_INSTRUCTION_RESET"; case QANSEL_INSTRUCTION_BARRIER: return "QANSEL_INSTRUCTION_BARRIER"; case QANSEL_INSTRUCTION_EXIT: return "QANSEL_INSTRUCTION_EXIT"; } @@ -60,14 +57,20 @@ float qansel_rand_h() { return ((float)rand()) / ((float)RAND_MAX); } -float qansel_rand_t() +float qansel_rand_t(QAnselContext* ctx) { - if (QANSEL_RANDOM_FILE) + if (ctx->hardware_rng != QANSEL_HARDWARE_NONE) { unsigned int num = 0; for (unsigned char i = 0; i < 4; i++) { - num = (num << 8) | fgetc(QANSEL_RANDOM_FILE); + unsigned char r = 0; + switch (ctx->hardware_rng) + { + case QANSEL_HARDWARE_TRUERNG: r = fgetc(ctx->random_file); break; + case QANSEL_HARDWARE_RDSEED: r = qansel_hardware_rand(); break; + } + num = (num << 8) | r; } return ((float)num) / ((float)UINT32_MAX); } @@ -77,11 +80,6 @@ float qansel_rand_t() } } -float qansel_rand() -{ - return QANSEL_HIDDEN_VARIABLE ? qansel_rand_h() : qansel_rand_t(); -} - void qansel_cnot(cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char bitA, unsigned char bitB) { if (bitA >= qubitCount || bitB >= qubitCount) return; @@ -264,6 +262,7 @@ void qansel_instruction_queue void qansel_instruction ( + QAnselContext* ctx, cpx_mtx_t* stateVector, int qubitCount, unsigned char instr, @@ -381,11 +380,11 @@ void qansel_instruction //us2 = get_time(); //printf("\tTranspose: %lu\n", us2 - us1); #else - if ((QANSEL_MODE & QANSEL_MODE_METAL) && !(QANSEL_MODE & QANSEL_MODE_THREADED) && tmp.cols >= 64) + if (((ctx->optimization_level) & QANSEL_MODE_METAL) && !((ctx->optimization_level) & QANSEL_MODE_THREADED) && tmp.cols >= 64) { cpx_mtx_knk_metal_2x2(tmp.ptr, filter.ptr, gate.ptr, filter.rows, filter.cols, gate.rows, gate.cols); } - else if ((QANSEL_MODE & QANSEL_MODE_THREADED) && tmp.cols >= 64) + else if (((ctx->optimization_level) & QANSEL_MODE_THREADED) && tmp.cols >= 64) { cpx_mtx_knk_threads_2x2(tmp.ptr, filter.ptr, gate.ptr, filter.rows, filter.cols, gate.rows, gate.cols); } @@ -419,11 +418,11 @@ void qansel_instruction us2 = get_time(); printf("\tBare: %lu\n", us2 - us1); #else - if ((QANSEL_MODE & QANSEL_MODE_METAL) && tmp.cols >= 64) + if (((ctx->optimization_level) & QANSEL_MODE_METAL) && tmp.cols >= 64) { cpx_mtx_dot_metal(tmp.ptr, stateVector->ptr, filter.ptr, stateVector->rows, stateVector->cols, filter.rows, filter.cols); } - else if ((QANSEL_MODE & QANSEL_MODE_THREADED) && tmp.cols >= 64) + else if (((ctx->optimization_level) & QANSEL_MODE_THREADED) && tmp.cols >= 64) { cpx_mtx_dot_threads(tmp.ptr, stateVector->ptr, filter.ptr, stateVector->rows, stateVector->cols, filter.rows, filter.cols); } @@ -438,7 +437,7 @@ void qansel_instruction if (needToFreeGate) free(gate_ptr); } -unsigned char qansel_measure(cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char qubit) +unsigned char qansel_measure(QAnselContext* ctx, cpx_mtx_t* stateVector, unsigned char qubitCount, unsigned char qubit) { unsigned int qubitCountPow2 = (unsigned int)pow(2, qubitCount); cpx_t n; @@ -450,7 +449,7 @@ unsigned char qansel_measure(cpx_mtx_t* stateVector, unsigned char qubitCount, u if (bit == 0) prob0 += cpx_magsqr(&n); } - float r = qansel_rand(); + float r = (ctx->hidden_variable) ? qansel_rand_h() : qansel_rand_t(ctx); unsigned char newBit = r < prob0 ? 0 : 1; float probTot = 0; for (unsigned int i = 0; i < qubitCountPow2; i++) @@ -511,7 +510,6 @@ int qansel_get_instruction_bitmax(unsigned char* ptr, int offset, int* bitmax, i if (a0 > QANSEL_QBOUND_UPPER && a0 != QANSEL_ALL_QUANTUM) return 0; if (a0 != QANSEL_ALL_QUANTUM) *qbitmax = a0 + 1; return 1; - case QANSEL_INSTRUCTION_SAMPLE: case QANSEL_INSTRUCTION_IF_E: case QANSEL_INSTRUCTION_IF_NE: case QANSEL_INSTRUCTION_IF_G: @@ -563,23 +561,53 @@ int qansel_get_instruction_bitmax(unsigned char* ptr, int offset, int* bitmax, i *qbitmax = a0 + 1; *bitmax = (a1 - QANSEL_CBOUND_LOWER) + 1; return 1; - case QANSEL_INSTRUCTION_RAND: - case QANSEL_INSTRUCTION_HVAR: case QANSEL_INSTRUCTION_EXIT: return 1; } return 0; } -int qansel_get_barrier(int** q, int qubitCount, int bitCount, unsigned char* binary, int pos) +int qansel_get_instruction_size(unsigned char instr) { - - unsigned char instr = binary[pos]; switch (instr) { - case QANSEL_INSTRUCTION_SAMPLE: - case QANSEL_INSTRUCTION_RAND: - case QANSEL_INSTRUCTION_HVAR: + case QANSEL_INSTRUCTION_X: return 1 + 1; + case QANSEL_INSTRUCTION_Y: return 1 + 1; + case QANSEL_INSTRUCTION_Z: return 1 + 1; + case QANSEL_INSTRUCTION_H: return 1 + 1; + case QANSEL_INSTRUCTION_S: return 1 + 1; + case QANSEL_INSTRUCTION_T: return 1 + 1; + case QANSEL_INSTRUCTION_RX: return 1 + 1 + sizeof(float); + case QANSEL_INSTRUCTION_RY: return 1 + 1 + sizeof(float); + case QANSEL_INSTRUCTION_RZ: return 1 + 1 + sizeof(float); + case QANSEL_INSTRUCTION_U1: return 1 + 1 + sizeof(float); + case QANSEL_INSTRUCTION_U2: return 1 + 1 + sizeof(float) * 2; + case QANSEL_INSTRUCTION_U3: return 1 + 1 + sizeof(float) * 3; + case QANSEL_INSTRUCTION_CX: return 1 + 2; + case QANSEL_INSTRUCTION_SWAP: return 1 + 2; + case QANSEL_INSTRUCTION_CCX: return 1 + 3; + case QANSEL_INSTRUCTION_CSWAP: return 1 + 3; + case QANSEL_INSTRUCTION_MEASURE: return 1 + 2; + case QANSEL_INSTRUCTION_DENSITY: return 1 + 1; + case QANSEL_INSTRUCTION_BORN: return 1 + 1; + case QANSEL_INSTRUCTION_IF_E: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_IF_NE: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_IF_G: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_IF_GE: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_IF_L: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_IF_LE: return 1 + 1 + sizeof(unsigned short); + case QANSEL_INSTRUCTION_RESET: return 1 + 1; + case QANSEL_INSTRUCTION_PRINT: return 1 + 1; + case QANSEL_INSTRUCTION_BARRIER: return 1 + 1; + case QANSEL_INSTRUCTION_EXIT: return 1; + } + return 0; +} + +void qansel_get_barrier(QBytecode** qbc, int idx) +{ + switch ((*qbc)[idx].op) + { case QANSEL_INSTRUCTION_EXIT: case QANSEL_INSTRUCTION_IF_E: case QANSEL_INSTRUCTION_IF_NE: @@ -587,8 +615,8 @@ int qansel_get_barrier(int** q, int qubitCount, int bitCount, unsigned char* bin case QANSEL_INSTRUCTION_IF_GE: case QANSEL_INSTRUCTION_IF_L: case QANSEL_INSTRUCTION_IF_LE: - *q = NULL; - return 0; + (*qbc)[idx].barrier_width = 0; + return; case QANSEL_INSTRUCTION_X: case QANSEL_INSTRUCTION_Y: case QANSEL_INSTRUCTION_Z: @@ -601,122 +629,55 @@ int qansel_get_barrier(int** q, int qubitCount, int bitCount, unsigned char* bin case QANSEL_INSTRUCTION_U1: case QANSEL_INSTRUCTION_U2: case QANSEL_INSTRUCTION_U3: - //only barrier single-qubit instructions if - // they are nexted in an if statement - if (pos >= (1 + sizeof(unsigned short))) - { - switch (binary[pos - (1 + sizeof(unsigned short))]) - { - case QANSEL_INSTRUCTION_IF_E: - case QANSEL_INSTRUCTION_IF_NE: - case QANSEL_INSTRUCTION_IF_G: - case QANSEL_INSTRUCTION_IF_GE: - case QANSEL_INSTRUCTION_IF_L: - case QANSEL_INSTRUCTION_IF_LE: - *q = malloc(1); - (*q)[0] = binary[pos + 1] + QANSEL_QBOUND_LOWER; - return 1; - } - } - *q = NULL; - return 0; + (*qbc)[idx].barrier_width = 1; + (*qbc)[idx].barrier[0] = (*qbc)[idx].bytes[1]; + return; case QANSEL_INSTRUCTION_MEASURE: case QANSEL_INSTRUCTION_DENSITY: - *q = malloc(2); - (*q)[0] = binary[pos + 1] + QANSEL_QBOUND_LOWER; - (*q)[1] = binary[pos + 2] + QANSEL_CBOUND_LOWER; - return 1; + (*qbc)[idx].barrier_width = 2; + (*qbc)[idx].barrier[0] = (*qbc)[idx].bytes[1]; + (*qbc)[idx].barrier[1] = (*qbc)[idx].bytes[2]; + return; case QANSEL_INSTRUCTION_BORN: case QANSEL_INSTRUCTION_BARRIER: case QANSEL_INSTRUCTION_PRINT: case QANSEL_INSTRUCTION_RESET: - switch (binary[pos + 1]) + switch ((*qbc)[idx].bytes[1]) { case QANSEL_ALL: - *q = malloc(sizeof(int) * (qubitCount + bitCount)); - for (int i = 0; i < qubitCount; i++) - { - (*q)[i] = i + QANSEL_QBOUND_LOWER; - } - for (int i = 0; i < bitCount; i++) - { - (*q)[i] = i + QANSEL_CBOUND_LOWER; - } - return qubitCount + bitCount; + (*qbc)[idx].barrier_width = QANSEL_QUBITS_MAX * 2; + for (int i = 0; i < QANSEL_QUBITS_MAX; i++) (*qbc)[idx].barrier[i] = i; + for (int i = 0; i < QANSEL_QUBITS_MAX; i++) (*qbc)[idx].barrier[i] = i + QANSEL_CBOUND_LOWER; + return; case QANSEL_ALL_QUANTUM: - *q = malloc(sizeof(int) * qubitCount); - for (int i = 0; i < qubitCount; i++) - { - (*q)[i] = i + QANSEL_QBOUND_LOWER; - } - return qubitCount; + (*qbc)[idx].barrier_width = QANSEL_QUBITS_MAX; + for (int i = 0; i < QANSEL_QUBITS_MAX; i++) (*qbc)[idx].barrier[i] = i; + return; case QANSEL_ALL_CLASSIC: - *q = malloc(sizeof(int) * bitCount); - for (int i = 0; i < bitCount; i++) - { - (*q)[i] = i + QANSEL_CBOUND_LOWER; - } - return bitCount; + (*qbc)[idx].barrier_width = QANSEL_QUBITS_MAX; + for (int i = 0; i < QANSEL_QUBITS_MAX; i++) (*qbc)[idx].barrier[i] = i + QANSEL_CBOUND_LOWER; + return; default: - *q = malloc(1); - (*q)[0] = binary[pos + 1]; - return 1; + (*qbc)[idx].barrier_width = 1; + (*qbc)[idx].barrier[0] = (*qbc)[idx].bytes[1]; + return; } case QANSEL_INSTRUCTION_CX: case QANSEL_INSTRUCTION_SWAP: - *q = malloc(2); - (*q)[0] = binary[pos + 1] + QANSEL_QBOUND_LOWER; - (*q)[1] = binary[pos + 2] + QANSEL_QBOUND_LOWER; - return 2; + (*qbc)[idx].barrier_width = 2; + (*qbc)[idx].barrier[0] = (*qbc)[idx].bytes[1]; + (*qbc)[idx].barrier[1] = (*qbc)[idx].bytes[2]; + return; case QANSEL_INSTRUCTION_CCX: case QANSEL_INSTRUCTION_CSWAP: - *q = malloc(3); - (*q)[0] = binary[pos + 1] + QANSEL_QBOUND_LOWER; - (*q)[1] = binary[pos + 2] + QANSEL_QBOUND_LOWER; - (*q)[2] = binary[pos + 3] + QANSEL_QBOUND_LOWER; - return 3; - } - fprintf(stderr, "QAnsel (%04X): Unknown error in barrier analysis.\n", pos); -} - -int qansel_get_instruction_size(unsigned char instr) -{ - switch (instr) - { - case QANSEL_INSTRUCTION_X: return 1 + 1; - case QANSEL_INSTRUCTION_Y: return 1 + 1; - case QANSEL_INSTRUCTION_Z: return 1 + 1; - case QANSEL_INSTRUCTION_H: return 1 + 1; - case QANSEL_INSTRUCTION_S: return 1 + 1; - case QANSEL_INSTRUCTION_T: return 1 + 1; - case QANSEL_INSTRUCTION_RX: return 1 + 1 + sizeof(float); - case QANSEL_INSTRUCTION_RY: return 1 + 1 + sizeof(float); - case QANSEL_INSTRUCTION_RZ: return 1 + 1 + sizeof(float); - case QANSEL_INSTRUCTION_U1: return 1 + 1 + sizeof(float); - case QANSEL_INSTRUCTION_U2: return 1 + 1 + sizeof(float) * 2; - case QANSEL_INSTRUCTION_U3: return 1 + 1 + sizeof(float) * 3; - case QANSEL_INSTRUCTION_CX: return 1 + 2; - case QANSEL_INSTRUCTION_SWAP: return 1 + 2; - case QANSEL_INSTRUCTION_CCX: return 1 + 3; - case QANSEL_INSTRUCTION_CSWAP: return 1 + 3; - case QANSEL_INSTRUCTION_MEASURE: return 1 + 2; - case QANSEL_INSTRUCTION_SAMPLE: return 1 + 1; - case QANSEL_INSTRUCTION_DENSITY: return 1 + 1; - case QANSEL_INSTRUCTION_BORN: return 1 + 1; - case QANSEL_INSTRUCTION_IF_E: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_IF_NE: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_IF_G: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_IF_GE: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_IF_L: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_IF_LE: return 1 + 1 + sizeof(unsigned short); - case QANSEL_INSTRUCTION_RAND: return 1; - case QANSEL_INSTRUCTION_HVAR: return 1 + sizeof(float); - case QANSEL_INSTRUCTION_RESET: return 1 + 1; - case QANSEL_INSTRUCTION_PRINT: return 1 + 1; - case QANSEL_INSTRUCTION_BARRIER: return 1 + 1; - case QANSEL_INSTRUCTION_EXIT: return 1; + (*qbc)[idx].barrier_width = 3; + (*qbc)[idx].barrier[0] = (*qbc)[idx].bytes[1]; + (*qbc)[idx].barrier[1] = (*qbc)[idx].bytes[2]; + (*qbc)[idx].barrier[2] = (*qbc)[idx].bytes[3]; + return; } - return 0; + fprintf(stderr, "QAnsel (#%i): Unknown error in barrier analysis.\n", idx); + exit(1); } void qansel_born(cpx_mtx_t* stateVector, int PC, int qubitCount, unsigned char q0) @@ -870,7 +831,7 @@ int qansel_get_int(unsigned char* program, int offset) return ret; } -void qansel_reset(cpx_mtx_t* stateVector, unsigned char* bitVector, int qubitCount, int bitCount, unsigned char q0) +void qansel_reset(QAnselContext* ctx, cpx_mtx_t* stateVector, unsigned char* bitVector, int qubitCount, int bitCount, unsigned char q0) { unsigned int qubitCountPow2 = (unsigned int)pow(2, qubitCount); if (q0 == QANSEL_ALL) @@ -902,10 +863,10 @@ void qansel_reset(cpx_mtx_t* stateVector, unsigned char* bitVector, int qubitCou } else if (q0 <= QANSEL_QBOUND_UPPER) { - unsigned char bit = qansel_measure(stateVector, qubitCount, q0); + unsigned char bit = qansel_measure(ctx, stateVector, qubitCount, q0); if (bit) { - qansel_instruction(stateVector, qubitCount, QANSEL_INSTRUCTION_X, q0, 0, 0, 0, NULL); + qansel_instruction(ctx, stateVector, qubitCount, QANSEL_INSTRUCTION_X, q0, 0, 0, 0, NULL); } } else if (q0 >= QANSEL_CBOUND_LOWER && q0 <= QANSEL_CBOUND_UPPER) @@ -939,27 +900,62 @@ unsigned char qansel_compare(unsigned char* bitVector, int bitCount, int PC, uns return ret; } -int qansel_crawl(unsigned char* program, int programSize, int* qubitCount, int* bitCount, int* sample) +//computes program efficiency +// points are awarded for how long strings of single qubit +// instructions are +int qansel_efficiency(QBytecode* program, int programSize, int head) { - if (QANSEL_VERBOSE) printf("Crawling program . . .\n"); + int score = 0; + int tmpscore = 0; + int idx = head; + + for (int i = 0; i < programSize; i++) + { + switch (program[idx].op) + { + case QANSEL_INSTRUCTION_X: + case QANSEL_INSTRUCTION_Y: + case QANSEL_INSTRUCTION_Z: + case QANSEL_INSTRUCTION_H: + case QANSEL_INSTRUCTION_S: + case QANSEL_INSTRUCTION_T: + case QANSEL_INSTRUCTION_RX: + case QANSEL_INSTRUCTION_RY: + case QANSEL_INSTRUCTION_RZ: + case QANSEL_INSTRUCTION_U1: + case QANSEL_INSTRUCTION_U2: + case QANSEL_INSTRUCTION_U3: + switch (tmpscore) + { + case 0: tmpscore = 1; break; + default: tmpscore *= 2; + } + break; + case QANSEL_INSTRUCTION_IF_E: + case QANSEL_INSTRUCTION_IF_NE: + case QANSEL_INSTRUCTION_IF_G: + case QANSEL_INSTRUCTION_IF_GE: + case QANSEL_INSTRUCTION_IF_L: + case QANSEL_INSTRUCTION_IF_LE: + break; + default: + if (tmpscore > 1) score += tmpscore; + tmpscore = 0; + } + idx = program[idx].next; + } + return score; +} + +int qansel_crawl(QAnselContext* ctx, unsigned char* program, int programSize, int* qubitCount, int* bitCount) +{ + if (ctx->verbose) printf("Crawling program . . .\n"); int PC = 0; *qubitCount = 0; *bitCount = 0; - *sample = QANSEL_ALL; while (PC < programSize) { int next = qansel_get_instruction_size(program[PC]); - if (program[PC] == QANSEL_INSTRUCTION_SAMPLE) - { - if ((program[PC + 1] < QANSEL_CBOUND_LOWER || program[PC + 1] > QANSEL_CBOUND_UPPER) && program[PC + 1] != QANSEL_ALL_CLASSIC) - { - if (QANSEL_VERBOSE) fprintf(stderr, "QAnsel (%04X): Invalid index.\n", PC); - } - else - { - *sample = program[PC + 1] - QANSEL_CBOUND_LOWER; - } - } if (next == 0) { printf("QAnsel (%04X): Invalid instruction 0x%02x.\n", PC, program[PC]); @@ -976,14 +972,249 @@ int qansel_crawl(unsigned char* program, int programSize, int* qubitCount, int* if (qbitmax > *qubitCount) *qubitCount = qbitmax; PC += next; } - if (QANSEL_VERBOSE) printf("Quantum bits allocated: %i\n", *qubitCount); - if (QANSEL_VERBOSE) printf("Classical bits allocated: %i\n", *bitCount); + if (ctx->verbose) printf("Quantum bits allocated: %i\n", *qubitCount); + if (ctx->verbose) printf("Classical bits allocated: %i\n", *bitCount); + return 1; } -void qansel_run(unsigned char* program, int programSize, int qubitCount, int bitCount, unsigned char* outputBitVector) +void qansel_reorder(QAnselContext* ctx, unsigned char* program, int programSize) { - int useQueue = (QANSEL_MODE & QANSEL_MODE_QUEUE) ? 1 : 0; + if (ctx->verbose) printf("Reordering . . .\n"); + + //break out program for easier manipulation + QBytecode* ramInstr = malloc(0); + int ramInstrLen = 0; + int copyifop = 0; + unsigned char ifop[16]; + int PC = 0; + + while (PC < programSize) + { + int next = qansel_get_instruction_size(program[PC]); + switch (program[PC]) + { + case QANSEL_INSTRUCTION_IF_E: + case QANSEL_INSTRUCTION_IF_NE: + case QANSEL_INSTRUCTION_IF_G: + case QANSEL_INSTRUCTION_IF_GE: + case QANSEL_INSTRUCTION_IF_L: + case QANSEL_INSTRUCTION_IF_LE: + memcpy(ifop, program + PC, next); + copyifop = 1; + PC += next; + continue; + } + ramInstr = realloc(ramInstr, sizeof(QBytecode) * (ramInstrLen + 1)); + ramInstr[ramInstrLen].size = next; + memcpy(ramInstr[ramInstrLen].bytes, program + PC, next); + ramInstr[ramInstrLen].op = program[PC]; + ramInstr[ramInstrLen].use_ifop = copyifop; + if (copyifop) + { + memcpy(ramInstr[ramInstrLen].ifop, ifop, sizeof(ifop)); + copyifop = 0; + } + ramInstrLen++; + PC += next; + } + for (int i = 0; i < ramInstrLen; i++) + { + if (i == 0) + { + ramInstr[0].prev = -1; + ramInstr[0].next = ramInstrLen > 1 ? 1 : -1; + } + else if (i == ramInstrLen - 1) + { + ramInstr[ramInstrLen - 1].prev = i - 1; + ramInstr[ramInstrLen - 1].next = -1; + } + else + { + ramInstr[i].prev = i - 1; + ramInstr[i].next = i + 1; + } + //we can only rearrange single-qubit instructions + // so treat other instructions as pre-checked + switch (ramInstr[i].op) + { + case QANSEL_INSTRUCTION_X: + case QANSEL_INSTRUCTION_Y: + case QANSEL_INSTRUCTION_Z: + case QANSEL_INSTRUCTION_H: + case QANSEL_INSTRUCTION_S: + case QANSEL_INSTRUCTION_T: + case QANSEL_INSTRUCTION_RX: + case QANSEL_INSTRUCTION_RY: + case QANSEL_INSTRUCTION_RZ: + case QANSEL_INSTRUCTION_U1: + case QANSEL_INSTRUCTION_U2: + case QANSEL_INSTRUCTION_U3: + ramInstr[i].checked = 0; + break; + default: ramInstr[i].checked = 1; + } + } + + for (int i = 0; i < ramInstrLen; i++) + { + qansel_get_barrier(&ramInstr, i); + } + + QBytecode* reordered[2]; + reordered[0] = malloc(ramInstrLen * sizeof(QBytecode)); + reordered[1] = malloc(ramInstrLen * sizeof(QBytecode)); + memcpy(reordered[0], ramInstr, ramInstrLen * sizeof(QBytecode)); + memcpy(reordered[1], ramInstr, ramInstrLen * sizeof(QBytecode)); + + int efficiency = qansel_efficiency(ramInstr, ramInstrLen, 0); + int head[2]; + head[0] = 0; + head[1] = 0; + for (int reorid = 0; reorid < 2; reorid++) + { + while (1) + { + //find the next unchecked instruction + int found = -1; + int idx = head[reorid]; + for (int i = 0; i < ramInstrLen; i++) + { + if (reordered[reorid][idx].checked == 0) + { + found = idx; + break; + } + idx = reordered[reorid][idx].next; + } + if (found == -1) break; + //check if it can be moved up + reordered[reorid][found].checked = 1; + int blocked = 0; + idx = reordered[reorid][idx].prev; + while (idx != -1) + { + for (int i = 0; i < reordered[reorid][idx].barrier_width; i++) + { + //verify no classical bit barrier + if (reordered[reorid][found].use_ifop) + { + switch (reordered[reorid][found].ifop[1]) + { + case QANSEL_ALL_CLASSIC: + case QANSEL_ALL: + blocked = 1; + break; + default: + if (reordered[reorid][found].ifop[1] == reordered[reorid][idx].barrier[i]) + blocked = 1; + } + if (blocked) break; + } + //verify no quantum bit barrier + if (reordered[reorid][found].bytes[1] == reordered[reorid][idx].barrier[i]) + { + blocked = 1; + break; + } + } + if (blocked) break; + idx = reordered[reorid][idx].prev; + } + if (reordered[reorid][found].prev != idx) + { + QBytecode* tmpbc = malloc(ramInstrLen * sizeof(QBytecode)); + memcpy(tmpbc, reordered[reorid], ramInstrLen * sizeof(QBytecode)); + reordered[reorid][ reordered[reorid][found].prev ].next = reordered[reorid][found].next; + if (reordered[reorid][found].next != -1) + { + reordered[reorid][ reordered[reorid][found].next ].prev = reordered[reorid][found].prev; + } + + if (idx == -1) + { + reordered[reorid][head[reorid]].prev = found; + reordered[reorid][found].next = head[reorid]; + reordered[reorid][found].prev = -1; + head[reorid] = found; + } + else + { + reordered[reorid][ reordered[reorid][idx].next ].prev = found; + reordered[reorid][found].next = reordered[reorid][idx].next; + reordered[reorid][found].prev = idx; + reordered[reorid][idx].next = found; + } + if (reorid == 1) + { + int tmpeff = qansel_efficiency(reordered[reorid], ramInstrLen, head[reorid]); + if (tmpeff >= efficiency) + { + efficiency = tmpeff; + } + else + { + memcpy(reordered[reorid], tmpbc, ramInstrLen * sizeof(QBytecode)); + } + } + free(tmpbc); + } + } + } + + efficiency = qansel_efficiency(ramInstr, ramInstrLen, 0); + int best = -1; + int besti = -1; + for (int i = 0; i < 2; i++) + { + int tmpeff = qansel_efficiency(reordered[i], ramInstrLen, head[i]); + if (tmpeff > best) + { + besti = i; + best = tmpeff; + } + } + if (best > efficiency) + { + memcpy(ramInstr, reordered[besti], ramInstrLen * sizeof(QBytecode)); + } + for (int i = 0; i < 2; i++) + { + free(reordered[i]); + } + + int copyloc = 0; + for (int i = 0; i < ramInstrLen; i++) + { + int next; + if (ramInstr[i].use_ifop) + { + next = qansel_get_instruction_size(ramInstr[i].ifop[0]); + memcpy(program + copyloc, ramInstr[i].ifop, next); + copyloc += next; + } + next = qansel_get_instruction_size(ramInstr[i].op); + memcpy(program + copyloc, ramInstr[i].bytes, next); + copyloc += next; + } + + if (ctx->verbose) + { + if (best > efficiency) + { + printf("Efficiency score increased from %i to %i.\n", efficiency, best); + } + else + { + printf("Could not increase efficiency.\n"); + } + } +} + +void qansel_run(QAnselContext* ctx, unsigned char* program, int programSize, int qubitCount, int bitCount, unsigned char* outputBitVector) +{ + int useQueue = ((ctx->optimization_level) & QANSEL_MODE_QUEUE) ? 1 : 0; int PC = 0; unsigned int qubitCountPow2 = (unsigned int)pow(2, qubitCount); unsigned char bitVector[bitCount]; @@ -1003,7 +1234,7 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit queueVector[i].cols = 2; } } - if (QANSEL_USE_DISPLAY) { QANSEL_USE_DISPLAY = display(&stateVector, qubitCount, QANSEL_USE_DISPLAY); } + if (ctx->display_delay) { ctx->display_delay = display(&stateVector, qubitCount, ctx->display_delay); } unsigned char skip = 0, a0 = 0, a1 = 0, a2 = 0; unsigned char flags = 0; unsigned short tmp = 0; @@ -1051,12 +1282,9 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit case QANSEL_INSTRUCTION_IF_GE: case QANSEL_INSTRUCTION_IF_L: case QANSEL_INSTRUCTION_IF_LE: - case QANSEL_INSTRUCTION_SAMPLE: - case QANSEL_INSTRUCTION_HVAR: - case QANSEL_INSTRUCTION_RAND: break; default: - qansel_instruction(&stateVector, qubitCount, instr, 0, 0, 0, 0, &queueVector); + qansel_instruction(ctx, &stateVector, qubitCount, instr, 0, 0, 0, 0, &queueVector); for (int i = 0; i < qubitCount; i++) { memcpy(queueVector[i].ptr, Identity, sizeof(Identity)); @@ -1116,7 +1344,7 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit } a0 = program[PC + 1]; if (useQueue) qansel_instruction_queue(&queueVector, qubitCount, instr, a0, f0, f1, f2); - else qansel_instruction(&stateVector, qubitCount, instr, a0, f0, f1, f2, NULL); + else qansel_instruction(ctx, &stateVector, qubitCount, instr, a0, f0, f1, f2, NULL); break; case QANSEL_INSTRUCTION_CX: a0 = program[PC + 1]; @@ -1143,7 +1371,7 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit case QANSEL_INSTRUCTION_MEASURE: a0 = program[PC + 1]; a1 = program[PC + 2] - QANSEL_CBOUND_LOWER; - bitVector[a1] = qansel_measure(&stateVector, qubitCount, a0); + bitVector[a1] = qansel_measure(ctx, &stateVector, qubitCount, a0); break; case QANSEL_INSTRUCTION_BORN: a0 = program[PC + 1]; @@ -1162,17 +1390,7 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit break; case QANSEL_INSTRUCTION_RESET: a0 = program[PC + 1]; - qansel_reset(&stateVector, bitVector, qubitCount, bitCount, a0); - break; - case QANSEL_INSTRUCTION_HVAR: - QANSEL_HIDDEN_VARIABLE = 1; - float tmp1 = qansel_get_float(program, PC + 1); - unsigned int tmp2; - memcpy(&tmp2, &tmp1, sizeof(unsigned int)); - srand(tmp2); - break; - case QANSEL_INSTRUCTION_RAND: - QANSEL_HIDDEN_VARIABLE = 0; + qansel_reset(ctx, &stateVector, bitVector, qubitCount, bitCount, a0); break; case QANSEL_INSTRUCTION_IF_E: a0 = program[PC + 1]; @@ -1210,12 +1428,11 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit flags = qansel_compare(bitVector, bitCount, PC, a0, tmp); skip = 1; if ((flags & QANSEL_FLAGS_LESSER) && (flags & QANSEL_FLAGS_EQUAL)) skip = 0; break; - case QANSEL_INSTRUCTION_SAMPLE: break; } } PC += next; - if (QANSEL_USE_DISPLAY) { QANSEL_USE_DISPLAY = display(&stateVector, qubitCount, QANSEL_USE_DISPLAY); } + if (ctx->display_delay) { ctx->display_delay = display(&stateVector, qubitCount, ctx->display_delay); } } if (outputBitVector != NULL) { @@ -1233,28 +1450,36 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit } free(queueVector); } - if (QANSEL_USE_DISPLAY) { display(NULL, 0, 0); } + if (ctx->display_delay) { display(NULL, 0, 0); } } -int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff) +int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff, QAnselContext* ctx) { + if (!qanselContextValidate(ctx)) return 0; struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); float seed = (float)((unsigned long)ts.tv_sec * 1000000000LL + ts.tv_nsec); qansel_rand_s(seed); + if (ctx != NULL && ctx->hidden_variable != 0) + { + unsigned int tmp; + memcpy(&tmp, &(ctx->hidden_variable), sizeof(unsigned int)); + srand(tmp); + } + unsigned short vals; float valf; int pos = 0; - int qubitCount, bitCount, sample; - if (!qansel_crawl(buff, sizeofbuff, &qubitCount, &bitCount, &sample)) + int qubitCount, bitCount; + if (!qansel_crawl(ctx, buff, sizeofbuff, &qubitCount, &bitCount)) { return 0; } - if (sample != QANSEL_ALL) + if (ctx != NULL && ctx->sampling_shots > 0) { unsigned short stats[65536]; for (unsigned int i = 0; i < (1 << bitCount); i++) @@ -1264,10 +1489,10 @@ int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff) unsigned char bitVect[bitCount]; memset(bitVect, 0, bitCount); for (int i = 0; i < bitCount; i++) bitVect[i] = 0; - unsigned int shots = QANSEL_SAMPLE_COUNT; + unsigned int shots = ctx->sampling_shots; for (unsigned int i = 0; i < shots; i++) { - qansel_run(buff, sizeofbuff, qubitCount, bitCount, bitVect); + qansel_run(ctx, buff, sizeofbuff, qubitCount, bitCount, bitVect); unsigned short stat = 0; for (signed char j = bitCount - 1; j >= 0; j--) { @@ -1282,22 +1507,22 @@ int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff) for (unsigned char j = 0; j < bitCount; j++) { unsigned char bit = (tmp >> (bitCount - 1) & 1); - if (j == (bitCount - sample - 1) && bit) + if (j == (bitCount - (ctx->sampling_bit) - 1) && bit) { count += stats[i]; } - if (sample == QANSEL_ALL_QUANTUM) + if ((ctx->sampling_bit) == QANSEL_ALL) { putchar('0' + bit); } tmp <<= 1; } - if (sample == QANSEL_ALL_QUANTUM) + if ((ctx->sampling_bit) == QANSEL_ALL) { printf(": %.1f%%\n", ((float)stats[i] / (float)shots) * (float)100); } } - if (sample != QANSEL_ALL_QUANTUM) + if ((ctx->sampling_bit) != QANSEL_ALL) { float prob = ((float)count / (float)shots) * (float)100; printf("0: %.1f%%\n", ((float)100)-prob); @@ -1306,7 +1531,7 @@ int qanselExecuteBytecode(unsigned char* buff, int sizeofbuff) } else { - qansel_run(buff, sizeofbuff, qubitCount, bitCount, NULL); + qansel_run(ctx, buff, sizeofbuff, qubitCount, bitCount, NULL); } return 1; } diff --git a/src/complex.c b/src/complex.c index f9481e8..bc1d3d7 100644 --- a/src/complex.c +++ b/src/complex.c @@ -1,13 +1,5 @@ #ifndef __cpx__ #define __cpx__ -#include -#include -#include -#include -#include -#include "hardware.c" -#include "kernel_cpu.cl" -#include "kernel_gpu.cl" typedef struct { float real, imaginary; @@ -19,9 +11,9 @@ typedef struct int rows, cols; } cpx_mtx_t; -uint8_t* cpx_str(cpx_t* n) +unsigned char* cpx_str(cpx_t* n) { - uint8_t* r; + unsigned char* r; int z; float rl = n->real; @@ -35,7 +27,7 @@ uint8_t* cpx_str(cpx_t* n) } else { - uint8_t op = n->imaginary >= 0 ? '+' : '-'; + unsigned char op = n->imaginary >= 0 ? '+' : '-'; z = snprintf(NULL, 0, "%f %c %fi", rl, op, ig); r = malloc(z + 1); sprintf(r, "%f %c %fi", rl, op, ig); @@ -149,7 +141,7 @@ void cpx_mtx_print(cpx_mtx_t* m) { cpx_t n; cpx_mtx_get(m, r, c, &n); - uint8_t* s = cpx_str(&n); + unsigned char* s = cpx_str(&n); if (c > 0) printf(", "); printf("%s", s); free(s); @@ -218,7 +210,7 @@ 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) { int delimeter = rowsA * rowsB; - int cores = get_core_count(); + int cores = qansel_get_core_count(); int threadCount = cores; if (threadCount > delimeter) threadCount = delimeter; int delimetersPerThread = delimeter / threadCount; @@ -245,7 +237,7 @@ void cpx_mtx_knk_threads(float* ptrR, float* ptrA, float* ptrB, int rowsA, int c exit(1); } } - for (uint32_t i = 0; i < threadCount; i++) + for (unsigned int i = 0; i < threadCount; i++) { if (pthread_join(threads[i], NULL)) { @@ -283,7 +275,7 @@ 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) { int delimeter = (rowsA * rowsB) / 2; - int cores = get_core_count(); + int cores = qansel_get_core_count(); int threadCount = cores; if (threadCount > delimeter) threadCount = delimeter; int delimetersPerThread = delimeter / threadCount; @@ -310,7 +302,7 @@ void cpx_mtx_knk_threads_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, i exit(1); } } - for (uint32_t i = 0; i < threadCount; i++) + for (unsigned int i = 0; i < threadCount; i++) { if (pthread_join(threads[i], NULL)) { @@ -334,7 +326,7 @@ 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) { int delimeter = colsB; - int cores = get_core_count(); + int cores = qansel_get_core_count(); int threadCount = cores; if (threadCount > delimeter) threadCount = delimeter; int delimeterPerThread = delimeter / threadCount; @@ -360,7 +352,7 @@ void cpx_mtx_dot_threads(float* ptrR, float* ptrA, float* ptrB, int rowsA, int c exit(1); } } - for (uint32_t i = 0; i < threadCount; i++) + for (unsigned int i = 0; i < threadCount; i++) { if (pthread_join(threads[i], NULL)) { @@ -458,7 +450,7 @@ const char* clGetErrorString(cl_int err) } -uint8_t cpx_mtx_begin() +unsigned char cpx_mtx_begin(unsigned char verbose) { cl_uint count; cl_int err; @@ -467,9 +459,9 @@ uint8_t cpx_mtx_begin() if (err != CL_SUCCESS || count == 0) { if (err == 0) - fprintf(stderr, "GPU error: No supported platforms found.\n"); + fprintf(stderr, "QAnsel (GPU): No supported platforms found.\n"); else - fprintf(stderr, "GPU error: clGetPlatformIDs() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clGetPlatformIDs() failed.\n"); return 0; } @@ -477,32 +469,42 @@ uint8_t cpx_mtx_begin() if (err != CL_SUCCESS || count == 0) { if (count == 0) - fprintf(stderr, "GPU error: No supported GPUs found.\n"); + fprintf(stderr, "QAnsel (GPU): No supported GPUs found.\n"); else - fprintf(stderr, "GPU error: clGetDeviceIDs() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clGetDeviceIDs() failed.\n"); return 0; } - //size_t size; - //clGetDeviceInfo(cpx_mtx_device_id, CL_DEVICE_NAME, 0, NULL, &size); - //char str[size]; - //clGetDeviceInfo(cpx_mtx_device_id, CL_DEVICE_NAME, size, str, NULL); - //printf("%s\n", str); + size_t size; + err = clGetDeviceInfo(cpx_mtx_device_id, CL_DEVICE_NAME, 0, NULL, &size); + if (err != CL_SUCCESS) + { + fprintf(stderr, "QAnsel: Unknown GPU error.\n"); + return 0; + } + char str[size]; + err = clGetDeviceInfo(cpx_mtx_device_id, CL_DEVICE_NAME, size, str, NULL); + if (err != CL_SUCCESS) + { + fprintf(stderr, "QAnsel: Unknown GPU error.\n"); + return 0; + } + if (verbose) printf("QAnsel: Hardware `%s` selected.\n", str); cpx_mtx_context = clCreateContext(NULL, 1, &cpx_mtx_device_id, NULL, NULL, &err); if (err != CL_SUCCESS) { - fprintf(stderr, "GPU error: clCreateContext() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clCreateContext() failed.\n"); return 0; } cpx_mtx_command_queue = clCreateCommandQueue(cpx_mtx_context, cpx_mtx_device_id, 0, &err); if (err != CL_SUCCESS) { - fprintf(stderr, "GPU error: clCreateCommandQueue() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clCreateCommandQueue() failed.\n"); err = clReleaseContext(cpx_mtx_context); if (err != CL_SUCCESS) - fprintf(stderr, "GPU error: clReleaseContext() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clReleaseContext() failed.\n"); return 0; } return 1; @@ -514,12 +516,12 @@ void cpx_mtx_clean() err = clReleaseCommandQueue(cpx_mtx_command_queue); if (err != CL_SUCCESS) { - fprintf(stderr, "GPU error: clReleaseCommandQueue() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clReleaseCommandQueue() failed.\n"); } err = clReleaseContext(cpx_mtx_context); if (err != CL_SUCCESS) { - fprintf(stderr, "GPU error: clReleaseContext() failed.\n"); + fprintf(stderr, "QAnsel (GPU): clReleaseContext() failed.\n"); } free(cpx_mtx_cache); } @@ -650,7 +652,7 @@ void cpx_copy(float* ptr, cl_mem* buff, size_t* buff_size) exit(1); } } - for (uint32_t i = 0; i < threadCount; i++) + for (unsigned int i = 0; i < threadCount; i++) { if (pthread_join(threads[i], NULL)) { @@ -674,7 +676,7 @@ void cpx_mtx_knk_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int col cl_mem memR = clCreateBuffer(cpx_mtx_context, CL_MEM_WRITE_ONLY, sizeR, NULL, &err); gpuerr(err); //Populate buffers - unsigned long long int q = get_time(); + unsigned long long int q = qansel_get_time(); err = clEnqueueWriteBuffer(cpx_mtx_command_queue, memA, CL_TRUE, 0, sizeA, ptrA, 0, NULL, NULL); gpuerr(err); err = clEnqueueWriteBuffer(cpx_mtx_command_queue, memB, CL_TRUE, 0, sizeB, ptrB, 0, NULL, NULL); diff --git a/src/context.c b/src/context.c new file mode 100644 index 0000000..27528ce --- /dev/null +++ b/src/context.c @@ -0,0 +1,111 @@ +int qanselContextValidate(QAnselContext* ctx) +{ + if (ctx->memory_limit == 0) ctx->memory_limit = QANSEL_QUBITS_MAX; + if (ctx->memory_limit > QANSEL_QUBITS_MAX) + { + fprintf(stderr, "QAnsel: Invalid memory limit.\n", ctx->memory_limit); + return 0; + } + + if (ctx->sampling_shots < 0 || ctx->sampling_shots > 100000) + { + fprintf(stderr, "QAnsel: Invalid number of shots.\n"); + return 0; + } + if (ctx->display_delay < 0 || ctx->display_delay > 100) + { + fprintf(stderr, "QAnsel: Invalid display settings.\n"); + return 0; + } + if (ctx->optimization_level < QANSEL_MODE_BARE || ctx->optimization_level > (QANSEL_MODE_THREADED | QANSEL_MODE_METAL | QANSEL_MODE_QUEUE)) + { + fprintf(stderr, "QAnsel: Invalid optimization settings.\n"); + return 0; + } + + switch (ctx->hardware_rng) + { + case QANSEL_HARDWARE_NONE: + case QANSEL_HARDWARE_AUTO: + case QANSEL_HARDWARE_TRUERNG: + case QANSEL_HARDWARE_RDSEED: + break; + default: + fprintf(stderr, "QAnsel: Invalid hardware settings.\n"); + return 0; + } + + return 1; + +} + +int qanselContextBegin(QAnselContext* ctx) +{ + if (ctx->memory_limit == 0) ctx->memory_limit = QANSEL_QUBITS_MAX; + if (ctx->memory_limit > QANSEL_QUBITS_MAX) + { + fprintf(stderr, "QAnsel: Invalid memory limit.\n", ctx->memory_limit); + return 0; + } + + if (ctx->sampling_shots < 0 || ctx->sampling_shots > 100000) + { + fprintf(stderr, "QAnsel: Invalid number of shots.\n"); + return 0; + } + if (ctx->display_delay < 0 || ctx->display_delay > 100) + { + fprintf(stderr, "QAnsel: Invalid display settings.\n"); + return 0; + } + if (ctx->optimization_level < QANSEL_MODE_BARE || ctx->optimization_level > (QANSEL_MODE_THREADED | QANSEL_MODE_METAL | QANSEL_MODE_QUEUE)) + { + fprintf(stderr, "QAnsel: Invalid optimization settings.\n"); + return 0; + } + + if (ctx->hardware_rng == QANSEL_HARDWARE_AUTO) + { + ctx->random_file = fopen("/dev/TrueRNG0", "r"); + if (ctx->random_file == NULL) + { + if (qansel_hardware_rand_supported()) + { + if (ctx->verbose) printf("QAnsel: Hardware `Intel Secure Key Technology` selected.\n"); + ctx->hardware_rng = QANSEL_HARDWARE_RDSEED; + } + else + { + fprintf(stderr, "QAnsel: No supported hardware random number generator found.\n"); + return 0; + } + } + else + { + if (ctx->verbose) printf("QAnsel: Hardware `TrueRNG` selected.\n"); + ctx->hardware_rng = QANSEL_HARDWARE_TRUERNG; + } + } + if (ctx->optimization_level & QANSEL_MODE_METAL) + { + if (!cpx_mtx_begin(ctx->verbose)) + { + fprintf(stderr, "QAnsel: No supported hardware accelerator found.\n"); + return 0; + } + } + if (ctx->sampling_shots == 0) + { + ctx->sampling_shots = QANSEL_SHOTS_DEFAULT; + } + + return 1; + +} + +int qanselContextEnd(QAnselContext* ctx) +{ + if (ctx->random_file != NULL) fclose(ctx->random_file); + if (ctx->optimization_level & QANSEL_MODE_METAL) cpx_mtx_clean(); + return 1; +} \ No newline at end of file diff --git a/src/hardware.c b/src/hardware.c index 3b6d3b2..89c1d54 100644 --- a/src/hardware.c +++ b/src/hardware.c @@ -1,15 +1,4 @@ -#include -#include -#if defined(_WIN32) || defined(_WIN64) -#include -#elif defined(__linux__) -#include -#include -#elif defined(__APPLE__) -#include -#endif - -int ___get_core_count() +int qansel___get_core_count() { #if defined(_WIN32) || defined(_WIN64) SYSTEM_INFO sysinfo; @@ -39,12 +28,12 @@ int ___get_core_count() #endif } -int get_core_count() +int qansel_get_core_count() { static int coreCount = -1; if (coreCount == -1) { - coreCount = ___get_core_count(); + coreCount = qansel___get_core_count(); if (coreCount == -1) { coreCount = 1; @@ -53,7 +42,7 @@ int get_core_count() return coreCount; } -unsigned long int get_time() +unsigned long int qansel_get_time() { struct timeval tv; gettimeofday(&tv,NULL); @@ -66,7 +55,9 @@ int qansel_hardware_rand_supported() #if defined(__x86_64__) || defined(__i386__) int result = 0; - // Execute CPUID instruction with feature request + //Check for RDSEED + // https://en.wikipedia.org/wiki/CPUID#Calling_CPUID + // accessed 14-03-2024 __asm__ volatile ( "mov $7, %%eax;mov $0, %%ecx;cpuid;mov %%ebx, %0;" @@ -79,7 +70,10 @@ int qansel_hardware_rand_supported() return 0; #endif } -int qansel_hardware_rand() -{ +unsigned char qansel_hardware_rand() +{ + unsigned long long int r; + __asm__ volatile ("1:;rdseed %0;;jnc 1b;" : "=r" (r)); + return r & 0xFF; } diff --git a/src/main.c b/src/main.c index e7dd096..675640c 100644 --- a/src/main.c +++ b/src/main.c @@ -13,6 +13,9 @@ void display_help() printf(" used to set an even lower limit.\n"); printf(" -sX Used for setting the number of shots\n"); printf(" when sampling to X.\n"); + printf(" -hX Use a hidden variable rather than\n"); + printf(" randomly generating measurement\n"); + printf(" results.\n"); printf(" -r Enables a supported hardware random\n"); printf(" number generator.\n"); printf(" -v Enables verbose mode.\n"); @@ -29,67 +32,25 @@ void display_help() void main(int argc, char** argv) { + QAnselContext ctx = {0}; - printf("%i\n", qansel_hardware_rand_supported()); - return; int opt; - int maximumQubitSettings = QANSEL_QUBITS_MAX; - int hardwarerngSetting = 0; - - while ((opt = getopt(argc, argv, "o:q:d:s:rvq?")) != -1) + while ((opt = getopt(argc, argv, "o:q:d:s:h:rvq?")) != -1) { switch (opt) { - case 'o': QANSEL_MODE = atoi(optarg); break; - case 'd': QANSEL_USE_DISPLAY = atoi(optarg); break; - case 'q': QANSEL_QUBIT_LIMIT = atoi(optarg); break; - case 's': QANSEL_SAMPLE_COUNT = atoi(optarg); break; - case 'r': hardwarerngSetting = 1; break; - case 'v': QANSEL_VERBOSE = 1; break; + case 'o': ctx.optimization_level = atoi(optarg); break; + case 'd': ctx.display_delay = atoi(optarg); break; + case 'q': ctx.memory_limit = atoi(optarg); break; + case 's': ctx.sampling_shots = atoi(optarg); break; + case 'r': ctx.hardware_rng = 1; break; + case 'h': ctx.hidden_variable = atof(optarg); break; + case 'v': ctx.verbose = 1; break; case '?': display_help(); break; default: exit(1); } } - if (QANSEL_SAMPLE_COUNT < 0 || QANSEL_SAMPLE_COUNT > 100000) - { - fprintf(stderr, "QAnsel: Invalid number of shots.\n"); - exit(1); - } - if (QANSEL_USE_DISPLAY < 0 || QANSEL_USE_DISPLAY > 100) - { - fprintf(stderr, "QAnsel: Invalid display settings.\n"); - exit(1); - } - if (QANSEL_MODE < QANSEL_MODE_BARE || QANSEL_MODE > (QANSEL_MODE_THREADED | QANSEL_MODE_METAL | QANSEL_MODE_QUEUE)) - { - fprintf(stderr, "QAnsel: Invalid optimization settings.\n"); - exit(1); - } - if (QANSEL_QUBIT_LIMIT <= 0 || QANSEL_QUBIT_LIMIT > QANSEL_QUBITS_MAX) - { - fprintf(stderr, "QAnsel: Invalid limit for quantum bits.\n"); - exit(1); - } - - if (hardwarerngSetting == 1) - { - QANSEL_RANDOM_FILE = fopen("/dev/TrueRNG0", "r"); - if (QANSEL_RANDOM_FILE == NULL) - { - fprintf(stderr, "QAnsel: No supported hardware random number generator found.\n"); - exit(1); - } - } - if (QANSEL_MODE & QANSEL_MODE_METAL) - { - if (!cpx_mtx_begin()) - { - fprintf(stderr, "QAnsel: No supported hardware accelerator found.\n"); - exit(1); - } - } - char* script = malloc(0); size_t scriptSize = 0; int c; @@ -103,14 +64,14 @@ void main(int argc, char** argv) unsigned char* bytecode; int bytecodeSize; - if (qanselBuildFromSource(script, &bytecode, &bytecodeSize)) + + if (!qanselContextBegin(&ctx)) exit(1); + if (qanselBuildFromSource(script, &bytecode, &bytecodeSize, &ctx)) { - qanselExecuteBytecode(bytecode, bytecodeSize); + qanselExecuteBytecode(bytecode, bytecodeSize, &ctx); + free(bytecode); } - free(bytecode); - - if (QANSEL_RANDOM_FILE != NULL) fclose(QANSEL_RANDOM_FILE); - if (QANSEL_MODE & QANSEL_MODE_METAL) cpx_mtx_clean(); + qanselContextEnd(&ctx); return; } \ No newline at end of file diff --git a/src/openqasm.c b/src/openqasm.c index 2a3fbaa..24b65bc 100644 --- a/src/openqasm.c +++ b/src/openqasm.c @@ -202,7 +202,7 @@ int qansel_parse_float(char* str, float* returnFloat) return 1; } -int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatches, int* qubitCount, int* bitCount, unsigned char** binary, int* binarySize) +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) { unsigned short s0; float d0, d1, d2; @@ -223,9 +223,9 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche memcpy(tmp, chunk + strbeg, strlen); tmp[strlen] = 0; int nump = atoi(tmp); - if (nump > QANSEL_QUBIT_LIMIT) + if (nump > ctx->memory_limit) { - fprintf(stderr, "QAnsel on line %i: Initialized qubits cannot exceed %i.\n", line, QANSEL_QUBIT_LIMIT); + fprintf(stderr, "QAnsel on line %i: Initialized qubits cannot exceed %i.\n", line, ctx->memory_limit); return 0; } *qubitCount = nump; @@ -243,9 +243,9 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche memcpy(tmp, chunk + strbeg, strlen); tmp[strlen] = 0; int nump = atoi(tmp); - if (nump > QANSEL_QUBIT_LIMIT) + if (nump > ctx->memory_limit) { - fprintf(stderr, "QAnsel on line %i: Initialized classical bits cannot exceed %i.\n", line, QANSEL_QUBIT_LIMIT); + fprintf(stderr, "QAnsel on line %i: Initialized classical bits cannot exceed %i.\n", line, ctx->memory_limit); return 0; } *bitCount = nump; @@ -445,7 +445,7 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche char tmp[strlen + 1]; memcpy(tmp, chunk + strbeg, strlen); tmp[strlen] = 0; - if (strcmp(tmp, "sample") == 0) instr = QANSEL_INSTRUCTION_SAMPLE; + if (strcmp(tmp, "sample") == 0) instr = 0x00; else if (strcmp(tmp, "reset") == 0) instr = QANSEL_INSTRUCTION_RESET; else if (strcmp(tmp, "print") == 0) instr = QANSEL_INSTRUCTION_PRINT; } @@ -474,10 +474,20 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche a0 = QANSEL_ALL_CLASSIC; } } - *binarySize += 2; - *binary = realloc(*binary, (*binarySize)); - (*binary)[(*binarySize) - 2] = instr; - (*binary)[(*binarySize) - 1] = a0; + if (instr == 0x00) //sample + { + if (a0 == QANSEL_ALL_QUANTUM) a0 = QANSEL_ALL; + else a0 = a0 - QANSEL_CBOUND_LOWER; + ctx->sampling_bit = a0; + ctx->sampling_shots = samplingshots; + } + else + { + *binarySize += 2; + *binary = realloc(*binary, (*binarySize)); + (*binary)[(*binarySize) - 2] = instr; + (*binary)[(*binarySize) - 1] = a0; + } } else if (index == 8 || index == 9) //double qubit instructions { @@ -634,7 +644,7 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche char tmp[strlen + 1]; memcpy(tmp, chunk + strbeg, strlen); tmp[strlen] = 0; - if (strcmp(tmp, "hvar") == 0) instr = QANSEL_INSTRUCTION_HVAR; + if (strcmp(tmp, "hvar") == 0) instr = 1; } { int strbeg = regmatches[rmp].rm_so; @@ -649,10 +659,10 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche return 0; } } - *binarySize += 1 + sizeof(float); - *binary = realloc(*binary, (*binarySize)); - (*binary)[(*binarySize) - 1 - sizeof(float)] = instr; - memcpy((*binary) + ((*binarySize) - sizeof(float)), &d0, sizeof(float)); + switch (instr) + { + case 1: ctx->hidden_variable = d0; break; + } } else if (index == 12) //lone instructions { @@ -664,7 +674,11 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche char tmp[strlen + 1]; memcpy(tmp, chunk + strbeg, strlen); tmp[strlen] = 0; - if (strcmp(tmp, "rand") == 0) instr = QANSEL_INSTRUCTION_RAND; + if (strcmp(tmp, "rand") == 0) + { + ctx->hidden_variable = 0; + return 1; + } else if (strcmp(tmp, "exit") == 0) instr = QANSEL_INSTRUCTION_EXIT; } *binarySize += 1; @@ -674,7 +688,7 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche return 1; } -int qansel_process_chunks(char** chunks, int* associatedLines, int count, unsigned char** retBinary, int* retSize) +int qansel_process_chunks(char** chunks, int* associatedLines, int count, unsigned char** retBinary, int* retSize, QAnselContext* ctx, int samplingshots) { unsigned char* binary = malloc(0); int binarySize = 0; @@ -715,7 +729,7 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count, unsign if (!ret) { found = 1; - status = qansel_process_chunk(j, chunks[i], associatedLines[i], regmatches, &qubitCount, &bitCount, &binary, &binarySize); + status = qansel_process_chunk(j, chunks[i], associatedLines[i], regmatches, &qubitCount, &bitCount, &binary, &binarySize, ctx, samplingshots); break; } else if (ret == REG_NOMATCH) {} @@ -738,14 +752,17 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count, unsign return status; } -int qanselBuildFromSource(char* source, unsigned char** binary, int* binarySize) +int qanselBuildFromSource(char* source, unsigned char** binary, int* binarySize, QAnselContext* ctx) { + if (!qanselContextValidate(ctx)) return 0; char** chunks; int* chunksAssociatedLines; int chunksCount; int status = qansel_read_script(source, &chunks, &chunksAssociatedLines, &chunksCount); + int samplingshots = ctx->sampling_shots; + ctx->sampling_shots = 0; if (!status) return 0; - status = qansel_process_chunks(chunks, chunksAssociatedLines, chunksCount, binary, binarySize); + status = qansel_process_chunks(chunks, chunksAssociatedLines, chunksCount, binary, binarySize, ctx, samplingshots); for (int i = 0; i < chunksCount; i++) free(chunks[i]); free(chunks); free(chunksAssociatedLines); @@ -756,6 +773,8 @@ int qanselBuildFromSource(char* source, unsigned char** binary, int* binarySize) free(*binary); return 0; } + + //qansel_reorder(ctx, *binary, *binarySize); return 1; } diff --git a/src/qansel.h b/src/qansel.h index 60a932b..875e169 100644 --- a/src/qansel.h +++ b/src/qansel.h @@ -7,25 +7,30 @@ #include #include #include -#include "complex.c" -#include "gates.c" -#include "display.c" +#include +#include +#include +#if defined(_WIN32) || defined(_WIN64) +#include +#elif defined(__linux__) +#include +#include +#elif defined(__APPLE__) +#include +#endif + +#define QANSEL_SHOTS_DEFAULT 1000 #define QANSEL_QUBITS_MAX 16 -unsigned char QANSEL_QUBIT_LIMIT = QANSEL_QUBITS_MAX; -unsigned char QANSEL_HIDDEN_VARIABLE = 0; -unsigned char QANSEL_USE_DISPLAY = 0; -unsigned char QANSEL_VERBOSE = 0; -unsigned char QANSEL_USE_QUEUE = 0; -#define QANSEL_DEFAULT_SAMPLE_COUNT 1000 -int QANSEL_SAMPLE_COUNT = QANSEL_DEFAULT_SAMPLE_COUNT; -FILE* QANSEL_RANDOM_FILE = NULL; #define QANSEL_MODE_BARE 0 #define QANSEL_MODE_THREADED 1 #define QANSEL_MODE_METAL 2 #define QANSEL_MODE_QUEUE 4 -unsigned char QANSEL_MODE = QANSEL_MODE_BARE; //#define SPEED_TEST +#define QANSEL_HARDWARE_NONE 0 +#define QANSEL_HARDWARE_AUTO 1 +#define QANSEL_HARDWARE_TRUERNG 2 +#define QANSEL_HARDWARE_RDSEED 3 #define QANSEL_INSTRUCTION_X 0x10 #define QANSEL_INSTRUCTION_Y 0x11 #define QANSEL_INSTRUCTION_Z 0x12 @@ -43,21 +48,18 @@ unsigned char QANSEL_MODE = QANSEL_MODE_BARE; #define QANSEL_INSTRUCTION_CCX 0x40 #define QANSEL_INSTRUCTION_CSWAP 0x41 #define QANSEL_INSTRUCTION_MEASURE 0xD0 -#define QANSEL_INSTRUCTION_SAMPLE 0xD1 -#define QANSEL_INSTRUCTION_DENSITY 0xD2 -#define QANSEL_INSTRUCTION_BORN 0xD3 +#define QANSEL_INSTRUCTION_DENSITY 0xD1 +#define QANSEL_INSTRUCTION_BORN 0xD2 #define QANSEL_INSTRUCTION_IF_E 0xE1 #define QANSEL_INSTRUCTION_IF_NE 0xE2 #define QANSEL_INSTRUCTION_IF_G 0xE3 #define QANSEL_INSTRUCTION_IF_GE 0xE4 #define QANSEL_INSTRUCTION_IF_L 0xE5 #define QANSEL_INSTRUCTION_IF_LE 0xE6 -#define QANSEL_INSTRUCTION_RAND 0xF0 -#define QANSEL_INSTRUCTION_HVAR 0xF1 -#define QANSEL_INSTRUCTION_RESET 0xF2 -#define QANSEL_INSTRUCTION_PRINT 0xF3 -#define QANSEL_INSTRUCTION_BARRIER 0xF4 -#define QANSEL_INSTRUCTION_EXIT 0xF5 +#define QANSEL_INSTRUCTION_PRINT 0xF0 +#define QANSEL_INSTRUCTION_RESET 0xF1 +#define QANSEL_INSTRUCTION_BARRIER 0xF2 +#define QANSEL_INSTRUCTION_EXIT 0xF3 #define QANSEL_FLAGS_EQUAL 0b00001 #define QANSEL_FLAGS_GREATER 0b00010 @@ -72,6 +74,40 @@ unsigned char QANSEL_MODE = QANSEL_MODE_BARE; #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