Skip to content

Commit 4918f56

Browse files
committed
Merge branch 'develop'
2 parents a0e62e6 + 669b6f0 commit 4918f56

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+12315
-6751
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+
uint32_t num_elements = 4096;
83+
const uint64_t addr_num_elements = 0x20;
84+
accel->Attach(addr_num_elements, &num_elements, RegisterAccess::RO);
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, RegisterAccess::RO);
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 <[email protected]>
2121
* Diego Avila Torres <[email protected]>
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: 49 additions & 8 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 {
@@ -100,14 +105,27 @@ enum ExecutionType {
100105
Async
101106
}
102107

108+
enum DataMoverType {
109+
Stream,
110+
MemoryMapped
111+
}
112+
103113

104114
class UltraScale {
105115
+Reset() -> Status
106-
+GetDataMover(address) -> XRTDataMover *
107-
+GetAccelerator(address) -> AmdAccelerator *
116+
+GetDataMover(address, type : DataMoverType) -> DMADataMover *
117+
+GetAccelerator(address: uint64) -> MMIOAccelerator *
108118
+UltraScale(hw, bitsteam, xclbin)
109119
}
110120

121+
class Alveo {
122+
+Reset() -> Status
123+
+GetDataMover(address, type : DataMoverType) -> XRTtDataMover *
124+
+GetAccelerator(address: string) -> XRTAccelerator *
125+
+UltraScale(hw, bitsteam, xclbin)
126+
}
127+
128+
111129
class XRTMemory {
112130
#GetHostAddress() -> uint8_t *
113131
#GetDeviceAddress() -> uint8_t *
@@ -116,13 +134,33 @@ class XRTMemory {
116134
+XRTMemory(hostptr, devptr)
117135
}
118136

119-
class XRTAccelerator {
137+
class MMIOAccelerator {
120138
Start(mode: StartMode) -> Status
121139
Stop() -> Status
140+
Sync() -> Status
122141
GetStatus() -> DeviceStatus
123142
#WriteRegister(address, data: uint8_t*, size: size_t) -> Status
124143
#ReadRegister(address, data: uint8_t*, size: size_t) -> Status
125-
+AmdAccelerator(addr: uint64)
144+
+MMIOAccelerator(addr: uint64)
145+
}
146+
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+
157+
class DMADataMover {
158+
GetBuffer(size: size_t, type: MemoryType) -> XRTMemory *
159+
Upload(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
160+
Download(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
161+
Sync() -> Status
162+
GetStatus() -> DeviceStatus
163+
DMADataMover(addr)
126164
}
127165

128166
class XRTDataMover {
@@ -131,11 +169,14 @@ class XRTDataMover {
131169
Download(mem: IMemory, size: size_t, exetype: ExecutionType) -> Status
132170
Sync() -> Status
133171
GetStatus() -> DeviceStatus
134-
XRTDataMover(addr)
172+
XrtDataMover(mem_bank)
135173
}
136174

137175
UltraScale ..> IHardware
176+
Alveo ..> IHardware
138177
XRTMemory ..> IMemory
178+
MMIOAccelerator ..> IAccelerator
139179
XRTAccelerator ..> IAccelerator
180+
DMADataMover ..> IDataMover
140181
XRTDataMover ..> IDataMover
141182
@enduml

0 commit comments

Comments
 (0)