+#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;
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)
{
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)
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)
{
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