片上网络NoC(6)——路由算法

目录

一、概述

二、路由算法的类型

三、避免死锁

四、实现

4.1 源路由实现

4.2 基于节点查找表的路由实现

4.3 组合电路实现

五、总结


一、概述

        路由算法(routing algorithm),即决定数据包在网络拓扑中从起点到终点路径的算法。路由算法的目标是尽可能地在网络拓扑中均匀分配网络流量,以避免出现热点(hotspot)并最小化竞争(contention),从而降低网络延迟并提高吞吐量。

二、路由算法的类型

        路由算法总体上可以分成三大类:确定性路由(deterministic routing)、无关路由(oblivious routing)和自适应路由(adaptive routing)

        尽管目前已经提出了各种各样的路由算法,但是在片上网络中应用最广泛的路由算法是简单的维序路由(dimension-order routing,DOR)。维序路由是一种确定性路由算法:所有从节点A向节点B移动的数据包都通过相同的路径。在DOR中,数据包在网络拓扑中按照确定的顺序移动:先在一个维度下移动到与目的节点相匹配的位置,然后在下一个维度下移动到与目的节点相匹配的位置,以此类推,最终抵达终点。

        另一类路由算法是无关路由(oblivious routing):数据包从节点A向节点B移动时可以有多种不同的路径选择,然而路径的选择不考虑网络的拥塞(congestion)。例如,一个路由器能够预先随机挑选一条可选路径然后发送数据包。

        第三类路由算法是更为复杂的自适应路由(adaptive routing):一个数据包从节点A移动到节点B的路径取决于当前的网络流量(traffic)情况。

        路由算法也可以按照最短路由与非最短路由进行分类。最短路由仅选择跳数最小的路径。非最短路由可以选择跳数非最小的路径。在没有拥塞的情况下,采用非最短路由的数据包会通过额外的节点和链路,因此增加延迟与功耗。但是,选择非最短路径来避免或减少拥塞,往往会比选择存在拥塞的最短路径具有更低的传输延迟。

三、避免死锁

        在选择或设计路由算法时,不仅需要考虑延迟、功耗、吞吐量和可靠性,大多数应用也要求网络能够保证无死锁。简单来说,死锁是由多个数据包在传输路径上形成了打结的环路(knotted cycle)造成的"。下图展示了一个由4个数据包的路径形成的死锁,A、B、C和D分别代表有路由器的网络节点,有箭头的折线代表数据包的流动方向。其中,每个数据包都等待着当前被其他数据包所占据的路径释放,因此每个数据包都无法移动,从而形成死锁。可以看到,数据包之间的依赖和占用关系形成了一个环路,每个数据包都无法进一步向自己的目的节点传输。

        死锁可以通过以下两种方式避免:

  • 设计路由算法以避免在网络中形成打结的环路
  • 设计数据流控制协议(flow control protocol)以避免路由器缓冲器(buffer)的占用和请求构成循环依赖。

四、实现

        本节讨论各种路由算法的实现选择。路由算法可以通过在源节点或在路径上每个节点的路由器中使用查找表来实现,另外还可以使用组合电路来替代基于查找表的方式实现。具体实现时,会有各种各样的权衡取舍,并且不是所有的路由算法都能被每一种实现方式所支持。

4.1 源路由实现

        路由算法能够采用很多种方式实现。首先,路由信息可以在源节点处集成到数据包的报头中,这种方式叫作源路由。例如,对于2×3的mesh结构,从左下角到右上角的路由可以编码为<EENNNX>[其中的符号含义:E 表示东(east),N 表示北(north),S表示南(south),W 表示西(west),X 表示弹出(eject)],在数据包的路由过程中,每一跳的路由器将会从路由报头中读取上述编码中最左边的方向信息,并根据这个方向信息将数据包发送到具体的输出链路上,同时去除报头中当前路由器所使用过的方向信息。

4.2 基于节点查找表的路由实现

        许多复杂的算法都是使用路由表来实现的,其中每个节点的路由器都维护了一张表来记录数据包为抵达某个特定的目的地而需采用的输出链路。在这个机制下,数据包在每一跳的路由器处获取路由信息,而不是在起点处获取所有的路由信息。这个机制也支持自适应路由算法,因为每一跳都可以利用网络的拥塞信息进行相应的自适应决策。

