OpenCL Clang/Clover Offline Compilation

"Dorrington, Albert" <[email protected]>
Newsgroups gmane.comp.video.mesa3d.user
Message-ID <[email protected]>
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;
}

_______________________________________________
mesa-users mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.