]> foleosoft.com Git - QAnsel.git/commitdiff
Sun Mar 3 11:17:48 PM EST 2024
authormiha-q <>
Mon, 4 Mar 2024 04:17:48 +0000 (23:17 -0500)
committermiha-q <>
Mon, 4 Mar 2024 04:17:48 +0000 (23:17 -0500)
src/QAnsel.c
src/gpu/gpu.c

index 700b1ae927e254b710176f4bbd32fe6afb8f91e7..cb5f0c30854bb62f4248ba4b0fdcb11ea73e3f5b 100644 (file)
@@ -16,8 +16,8 @@ uint8_t USE_GPU = 0;
 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
 #define CL_TARGET_OPENCL_VERSION 120
 #include <CL/cl.h>
-//#include "gpu/gpu.c"
-#include "gpu/gpu_test.c"
+#include "gpu/gpu.c"
+//#include "gpu/gpu_test.c"
 #endif
 
 typedef struct
index 38d3dfe9d2dcf590d7337b65459c72fe3ff07ef9..1f1d63baee1bba6f9568accb25eeae71dce83696 100644 (file)
@@ -1,3 +1,4 @@
+#define gpuerr(x) if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: #x() failed.\n"); exit(1); }
 #include "gpu_mmul.cl.c"
 #include "gpu_knk.cl.c"
 cl_platform_id GPU_platform_id;
@@ -78,47 +79,24 @@ void GPU_mmul(float* ptrR, float* ptrA, float* ptrB, size_t rowsA, size_t colsB,
        size_t sizeR = rowsA * colsB;
        cl_int err;
        cl_mem memA = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(float) * sizeA, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
        cl_mem memB = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(float) * sizeB, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
        cl_mem memR = clCreateBuffer(GPU_context, CL_MEM_WRITE_ONLY, sizeof(float) * sizeR, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
+       
        //Populate buffers
        err = clEnqueueWriteBuffer(GPU_command_queue, memA, CL_TRUE, 0, sizeof(float) * sizeA, ptrA, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueWriteBuffer);
        err = clEnqueueWriteBuffer(GPU_command_queue, memB, CL_TRUE, 0, sizeof(float) * sizeB, ptrB, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueWriteBuffer);
 
+       //Load and compile program
        cl_program program;
        if (GPU_mmul_cache == NULL)
        {
-               //Load and compile program
                program = clCreateProgramWithSource(GPU_context, 1, (const char*[]){src_gpu_mmul_cl}, NULL, &err);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clCreateProgramWithSource() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clCreateProgramWithSource);
                err = clBuildProgram(program, 1, &GPU_device_id, NULL, NULL, NULL);
                if (err != CL_SUCCESS)
                {
@@ -132,131 +110,45 @@ void GPU_mmul(float* ptrR, float* ptrA, float* ptrB, size_t rowsA, size_t colsB,
                        exit(1);
                }
                err = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &GPU_mmul_cache_len, NULL);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clGetProgramInfo() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clGetProgramInfo);
                GPU_mmul_cache = malloc(GPU_mmul_cache_len);
                clGetProgramInfo(program, CL_PROGRAM_BINARIES, sizeof(unsigned char*), &GPU_mmul_cache, NULL);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clGetProgramInfo() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clGetProgramInfo);
        }
        else
        {
                program = clCreateProgramWithBinary(GPU_context, 1, &GPU_device_id, &GPU_mmul_cache_len, (const unsigned char**)&GPU_mmul_cache, NULL, &err);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clCreateProgramWithBinary() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clCreateProgramWithBinary);
        }
 
        //Setup kernel
-       cl_kernel kernel = clCreateKernel(program, "gpu_mmul", &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateKernel() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&memA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&memB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 3, sizeof(int), &rowsA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 4, sizeof(int), &colsB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 5, sizeof(int), &shared);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
+       cl_kernel kernel = clCreateKernel(program, "gpu_mmul", &err); gpuerr(clCreateKernel);
+       err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memR); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&memA); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&memB); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 3, sizeof(int), &rowsA); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 4, sizeof(int), &colsB); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 5, sizeof(int), &shared); gpuerr(clSetKernelArg);
+
        //Run the program
        size_t work_size[] = {rowsA, colsB};
        err = clEnqueueNDRangeKernel(GPU_command_queue, kernel, 2, NULL, work_size, NULL, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueNDRangeKernel() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueNDRangeKernel);
+
        //Wait for completion
-       err = clFlush(GPU_command_queue);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clFlush() failed.\n");
-               exit(1);
-       }
-       err = clFinish(GPU_command_queue);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clFinish() failed.\n");
-               exit(1);
-       }
+       err = clFlush(GPU_command_queue); gpuerr(clFlush);
+       err = clFinish(GPU_command_queue); gpuerr(clFinish);
+
        //Read results
        err = clEnqueueReadBuffer(GPU_command_queue, memR, CL_TRUE, 0, sizeof(float) * sizeR, ptrR, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueReadBuffer);
+
        //Clean up
-       err = clReleaseKernel(kernel);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseKernel() failed.\n");
-               exit(1);
-       }
-       err = clReleaseProgram(program);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseProgram() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
+       err = clReleaseKernel(kernel); gpuerr(clReleaseKernel);
+       err = clReleaseProgram(program); gpuerr(clReleaseProgram);
+       err = clReleaseMemObject(memA); gpuerr(clReleaseMemObject);
+       err = clReleaseMemObject(memB); gpuerr(clReleaseMemObject);
+       err = clReleaseMemObject(memR); gpuerr(clReleaseMemObject);
 }
 
 void GPU_knk(float* ptrR, int rowsR, int colsR, float* ptrA, int rowsA, int colsA, float* ptrB, int rowsB, int colsB)
