input: Write a function to set values in a GPUArray by index from indexed values in another GPUArray.
  assert np.allclose(dest_gpu.get(), np.array([0, 2, 4], dtype=np.float32))
  assert np.allclose(dest_gpu.get(), np.array([1, 1, 1, 3, 1], dtype=np.float32))
  assert np.allclose(dest_gpu.get(), np.array([3, 1, 4, 1, 5], dtype=np.float32))
output: import pycuda.autoinit
  import pycuda.driver as cuda
  import numpy as np
  from pycuda.compiler import SourceModule
  
  def set_values_by_index(dest_gpu, src_gpu, indices_gpu):
      mod = SourceModule("""
      __global__ void set_values_by_index(float *dest, float *src, int *indices, int size)
      {
          int idx = threadIdx.x + blockDim.x * blockIdx.x;
          if (idx < size)
          {
              dest[indices[idx]] = src[idx];
          }
      }
      """)
      
      set_values_kernel = mod.get_function("set_values_by_index")
      size = np.int32(len(indices_gpu.get()))
      
      set_values_kernel(dest_gpu, src_gpu, indices_gpu, size,
                        block=(256, 1, 1), grid=((size + 255) // 256, 1))
  
  # Example usage:
  src = np.array([1, 2, 3], dtype=np.float32)
  indices = np.array([0, 1, 2], dtype=np.int32)
  dest = np.zeros(3, dtype=np.float32)
  
  src_gpu = cuda.mem_alloc(src.nbytes)
  indices_gpu = cuda.mem_alloc(indices.nbytes)
  dest_gpu = cuda.mem_alloc(dest.nbytes)
  
  cuda.memcpy_htod(src_gpu, src)
  cuda.memcpy_htod(indices_gpu, indices)
  cuda.memcpy_htod(dest_gpu, dest)
  
  set_values_by_index(dest_gpu, src_gpu, indices_gpu)
  
  assert np.allclose(cuda.from_device(dest_gpu, dest.shape, dest.dtype), np.array([1, 2, 3], dtype=np.float32))