From: miha-q <> Date: Mon, 4 Mar 2024 04:17:48 +0000 (-0500) Subject: Sun Mar 3 11:17:48 PM EST 2024 X-Git-Url: http://www.foleosoft.com/?a=commitdiff_plain;h=344b9959c125d36f4d0930c59053f2815ffcb6b8;p=QAnsel.git Sun Mar 3 11:17:48 PM EST 2024 --- diff --git a/src/QAnsel.c b/src/QAnsel.c index 700b1ae..cb5f0c3 100644 --- a/src/QAnsel.c +++ b/src/QAnsel.c @@ -16,8 +16,8 @@ uint8_t USE_GPU = 0; #define CL_USE_DEPRECATED_OPENCL_1_2_APIS #define CL_TARGET_OPENCL_VERSION 120 #include -//#include "gpu/gpu.c" -#include "gpu/gpu_test.c" +#include "gpu/gpu.c" +//#include "gpu/gpu_test.c" #endif typedef struct diff --git a/src/gpu/gpu.c b/src/gpu/gpu.c index 38d3dfe..1f1d63b 100644 --- a/src/gpu/gpu.c +++ b/src/gpu/gpu.c @@ -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