@@ -267,47 +159,24 @@ void GPU_knk(float* ptrR, int rowsR, int colsR, float* ptrA, int rowsA, int cols
        size_t sizeR = rowsR * colsR;
        cl_int err;
        cl_mem memA = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(float) * sizeA, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
        cl_mem memB = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(float) * sizeB, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
        cl_mem memR = clCreateBuffer(GPU_context, CL_MEM_WRITE_ONLY, sizeof(float) * sizeR, NULL, &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clCreateBuffer);
+       
        //Populate buffers
        err = clEnqueueWriteBuffer(GPU_command_queue, memA, CL_TRUE, 0, sizeof(float) * sizeA, ptrA, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueWriteBuffer);
        err = clEnqueueWriteBuffer(GPU_command_queue, memB, CL_TRUE, 0, sizeof(float) * sizeB, ptrB, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueWriteBuffer);
 
+       //Load and compile program
        cl_program program;
        if (GPU_knk_cache == NULL)
        {
-               //Load and compile program
                program = clCreateProgramWithSource(GPU_context, 1, (const char*[]){src_gpu_knk_cl}, NULL, &err);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clCreateProgramWithSource() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clCreateProgramWithSource);
                err = clBuildProgram(program, 1, &GPU_device_id, NULL, NULL, NULL);
                if (err != CL_SUCCESS)
                {
@@ -320,149 +189,45 @@ void GPU_knk(float* ptrR, int rowsR, int colsR, float* ptrA, int rowsA, int cols
                        free(log);
                        exit(1);
                }
-               err = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &GPU_knk_cache_len, NULL);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clGetProgramInfo() failed.\n");
-                       exit(1);
-               }
+               err = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &GPU_knk_cache_len, NULL); gpuerr(clGetProgramInfo);
                GPU_knk_cache = malloc(GPU_knk_cache_len);
-               clGetProgramInfo(program, CL_PROGRAM_BINARIES, sizeof(unsigned char*), &GPU_knk_cache, NULL);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clGetProgramInfo() failed.\n");
-                       exit(1);
-               }
+               clGetProgramInfo(program, CL_PROGRAM_BINARIES, sizeof(unsigned char*), &GPU_knk_cache, NULL); gpuerr(clGetProgramInfo);
        }
        else
        {
                program = clCreateProgramWithBinary(GPU_context, 1, &GPU_device_id, &GPU_knk_cache_len, (const unsigned char**)&GPU_knk_cache, NULL, &err);
-               if (err != CL_SUCCESS)
-               {
-                       fprintf(stderr, "GPU fatal error: clCreateProgramWithBinary() failed.\n");
-                       exit(1);
-               }
+               gpuerr(clCreateProgramWithBinary);
        }
 
        //Setup kernel
-       cl_kernel kernel = clCreateKernel(program, "gpu_knk", &err);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clCreateKernel() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 1, sizeof(int), &rowsR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 2, sizeof(int), &colsR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 3, sizeof(cl_mem), (void*)&memA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 4, sizeof(int), &rowsA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 5, sizeof(int), &colsA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 6, sizeof(cl_mem), (void*)&memB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 7, sizeof(int), &rowsB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
-       err = clSetKernelArg(kernel, 8, sizeof(int), &colsB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n");
-               exit(1);
-       }
+       cl_kernel kernel = clCreateKernel(program, "gpu_knk", &err); gpuerr(clCreateKernel);
+       err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memR); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 1, sizeof(int), &rowsR); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 2, sizeof(int), &colsR); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 3, sizeof(cl_mem), (void*)&memA); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 4, sizeof(int), &rowsA); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 5, sizeof(int), &colsA); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 6, sizeof(cl_mem), (void*)&memB); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 7, sizeof(int), &rowsB); gpuerr(clSetKernelArg);
+       err = clSetKernelArg(kernel, 8, sizeof(int), &colsB); gpuerr(clSetKernelArg);
 
        //Run the program
        size_t work_size[] = {rowsR, colsR};
        err = clEnqueueNDRangeKernel(GPU_command_queue, kernel, 2, NULL, work_size, NULL, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueNDRangeKernel() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueNDRangeKernel);
+
        //Wait for completion
-       err = clFlush(GPU_command_queue);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clFlush() failed.\n");
-               exit(1);
-       }
-       err = clFinish(GPU_command_queue);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clFinish() failed.\n");
-               exit(1);
-       }
+       err = clFlush(GPU_command_queue); gpuerr(clFlush);
+       err = clFinish(GPU_command_queue); gpuerr(clFinish);
+
        //Read results
        err = clEnqueueReadBuffer(GPU_command_queue, memR, CL_TRUE, 0, sizeof(float) * sizeR, ptrR, 0, NULL, NULL);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n");
-               exit(1);
-       }
+       gpuerr(clEnqueueReadBuffer);
+
        //Clean up
-       err = clReleaseKernel(kernel);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseKernel() failed.\n");
-               exit(1);
-       }
-       err = clReleaseProgram(program);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseProgram() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memA);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memB);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
-       err = clReleaseMemObject(memR);
-       if (err != CL_SUCCESS)
-       {
-               fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n");
-               exit(1);
-       }
+       err = clReleaseKernel(kernel); gpuerr(clReleaseKernel);
+       err = clReleaseProgram(program); gpuerr(clReleaseProgram);
+       err = clReleaseMemObject(memA); gpuerr(clReleaseMemObject);
+       err = clReleaseMemObject(memB); gpuerr(clReleaseMemObject);
+       err = clReleaseMemObject(memR); gpuerr(clReleaseMemObject);
 }
\ No newline at end of file