code: def calc_fractal_opencl(q, maxiter):
      ctx = cl.create_some_context()
      queue = cl.CommandQueue(ctx)
  
      output = np.empty(q.shape, dtype=np.uint16)
  
      mf = cl.mem_flags
      q_opencl = cl.Buffer(
          ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=q
      )
      output_opencl = cl.Buffer(ctx, mf.WRITE_ONLY, output.nbytes)
  
      prg = cl.Program(
          ctx,
          """
      #pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
      __kernel void mandelbrot(__global float2 *q,
                       __global ushort *output, ushort const maxiter)
      {
          int gid = get_global_id(0);
          float nreal, real = 0;
          float imag = 0;
  
          output[gid] = 0;
  
          for(int curiter = 0; curiter < maxiter; curiter++) {
              nreal = real*real - imag*imag + q[gid].x;
              imag = 2* real*imag + q[gid].y;
              real = nreal;
  
              if (real*real + imag*imag > 4.0f) {
                   output[gid] = curiter;
                   break;
              }
          }
      }
      """,
      ).build()
  
      prg.mandelbrot(
          queue,
          output.shape,
          None,
          q_opencl,
          output_opencl,
          np.uint16(maxiter),
      )
  
      cl.enqueue_copy(queue, output, output_opencl).wait()
  
      return output
  
file_path: pyopencl/examples/demo_mandelbrot.py
imports: import time
  import numpy
  import pyopencl
  from PIL import Image
label_desc: Use image node_id 1 for calling a global function with example usage: calc_fractal_opencl(q, maxiter) and returns: output