From a4206ed7ee67d4cc0590e1cb64d911c79eca5350 Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Sat, 2 Mar 2024 20:52:16 -0500 Subject: [PATCH] Sat Mar 2 08:52:16 PM EST 2024 --- src/QAnsel.c | 1 - src/gpu.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/QAnsel.c b/src/QAnsel.c index 11704fd..1d084c9 100644 --- a/src/QAnsel.c +++ b/src/QAnsel.c @@ -1372,7 +1372,6 @@ void main(int argc, char** argv) #ifdef GPU_ENABLED USE_GPU = GPU_init(); #endif - USE_GPU = 0; RANDOM_FILE = fopen("/dev/TrueRNG0", "r"); if (!RANDOM_FILE) RANDOM_FILE = fopen("/dev/random", "r"); diff --git a/src/gpu.c b/src/gpu.c index 991db40..50bebc0 100644 --- a/src/gpu.c +++ b/src/gpu.c @@ -66,10 +66,17 @@ void GPU_clean() void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t colsB, size_t shared) { + #define GPU_DEBUG + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Create buffers size_t sizeA = rowsA * shared; size_t sizeB = shared * colsB; size_t sizeR = rowsA * colsB; + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif cl_int err; cl_mem memA = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(double) * sizeA, NULL, &err); if (err != CL_SUCCESS) @@ -77,12 +84,18 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif cl_mem memB = clCreateBuffer(GPU_context, CL_MEM_READ_ONLY, sizeof(double) * sizeB, NULL, &err); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clCreateBuffer() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif cl_mem memR = clCreateBuffer(GPU_context, CL_MEM_WRITE_ONLY, sizeof(double) * sizeR, NULL, &err); if (err != CL_SUCCESS) { @@ -90,12 +103,18 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col exit(1); } //Populate buffers + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clEnqueueWriteBuffer(GPU_command_queue, memA, CL_TRUE, 0, sizeof(double) * sizeA, ptrA, 0, NULL, NULL); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clEnqueueWriteBuffer() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clEnqueueWriteBuffer(GPU_command_queue, memB, CL_TRUE, 0, sizeof(double) * sizeB, ptrB, 0, NULL, NULL); if (err != CL_SUCCESS) { @@ -103,18 +122,27 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col exit(1); } //Load and compile program + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif cl_program program = clCreateProgramWithSource(GPU_context, 1, (const char**)(&gpu_mmul_cl), (const size_t*)(&gpu_mmul_cl_len), &err); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clCreateProgramWithSource() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clBuildProgram(program, 1, &GPU_device_id, NULL, NULL, NULL); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clBuildProgram() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Setup kernel cl_kernel kernel = clCreateKernel(program, "gpu_mmul", &err); if (err != CL_SUCCESS) @@ -122,36 +150,54 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col fprintf(stderr, "GPU fatal error: clCreateKernel() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memR); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&memA); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&memB); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clSetKernelArg(kernel, 3, sizeof(int), &rowsA); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clSetKernelArg(kernel, 4, sizeof(int), &colsB); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clSetKernelArg() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Run the program size_t work_size[] = {rowsA, colsB}; err = clEnqueueNDRangeKernel(GPU_command_queue, kernel, 2, NULL, work_size, NULL, 0, NULL, NULL); @@ -160,6 +206,9 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col fprintf(stderr, "GPU fatal error: clEnqueueNDRangeKernel() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Wait for completion err = clFlush(GPU_command_queue); if (err != CL_SUCCESS) @@ -167,12 +216,18 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col fprintf(stderr, "GPU fatal error: clFlush() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clFinish(GPU_command_queue); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clFinish() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Read results err = clEnqueueReadBuffer(GPU_command_queue, memR, CL_TRUE, 0, sizeof(double) * sizeR, ptrR, 0, NULL, NULL); if (err != CL_SUCCESS) @@ -181,6 +236,9 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif //Clean up err = clReleaseKernel(kernel); if (err != CL_SUCCESS) @@ -188,34 +246,52 @@ void GPU_mmul(double* ptrR, double* ptrA, double* ptrB, size_t rowsA, size_t col fprintf(stderr, "GPU fatal error: clReleaseKernel() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clReleaseProgram(program); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clReleaseProgram() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clReleaseMemObject(memA); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clReleaseMemObject(memB); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clReleaseMemObject(memR); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif err = clReleaseMemObject(memR); if (err != CL_SUCCESS) { fprintf(stderr, "GPU fatal error: clReleaseMemObject() failed.\n"); exit(1); } + #ifdef GPU_DEBUG + printf("Line %d.\n", __LINE__); + #endif } \ No newline at end of file -- 2.39.5