[Mesa-users] OpenCL Clang/Clover Offline Compilation
Dorrington, Albert
albert.dorrington at lmco.com
Wed Jan 8 10:53:36 PST 2014
I am not sure if this is the appropriate list on which to ask this question, if not hopefully someone can suggest an alternative.
Under Linux, I am attempting to perform an offline compile of an OpenCL kernel example using Clang, and then load that binary using the clCreateProgramWithBinary() function.
Unfortunately, while clover is loading the binary, I end up getting a segmentation fault:
Program received signal SIGSEGV, Segmentation fault.
proc (v=..., is=...) at core/module.cpp:50
50 T x;
I have pasted the source code I am using below, for both the kernel and the host code.
I am compiling both with the following commands:
clang -target r600-unknown-unknown -x cl -S -emit-llvm -mcpu=r600 kernel.cl -o kernel.clbin
clang -g -L/usr/local/lib -lOpenCL offline_host.c -o offline_host
I have LLVM/Clang 3.4RC3 installed and Mesa 10.0.1.
If anyone has suggestions, or can point me to the appropriate mailing list or documentation, I'd appreciate it.
Thanks!
-Al
Source code for "kernel.cl"
====================
__kernel void vecAdd(__global float* a)
{
int gid = get_global_id(0);
a[gid] += a[gid];
}
Source code for "offline_host.c"
==========================
#include <stdio.h>
#include <stdlib.h>
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
#define MEM_SIZE (128)
#define MAX_BINARY_SIZE (0x100000)
int main()
{
cl_platform_id platform_id = NULL;
cl_device_id device_id = NULL;
cl_context context = NULL;
cl_command_queue command_queue = NULL;
cl_mem memobj = NULL;
cl_program program = NULL;
cl_kernel kernel = NULL;
cl_uint ret_num_devices;
cl_uint ret_num_platforms;
cl_int ret;
float mem[MEM_SIZE];
FILE *fp;
char fileName[] = "kernel.clbin";
size_t binary_size;
char *binary_buf;
cl_int binary_status;
cl_int i;
/* Load kernel binary */
fp = fopen(fileName, "r");
if (!fp) {
}
binary_buf = (char *)malloc(MAX_BINARY_SIZE);
binary_size = fread(binary_buf, 1, MAX_BINARY_SIZE, fp);
fclose(fp);
/* Initialize input data */
for (i = 0; i < MEM_SIZE; i++) {
}
/* Get platform/device information */
ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices);
/* Create OpenCL context*/
context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
/* Create command queue */
command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
/* Create memory buffer */
memobj = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE * sizeof(float), NULL, &ret);
/* Transfer data over to the memory buffer */
ret = clEnqueueWriteBuffer(command_queue, memobj, CL_TRUE, 0, MEM_SIZE * sizeof(float), mem, 0, NULL, NULL);
/* Create kernel program from the kernel binary */
program = clCreateProgramWithBinary(context, 1, &device_id, (const size_t *)&binary_size,
(const unsigned char **)&binary_buf, &binary_status, &ret);
/* Create OpenCL kernel */
kernel = clCreateKernel(program, "vecAdd", &ret);
printf("err:%d\n", ret);
/* Set OpenCL kernel arguments */
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobj);
size_t global_work_size[3] = {MEM_SIZE, 0, 0};
size_t local_work_size[3] = {MEM_SIZE, 0, 0};
/* Execute OpenCL kernel */
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
/* Copy result from the memory buffer */
ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0, MEM_SIZE * sizeof(float), mem, 0, NULL, NULL);
/* Display results */
for (i=0; i < MEM_SIZE; i++) {
}
/* Finalization */
ret = clFlush(command_queue);
ret = clFinish(command_queue);
ret = clReleaseKernel(kernel);
ret = clReleaseProgram(program);
ret = clReleaseMemObject(memobj);
ret = clReleaseCommandQueue(command_queue);
ret = clReleaseContext(context);
free(binary_buf);
return 0;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-users/attachments/20140108/2b7d7c35/attachment.html>
More information about the mesa-users
mailing list