anchor.diff:    i: UInt32;
   begin
     numInputs := Length(InputBuffers);
  -  vectorWidth := Max(1, Device.PreferredVectorWidthDouble);
  +  //vectorWidth := Max(1, Device.PreferredVectorWidthDouble);
  +  vectorWidth := 1; // seems AMD's OpenCL compiler isn't too keen on vectorized doubles
     inputSize := NumElements * SizeOf(double);
     inputLength := NumElements;
     vectorSize := SizeOf(double) * vectorWidth;
  
positive.code:     FCmdQueue: CLCommandQueue;
      FMemReadQueue: CLCommandQueue;
      FMemWriteQueue: CLCommandQueue;
  
      function DeviceOptimalNonInterleavedBufferSize: UInt64;
      function DeviceOptimalInterleavedBufferSize: UInt64;
  
negative.code: 
    kernelSrc := kernelGen.GenerateDoubleTransformKernel(Expression, numInputs);
  
    if not FKernelCache.Contains[kernelSrc] then
    begin
      WriteLn(kernelSrc);
  
      prog := Context.CreateProgram(kernelSrc);
      if not prog.Build([Device]) then
      begin
        raise Exception.Create('Error building OpenCL kernel:' + #13#10 + prog.BuildLog);
      end;
  
      WriteLn(prog.BuildLog);
  
      kernel := prog.CreateKernel('transform_double_' + IntToStr(numInputs));
      FKernelCache[kernelSrc] := kernel;
    end
    else
    begin
      kernel := FKernelCache[kernelSrc];
    end;
  
    for i := 0 to numInputs-1 do
    begin
  