...
As it can be tedious and error-prone to define each connection manually, we also provide a set of predefined topologies to be requested. The following table summarizes the available options.
Topology type | Invocation | Min-Max number of nodes | Brief description |
---|---|---|---|
pair |
| 1-N | Pairwise connect the 2 FPGAs within each node |
clique |
| 2 | All-to-all connection for 2 nodes, 4 FPGAs |
ring |
| 1-N | Ring with two links per direction, acl0 down, acl1 up |
| 1-N | Ring with two links per direction, acl0 down, acl1 down | |
| 1-N | Ring with two links per direction, acl0 and acl1 neighbors | |
torus |
| 1-N | Torus with 2 FPGAs per row |
| 2-N | Torus with 3 FPGAs per row | |
| 2-N | Torus with 4 FPGAs per row | |
| 3-N | Torus with 5 FPGAs per row | |
| 3-N | Torus with 6 FPGAs per row |
Pair topology
...
Within each node, all channels of one FPGA board are connected to the respective channel of the other FPGA board. No connections between nodes are made.
...
Expand | ||
---|---|---|
| ||
|
...
Using Serial Channels in Design Flows
Xilinx Alveo U280
Refer to our Aurora_HLS project for an example design implementing serial communication channels on the Alveo U280. Alternatively, you can use Xilinx ACCL for an Ethernet-based communication scheme.
Intel Stratix 10
All Intel Stratix 10 boards on Noctua 2 offer 4 point-to-point connections to other FPGA boards when the node is configured with a p520_max_sg280l BSP. Their use differs based on the used development flow.
OneAPI
Refer to the documentation on I/O Pipes for details on how to use the external serial channels. The channel IDs are mapped as follows:
Port 0: Channels 0 (read) and 1 (write)
Port 1: Channels 2 (read) and 3 (write)
Port 2: Channels 4 (read) and 5 (write)
Port 3: Channels 6 (read) and 7 (write)
The pipes need to be configured for a data type of width 256 bits. This could, for example, be a std::array<int, 8>
. You may use a small C++ header like the following to bundle read and write pipes into a single channel
class that has both read
and write
operations:
Code Block | ||
---|---|---|
| ||
#include <sycl/ext/intel/fpga_extensions.hpp>
template <int portnum>
struct read_channel_id {
static constexpr unsigned id = portnum * 2;
};
template <int portnum>
struct write_channel_id {
static constexpr unsigned id = portnum * 2 + 1;
};
template <int portnum, class T, std::size_t min_capacity = 0>
// requires((portnum >= 0) && (portnum < 4) && (sizeof(T) == 32)) // C++20 only
struct external_channel
: private sycl::ext::intel::kernel_readable_io_pipe<read_channel_id<portnum>, T, min_capacity>,
private sycl::ext::intel::kernel_writeable_io_pipe<write_channel_id<portnum>, T, min_capacity> {
using read_pipe = sycl::ext::intel::kernel_readable_io_pipe<read_channel_id<portnum>, T, min_capacity>;
using write_pipe = sycl::ext::intel::kernel_writeable_io_pipe<write_channel_id<portnum>, T, min_capacity>;
using read_pipe::read;
using write_pipe::write;
}; |
OpenCL
From the OpenCL environment, these links are used as external serial channels. A status reg value of 0xfff11ff1 in the diagnose indicates an active connection.