62 lines
1.5 KiB
ObjectPascal
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.
|