Skip to content

Commit ec31e5c

Browse files
committed
Merge branch 'feature/add-alveo-support' into develop
2 parents ebde25f + 46e9609 commit ec31e5c

40 files changed

+1699
-6495
lines changed

README.md

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ outbuf = allocate(shape=(output_elements,), dtype=np.uint16)
4545
# Run
4646
dma.sendchannel.transfer(inbuf)
4747
accel.write(accel.register_map.CTRL.address, 0x81)
48+
accel.write(accel.register_map.n_elements.address, input_elements)
4849
dma.recvchannel.transfer(outbuf)
4950
dma.recvchannel.wait()
5051

@@ -53,7 +54,7 @@ del input_hw
5354
del output_hw
5455
```
5556

56-
With CYNQ:
57+
With CYNQ for Xilinx Ultrascale+:
5758

5859
```c++
5960
#include <cynq/cynq.hpp>
@@ -62,7 +63,7 @@ using namespace cynq;
6263

6364
// Configure the FPGA
6465
auto kArch = HardwareArchitecture::UltraScale;
65-
auto platform = IHardware::Create(kArch, "design.bit", "default.xclbin");
66+
auto platform = IHardware::Create(kArch, "design.bit");
6667

6768
// Extract the accelerator (IP Core) and DMA
6869
// Addresses are given by the design
@@ -72,17 +73,57 @@ auto accel = platform->GetAccelerator(accel_addr);
7273
auto dma = platform->GetDataMover(dma_addr);
7374

7475
// Allocate buffers and get the pointers
75-
auto inbuf = mover->GetBuffer(input_size);
76-
auto outbuf = mover->GetBuffer(output_size);
76+
auto inbuf = mover->GetBuffer(input_size, accel->GetMemoryBank(0));
77+
auto outbuf = mover->GetBuffer(output_size, accel->GetMemoryBank(1));
7778
uint16_t* input_ptr = inbuf->HostAddress<uint16_t>().get();
7879
uint16_t* output_ptr = outbuf->HostAddress<uint16_t>().get();
7980

81+
// Configure data - Bus: AXI4 Stream is handled by DMA
82+
const uint32_t num_elements = 4096;
83+
const uint64_t addr_num_elements = 0x20;
84+
accel->Write(addr_num_elements, num_elements);
85+
8086
// Run
87+
mover->Upload(in_mem, infbuf->Size(), 0, ExecutionType::Async);
8188
accel->Start(StartMode::Continuous);
82-
inbuf->Sync(SyncType::HostToDevice);
83-
mover->Upload(in_mem, infbuf->Size(), 0, ExecutionType::Sync);
8489
mover->Download(out_mem, outbuf->Size(), 0, ExecutionType::Sync);
85-
outbuf->Sync(SyncType::DeviceToHost);
90+
accel->Stop();
91+
92+
// Dispose? We use RAII
93+
```
94+
95+
With CYNQ for Alveo
96+
97+
```c++
98+
#include <cynq/cynq.hpp>
99+
100+
using namespace cynq;
101+
102+
// Configure the FPGA
103+
auto kArch = HardwareArchitecture::Alveo;
104+
auto platform = IHardware::Create(kArch, "design.xclbin");
105+
106+
// Extract the accelerator (IP Core) and DMA
107+
// Addresses are given by the design
108+
auto accel = platform->GetAccelerator("vadd");
109+
auto dma = platform->GetDataMover(0);
110+
111+
// Allocate buffers and get the pointers
112+
auto inbuf = mover->GetBuffer(input_size, accel->GetMemoryBank(0));
113+
auto outbuf = mover->GetBuffer(output_size, accel->GetMemoryBank(1));
114+
uint16_t* input_ptr = inbuf->HostAddress<uint16_t>().get();
115+
uint16_t* output_ptr = outbuf->HostAddress<uint16_t>().get();
116+
117+
// Configure the accel - memory mapped
118+
const uint32_t num_elements = 4096;
119+
accel->Attach(0, bo_0);
120+
accel->Attach(1, bo_1);
121+
accel->Attach(2, &num_elements);
122+
123+
// Run
124+
mover->Upload(in_mem, infbuf->Size(), 0, ExecutionType::Async);
125+
accel->Start(StartMode::Once);
126+
mover->Download(out_mem, outbuf->Size(), 0, ExecutionType::Sync);
86127
87128
// Dispose? We use RAII
88129
```
@@ -92,6 +133,7 @@ outbuf->Sync(SyncType::DeviceToHost);
92133
So far, we have tested CYNQ on:
93134

94135
1. Xilinx KV26-based with Ubuntu 2022.04
136+
2. Xilinx Alveo U250 (it should be compatible with other similar Alveo cards) - Shell: xilinx_u250_gen3x16_xdma_4_1_202210_1
95137

96138
## Links & References:
97139

@@ -106,8 +148,8 @@ Cite Us:
106148
AND Ávila-Torres, Diego
107149
AND Castro-Godínez, Jorge
108150
}},
109-
title = {{CYNQ (v0.1)}},
110-
year = {2023},
151+
title = {{CYNQ (v0.2)}},
152+
year = {2024},
111153
url = {https://github.com/ECASLab/cynq},
112154
}
113155
```

