vector_scal_opencl.texi 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. @c -*-texinfo-*-
  2. @c This file is part of the StarPU Handbook.
  3. @c Copyright (C) 2009-2011 Université de Bordeaux 1
  4. @c Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique
  5. @c See the file starpu.texi for copying conditions.
  6. @smallexample
  7. #include <starpu.h>
  8. extern struct starpu_opencl_program programs;
  9. void scal_opencl_func(void *buffers[], void *_args)
  10. @{
  11. float *factor = _args;
  12. int id, devid, err;
  13. cl_kernel kernel;
  14. cl_command_queue queue;
  15. cl_event event;
  16. /* length of the vector */
  17. unsigned n = STARPU_VECTOR_GET_NX(buffers[0]);
  18. /* OpenCL copy of the vector pointer */
  19. cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]);
  20. id = starpu_worker_get_id();
  21. devid = starpu_worker_get_devid(id);
  22. err = starpu_opencl_load_kernel(&kernel, &queue, &programs, "vector_mult_opencl",
  23. devid);
  24. if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
  25. err = clSetKernelArg(kernel, 0, sizeof(val), &val);
  26. err |= clSetKernelArg(kernel, 1, sizeof(n), &n);
  27. err |= clSetKernelArg(kernel, 2, sizeof(*factor), factor);
  28. if (err) STARPU_OPENCL_REPORT_ERROR(err);
  29. @{
  30. size_t global=n;
  31. size_t local;
  32. size_t s;
  33. cl_device_id device;
  34. starpu_opencl_get_device(devid, &device);
  35. err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE,
  36. sizeof(local), &local, &s);
  37. if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
  38. if (local > global) local=global;
  39. err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0,
  40. NULL, &event);
  41. if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
  42. @}
  43. clFinish(queue);
  44. starpu_opencl_collect_stats(event);
  45. clReleaseEvent(event);
  46. starpu_opencl_release_kernel(kernel);
  47. @}
  48. @end smallexample