4.3 组合电路实现

        数据包可以编码目的节点的坐标,并且在路径上每个节点的路由器中使用比较器来决定是否接收(即从本节点弹出)或传递这个数据包。因为其开销小,简单的路由算法在路由器中一般都以组合电路的形式实现。
        对源路由而言,数据包必须有足够的空间以携带用来指定整条路径的所有数据位。组合电路实现的路由仅要求数据包携带目的节点标识符。实现路由算法的整个电路非常简单,并且具有非常低的延迟。下图展示了一个在2D mesh 拓扑中基于当前缓冲区占用情况计算下一跳的组合电路。其中,路由选择也可以采用维序路由,而不考虑缓冲区中的队列长度。

五、总结

        本文介绍了片上网络的路由设计与实现,路由可以分成确定性路由(deterministic routing)、无关路由(oblivious routing)和自适应路由(adaptive routing)。实现方式可以大体上分成源路由实现、基于节点查找表的路由实现和组合电路实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/386915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置: 首先npm install types/node --save-dev(需要用到node其中的path)接着在vite.config.ts配置文件中进行配置: 引入 import path from ‘path’,然…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码,robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC,服务器上面安装了Ubuntu,想着可以在服务器接个串口到BMC,然后SSH到服务器的Ubuntu,用minicom来查看串口信息。 准备: 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解

目录 前言 父组件传子组件 ---- props 给要传递数据的子组件绑定要传过去的属性及属性值 在子组件中使用props配置项接收 props配置项 子组件传父组件 ---- 组件的自定义事件 子组件向父组件传递数据 通过代码来绑定自定义事件 前言 本文将介绍在Vue中父子组件如何进行…

算法学习——LeetCode力扣回溯篇4

算法学习——LeetCode力扣回溯篇4 332. 重新安排行程 332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

【Godot4自学手册】第十三节初建创建敌人

从本节起&#xff0c;将要学习创建第一人。 一、创建敌人动画 1.导入素材。 在Sprites文件夹下新建Enemy文件夹&#xff0c;并将需要的敌人素材导入到文件夹。文档结构如下&#xff1a; 2.创建Enemy场景。 新建场景&#xff0c;根节点设置为CharacterBody2D&#xff0c;命…

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…

PR:熟悉PR工作环境

新建项目 设置自己的页面布局 首选项

vim编辑代码后退出编辑显示vim编辑的内容

在/etc/profile.d/下新建terminal.sh&#xff1a; 在terminal.sh里添加如下代码&#xff1a; #!/bin/bashexport TERMlinux 然后同步文件到内存&#xff1a; source /etc/profile

ACM训练题:互不侵犯

一看数据范围&#xff0c;如果是枚举所有的棋盘情况&#xff0c;2^K&#xff0c;肯定超了&#xff0c;自然是要一行一行递推&#xff0c;而相邻这个情况用位运算会比较方便&#xff0c;所以用状压dp。 具体算法&#xff1a;dp[i][j][k]表示第i行&#xff0c;前i行有j个棋子&…

【网站项目】023实验室耗材管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

九、OpenCV自带colormap

项目功能实现&#xff1a;每隔1500ms轮流自动播放不同风格图像显示&#xff0c;按下Esc键退出 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 colormap.h #pragma once #include<opencv2/opencv.hpp> using namespace cv;class ColorMap { public:vo…

Spring 如何解决循环依赖?Spring三级缓存

什么是循环依赖 说白是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了构成一个环形调用。 自己依赖自己 两个对象间的依赖关系 多个对象间的依赖关系 Spring出现循环依赖的场景 单例的setter注入 Service public class A {Resourceprivate…

flask+python儿童福利院管理系统pycharm毕业设计项目

本系统解决了儿童福利院管理事务中的主要问题&#xff0c;包括首页、个人中心、爱心人士管理、员工管理、后勤人员管理、儿童信息管理、院所风采管理、活动管理、食谱管理、领养流程管理、政策法规管理、楼栋管理、宿舍管理、领养申请管理、义工申请管理、捐赠信息管理、宿舍物…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域&#xff0c;从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景&#xff0c;比如多个进程需要…