docs/About.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,10 @@ The current maintainers are:
1919

2020
* Luis G. Leon Vega <luis.leon@ieee.org>
2121
* Diego Avila Torres <diego.avila@uned.cr>
22+
23+
## Acknowledgements
24+
25+
Thanks to
26+
27+
* AMD HACC programme (ETH Zürich cluster) since it made possible to add the Alveo card support.
28+
* RidgeRun LLC for facilitating access to a Xilinx Kria KV260 since it made possible to add K26 support.

docs/ClassDiagram.md

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
@startuml
44
interface IHardware {
55
+{abstract} Reset() -> Status
6-
+{abstract} GetDataMover(address) -> IDataMover *
7-
+{abstract} GetAccelerator(address) -> IAccelerator *
6+
+{abstract} GetDataMover(address = 0) -> IDataMover *
7+
+{abstract} GetAccelerator(address: uint64) -> IAccelerator *
8+
+{abstract} GetAccelerator(address: string) -> IAccelerator *
89
+{static} Create(hw: HardwareArchitecture, bitstream: string, xclbin: string) -> IHardware*
9-
10+
+{static} Create(hw: HardwareArchitecture, config: string) -> IHardware*
1011
}
1112

1213
interface IMemory {
@@ -30,12 +31,16 @@ IMemoryType ..o IMemory
3031
interface IAccelerator {
3132
{abstract} Start(mode: StartMode) -> Status
3233
{abstract} Stop() -> Status
34+
{abstract} Sync() -> Status
3335
{abstract} #WriteRegister(address, data: uint8_t*, size: size_t) -> Status
3436
{abstract} #ReadRegister(address, data: uint8_t*, size: size_t) -> Status
3537
+Write<T>(address, data: T*, elems: size_t) -> Status
3638
+Read<T>(address, data: T*, elems: size_t) -> Status
39+
+Attach<T>(address, data: T*, elems: size_t) -> Status
40+
+Attach(address, mem: std::shared_ptr<IMemory>, elems: size_t) -> Status
3741
{abstract} GetStatus() -> DeviceStatus
3842
+{static} Create(impl: IAcceleratorType, addr: uint64) -> IAccelerator*
43+
+{static} Create(impl: IAcceleratorType, addr: string) -> IAccelerator*
3944
}
4045

4146
enum IAcceleratorType {
@@ -108,11 +113,19 @@ enum DataMoverType {
108113

109114
class UltraScale {
110115
+Reset() -> Status
111-
+GetDataMover(address, type : DataMoverType) -> IDataMover *
112-
+GetAccelerator(address) -> EmbeddedAccelerator *
116+
+GetDataMover(address, type : DataMoverType) -> DMADataMover *
117+
+GetAccelerator(address: uint64) -> MMIOAccelerator *
118+
+UltraScale(hw, bitsteam, xclbin)
119+
}
120+
121+
class Alveo {
122+
+Reset() -> Status
123+
+GetDataMover(address, type : DataMoverType) -> XRTtDataMover *
124+
+GetAccelerator(address: string) -> XRTAccelerator *
113125
+UltraScale(hw, bitsteam, xclbin)
114126
}
115127

128+
116129
class XRTMemory {
117130
#GetHostAddress() -> uint8_t *
118131
#GetDeviceAddress() -> uint8_t *
@@ -124,12 +137,23 @@ class XRTMemory {
124137
class MMIOAccelerator {
125138
Start(mode: StartMode) -> Status
126139
Stop() -> Status
140+
Sync() -> Status
127141
GetStatus() -> DeviceStatus
128142
#WriteRegister(address, data: uint8_t*, size: size_t) -> Status
129143
#ReadRegister(address, data: uint8_t*, size: size_t) -> Status
130144
+MMIOAccelerator(addr: uint64)
131145
}
132146

147+
148+
class XRTAccelerator {
149+
Start(mode: StartMode) -> Status
150+
Stop() -> Status
151+
Sync() -> Status
152+
GetStatus() -> DeviceStatus
153+
#SetArgument(position, data: T*) -> Status
154+
+XRTAccelerator(name: string)
155+
}
156+
133157
class DMADataMover {
134158
GetBuffer(size: size_t, type: MemoryType) -> XRTMemory *
135159
Upload(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
@@ -139,8 +163,20 @@ class DMADataMover {
139163
DMADataMover(addr)
140164
}
141165

166+
class XRTDataMover {
167+
GetBuffer(size: size_t, type: MemoryType) -> XRTMemory *
168+
Upload(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
169+
Download(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
170+
Sync() -> Status
171+
GetStatus() -> DeviceStatus
172+
XrtDataMover(mem_bank)
173+
}
174+
142175
UltraScale ..> IHardware
176+
Alveo ..> IHardware
143177
XRTMemory ..> IMemory
144178
MMIOAccelerator ..> IAccelerator
179+
XRTAccelerator ..> IAccelerator
145180
DMADataMover ..> IDataMover
181+
XRTDataMover ..> IDataMover
146182
@enduml

0 commit comments

Comments
 (0)