vector_scal_opencl.texi 1.9 KB

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