neuton / c_opencl_wrapper

Simple wrapper for common OpenCL usage.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Opencl C API wrapper

Simple wrapper for common OpenCL usage.

Usage example

host.c:

#include <stdio.h>
#include "opencl.h"

main()
{
	uint i, n = 1000;
	real * v = (real *)malloc(n * sizeof(real));
	for (i=0; i<n; i++) v[i] = (real)i;
	
	// mandatory initialization
	opencl_init(0, CL_DEVICE_TYPE_GPU);
	
	// creating variables on device (and enqueing data copy)
	cl_var dn = opencl_create_var(sizeof(uint), 1, CL_MEM_READ_ONLY, &n);
	cl_var dv = opencl_create_var(sizeof(real), n, 0, v);
	
	// reading program from file
	cl_program program = opencl_create_program_from_source("kernel.cl", "");
	
	// creating kernel
	cl_kernel kernel = opencl_create_kernel(program, "test_kernel");
	
	// setting kernel args
	opencl_set_kernel_args(kernel, dn, dv);
	
	// setting workgroup sizes
	opencl_set_global_ws(1, n);
	opencl_set_local_ws(1, 64);
	
	// running the kernel
	opencl_run_kernel(kernel);
	
	// getting data back from device (blocking read)
	opencl_get_var(dv, v);
	
	// cleaning
	opencl_done();
	
	char success = 1;
	for (i=0; i<n; i++) success &= v[i] == (real)(2*i);
	puts(success ? "Success" : "Fail");
}

kernel.cl:

#define real float

__kernel void test_kernel(uint n, __global real * v)
{
	v[get_global_id(0)] *= 2;
}

Makefile:

CFLAGS = -I"$(AMDAPPSDKROOT)/include"
LDFLAGS = -L"$(AMDAPPSDKROOT)/lib/x86_64" -lOpenCL

EXEC = host

ifeq ($(OS), Windows_NT)
EXEC := $(EXEC).exe
SHELL = cmd
else
SHELL = /bin/sh
endif

$(EXEC): host.o cl_error.o opencl.o
host.o: host.c opencl.h Makefile
opencl.o: opencl.c opencl.h cl_error.h Makefile
cl_error.o: cl_error.c cl_error.h Makefile

About

Simple wrapper for common OpenCL usage.


Languages

Language:C 100.0%