]> foleosoft.com Git - QAnsel.git/commitdiff
Mon Mar 18 07:50:01 PM EDT 2024
authormiha-q <>
Mon, 18 Mar 2024 23:50:01 +0000 (19:50 -0400)
committermiha-q <>
Mon, 18 Mar 2024 23:50:01 +0000 (19:50 -0400)
Makefile
src/complex.c
src/display.c
src/main.c
src/qansel.h

index 0769af9877899848897b899973039a514e1fc00d..1aaf3ad6f2028659a032d19eae0a6a6424b1a3a7 100644 (file)
--- 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`"
index bc1d3d75eb7e9ca893883e888e975db0b840ef86..649823b9c2c91c650eb919e164d1184db7d2b5aa 100644 (file)
@@ -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 <CL/cl.h>
-#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 <CL/cl.h>
-#include <stdio.h>
-
+#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
 }
 
 
index 5b5ff665af2347293c38b11f501de3007cb6d862..489d3788581c8eee238043811941078592290fca 100644 (file)
@@ -1,10 +1,4 @@
-#include <SDL.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <math.h>
-#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
index e9fe93b78231de279bf4948e317cfe50dc4c1981..950d1f14943ec3c984669107137cb7cb8515df56 100644 (file)
@@ -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);
        }
index 530c139d1915ff6fbaf75f150d60fbc22a847464..61b8d44710a18f35d6a1dac3f3e59bf15ecdd07d 100644 (file)
@@ -4,12 +4,14 @@
 #define QANSEL_MAX_SIZE 1073741824
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <math.h>
 #include <regex.h>
 #include <time.h>
 #include <pthread.h>
 #include <string.h>
 #include <time.h>
+#include <math.h>
 #if defined(_WIN32) || defined(_WIN64)
 #include <windows.h>
 #elif defined(__linux__)
 #include <sys/sysctl.h>
 #endif
 
+#ifdef __SDL2__
+#include <SDL.h>
+#endif
+
+#ifdef __OPENCL__
+#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
+#define CL_TARGET_OPENCL_VERSION 300
+#include <CL/cl.h>
+#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