Files

62 lines
1.5 KiB
ObjectPascal

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.