From 81fe7799680fb6a7dc87ea70af98ae6f8357edf2 Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Mon, 18 Mar 2024 19:50:01 -0400 Subject: [PATCH] Mon Mar 18 07:50:01 PM EDT 2024 --- Makefile | 24 +++++++++++++- src/complex.c | 87 ++++++++++++--------------------------------------- src/display.c | 20 +++++++----- src/main.c | 8 ++--- src/qansel.h | 19 +++++++++++ 5 files changed, 78 insertions(+), 80 deletions(-) diff --git a/Makefile b/Makefile index 0769af9..1aaf3ad 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,37 @@ all: + 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 '{cpu_only}' > src/.kernel.tmp.1 + bash -c 'echo -ne "$$(cat src/.kernel.tmp.1)\x00" > src/.kernel.tmp.2' + xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl + gcc src/main.c -g -o bin/QAnsel -lm -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread + rm -f src/.kernel* src/kernel_* +simple: + 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 '{cpu_only}' > src/.kernel.tmp.1 + bash -c 'echo -ne "$$(cat src/.kernel.tmp.1)\x00" > src/.kernel.tmp.2' + xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl + gcc src/main.c -g -o bin/QAnsel -lm -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread + rm -f src/.kernel* src/kernel_* +metal: 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 '{cpu_only}' > src/.kernel.tmp.1 bash -c 'echo -ne "$$(cat src/.kernel.tmp.1)\x00" > src/.kernel.tmp.2' xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl + gcc src/main.c -g -o bin/QAnsel -lm -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread + rm -f src/.kernel* src/kernel_* - gcc src/main.c -g -o bin/QAnsel -lm -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread +metal: + 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 '{cpu_only}' > src/.kernel.tmp.1 + bash -c 'echo -ne "$$(cat src/.kernel.tmp.1)\x00" > src/.kernel.tmp.2' + xxd -i src/.kernel.tmp.2 | sed -e 's/src__kernel_tmp_2/kernel_gpu/' > src/kernel_gpu.cl + gcc src/main.c -g -o bin/QAnsel -lm -D__SDL2__ -D__OPENCL__ -I/usr/include/SDL2 -D_REENTRANT -lSDL2 -lOpenCL -pthread rm -f src/.kernel* src/kernel_* + commit: git add src/ examples/ Makefile git commit -m "`date`" diff --git a/src/complex.c b/src/complex.c index bc1d3d7..649823b 100644 --- a/src/complex.c +++ b/src/complex.c @@ -363,21 +363,7 @@ void cpx_mtx_dot_threads(float* ptrR, float* ptrA, float* ptrB, int rowsA, int c /*-----------------------------------------------------------------------------------*/ /*METAL*/ /*-----------------------------------------------------------------------------------*/ - -#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; - -#include -#include - +#ifdef __OPENCL__ const char* clGetErrorString(cl_int err) { switch (err) @@ -448,10 +434,11 @@ const char* clGetErrorString(cl_int err) default: return "Unknown error code"; } } - +#endif unsigned char cpx_mtx_begin(unsigned char verbose) { + #ifdef __OPENCL__ cl_uint count; cl_int err; @@ -508,10 +495,14 @@ unsigned char cpx_mtx_begin(unsigned char verbose) return 0; } return 1; + #else + return 0; + #endif } void cpx_mtx_clean() { + #ifdef __OPENCL__ cl_int err; err = clReleaseCommandQueue(cpx_mtx_command_queue); if (err != CL_SUCCESS) @@ -524,10 +515,12 @@ void cpx_mtx_clean() fprintf(stderr, "QAnsel (GPU): clReleaseContext() failed.\n"); } free(cpx_mtx_cache); + #endif } void cpx_mtx_dot_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB) { + #ifdef __OPENCL__ int rowsR = rowsA; int colsR = colsB; @@ -609,61 +602,14 @@ void cpx_mtx_dot_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int col err = clReleaseMemObject(memA); gpuerr(err); err = clReleaseMemObject(memB); gpuerr(err); err = clReleaseMemObject(memR); gpuerr(err); + #else + cpx_mtx_dot_metal(ptrR, ptrA, ptrB, rowsA, colsA, rowsB, colsB); + #endif } -/*typedef struct -{ - float* ptr; - cl_mem* buff; - size_t* buff_size; - size_t offset; - size_t count; -} cpx_copy_context; - -void* cpx_copy_run(void *context) -{ - cpx_copy_context* ccc = (cpx_copy_context*)context; - cl_int err = clEnqueueWriteBuffer(cpx_mtx_command_queue, *(ccc->buff), CL_FALSE, ccc->offset, ccc->count, ccc->ptr, 0, NULL, NULL); - gpuerr(err); -} - -void cpx_copy(float* ptr, cl_mem* buff, size_t* buff_size) -{ - int delimeter = (int)(*buff_size); - int cores = get_core_count(); - int threadCount = cores; - if (threadCount > delimeter) threadCount = delimeter; - int delimetersPerThread = delimeter / threadCount; - int leftOvers = delimeter % threadCount; - - cpx_copy_context ctxs[threadCount]; - pthread_t threads[threadCount]; - - for (int i = 0; i < threadCount; i++) - { - ctxs[i].ptr = ptr; - ctxs[i].buff = buff; - ctxs[i].buff_size = buff_size; - ctxs[i].offset = i * delimetersPerThread; - ctxs[i].count = delimetersPerThread + ((i == threadCount - 1) ? leftOvers : 0); - if (pthread_create(&(threads[i]), NULL, &cpx_copy_run, (void*)&(ctxs[i]))) - { - fprintf(stderr, "QAnsel: Thread error. (3)\n"); - exit(1); - } - } - for (unsigned int i = 0; i < threadCount; i++) - { - if (pthread_join(threads[i], NULL)) - { - fprintf(stderr, "QAnsel: Thread error. (4)\n"); - } - } - clFlush(cpx_mtx_command_queue); -}*/ - void cpx_mtx_knk_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int colsA, int rowsB, int colsB) { + #ifdef __OPENCL__ int rowsR = rowsA * rowsB; int colsR = colsA * colsB; //Create buffers @@ -752,6 +698,9 @@ void cpx_mtx_knk_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int col err = clReleaseMemObject(memA); gpuerr(err); err = clReleaseMemObject(memB); gpuerr(err); err = clReleaseMemObject(memR); gpuerr(err); + #else + cpx_mtx_knk_metal(ptrR, ptrA, ptrB, rowsA, colsA, rowsB, colsB); + #endif } //This only works if ptrA is NxM where both N and X are divisible by two, @@ -759,6 +708,7 @@ void cpx_mtx_knk_metal(float* ptrR, float* ptrA, float* ptrB, int rowsA, int col // 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) { + #ifdef __OPENCL__ int rowsR = rowsA * rowsB; int colsR = colsA * colsB; //Create buffers @@ -854,6 +804,9 @@ void cpx_mtx_knk_metal_2x2(float* ptrR, float* ptrA, float* ptrB, int rowsA, int err = clReleaseProgram(program); gpuerr(err); err = clReleaseMemObject(memA); gpuerr(err); err = clReleaseMemObject(memR); gpuerr(err); + #else + cpx_mtx_knk_metal_2x2(ptrR, ptrA, ptrB, rowsA, colsA, rowsB, colsB); + #endif } diff --git a/src/display.c b/src/display.c index 5b5ff66..489d378 100644 --- a/src/display.c +++ b/src/display.c @@ -1,10 +1,4 @@ -#include -#include -#include -#include -#include -#include "complex.c" - +#ifdef __SDL2__ void DrawThickLine(SDL_Renderer* renderer, int x1, int y1, int x2, int y2, int thickness) { int deltaX = x2 - x1; int deltaY = y2 - y1; @@ -150,4 +144,14 @@ int display(cpx_mtx_t* stateVector, uint8_t qubitCount, int delay) } return delay; -} \ No newline at end of file +} +#else +int display(cpx_mtx_t* stateVector, uint8_t qubitCount, int delay) +{ + (void)stateVector; + (void)qubitCount; + (void)delay; + fprintf(stderr, "QAnsel: Graphical display was not enabled during compilation.\n"); + return 0; +} +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index e9fe93b..950d1f1 100644 --- a/src/main.c +++ b/src/main.c @@ -68,10 +68,10 @@ void main(int argc, char** argv) if (!qanselContextBegin(&ctx)) exit(1); if (qanselBuildFromSource(script, &bytecode, &bytecodeSize, &ctx)) { - for (int i = 0; i < bytecodeSize; i += qansel_get_instruction_size(bytecode[i])) - { - printf("%s(%i,%i)\n", qansel_instruction_to_string(bytecode[i]), bytecode[i + 1], bytecode[i + 2]); - } + //for (int i = 0; i < bytecodeSize; i += qansel_get_instruction_size(bytecode[i])) + //{ + // printf("%s(%i,%i)\n", qansel_instruction_to_string(bytecode[i]), bytecode[i + 1], bytecode[i + 2]); + //} qanselExecuteBytecode(bytecode, bytecodeSize, &ctx); free(bytecode); } diff --git a/src/qansel.h b/src/qansel.h index 530c139..61b8d44 100644 --- a/src/qansel.h +++ b/src/qansel.h @@ -4,12 +4,14 @@ #define QANSEL_MAX_SIZE 1073741824 #include #include +#include #include #include #include #include #include #include +#include #if defined(_WIN32) || defined(_WIN64) #include #elif defined(__linux__) @@ -19,6 +21,23 @@ #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 #define QANSEL_MODE_BARE 0 -- 2.39.5