program AgxComputeDemo; {$mode ObjFPC}{$H+} uses SysUtils, AgxOpenTypes, AgxOpenRuntime; const N = 8; type TFloatArray = array[0..N - 1] of Single; procedure VectorAdd(const Inputs, Outputs: array of TAgxBuffer; const ElementCount: NativeUInt); var A, B, C: TFloatArray; I: NativeUInt; begin Inputs[0].Download(@A[0], ElementCount * SizeOf(Single)); Inputs[1].Download(@B[0], ElementCount * SizeOf(Single)); for I := 0 to ElementCount - 1 do C[I] := A[I] + B[I]; Outputs[0].Upload(@C[0], ElementCount * SizeOf(Single)); end; var Device: TAgxDevice; ABuffer, BBuffer, CBuffer: TAgxBuffer; Kernel: TAgxKernel; A, B, C: TFloatArray; I: Integer; begin for I := 0 to N - 1 do begin A[I] := I; B[I] := I * 10; end; Device := TAgxDevice.Create; ABuffer := nil; BBuffer := nil; CBuffer := nil; Kernel := nil; try Device.CreateBuffer(SizeOf(A), agxBufferStorage, ABuffer); Device.CreateBuffer(SizeOf(B), agxBufferStorage, BBuffer); Device.CreateBuffer(SizeOf(C), agxBufferStorage, CBuffer); ABuffer.Upload(@A[0], SizeOf(A)); BBuffer.Upload(@B[0], SizeOf(B)); Device.CreateCPUKernel('vector_add', @VectorAdd, Kernel); Kernel.Dispatch([ABuffer, BBuffer], [CBuffer], N); CBuffer.Download(@C[0], SizeOf(C)); for I := 0 to N - 1 do WriteLn(Format('%0.0f + %0.0f = %0.0f', [A[I], B[I], C[I]])); finally Kernel.Free; CBuffer.Free; BBuffer.Free; ABuffer.Free; Device.Free; end; end.