PCI

PCIE协议解析 synopsys IP MSI-X Capability 读书笔记(12) 1.1.1    PF MSI-X Capability RegisterDetails MSI-XCapability作为是一种可选的capability,与MSIcapability一样都是中断控制的capability,但是MSI-X要比MSI复杂,对于某个具体的PCIe设备,仅支持一种报文,虽然两种capability可以存在同一个链表中,但是两者仅有一个可以使能。MSI-XCapa 阅读详情

目录

一、概述

二、PCI

2.1 基本概念

2.2 PCI资源

2.2.1 配置空间

2.2.2 BAR空间

2.2.3 PCI 中断

2.2.4 DMA

2.3 处理器访问PCI设备流程

三、PCIe

3.1 基本概念

3.2 PCIe资源

3.2.1 扩展配置空间 

3.2.2 MSI/ MSI-X


一、概述

主要总结一下掌握PCI驱动应该具备的PCI的基本知识

二、PCI

2.1 基本概念

下面通过一张图说明基本概念:

  • PCI总线空间与处理器空间的隔离

PCI总线域(地址空间)和存储器域是通过HOST主桥进行隔离的,HOST主桥也称为PCI主桥,PCI总线控制器,它作为两个地址空间的桥梁:处理器通过HOST主桥才能访问PCI设备,PCI设备通过HOST主桥才能访问存储器。

  • PCI设备

在PCI总线中有三类设备:PCI主设备,PCI从设备,桥设备

一个PCI设备可以是主设备也可以是PCI从设备,PCI规范将主从设备统称为PCI Agent设备。

HOST主桥是一个特殊的PCI设备,该设备可以获取PCI总线控制权访问PCI设备,也可以被PCI设备访问。但HOST主桥不是PCI设备。

PCI桥可以连接两条总线,上游PCI总线和下游PCI总线,其扩展的所有PCI总线属于同一个PCI域

HOST主桥、PCI桥、PCI设备构成了一棵PCI树形结构

2.2 PCI资源

一个设备通常具有以下资源:I/O port, MMIO,interrupt, DMA

2.2.1 配置空间

PCI是支持自举的总线,实现这一功能的关键在于每个PCI设备都有自己的配置空间,我们知道在一棵PCI总线的树上,可以通过BDF(bus:device:function)唯一的确定一个PCI设备。这样我们可以通过HOST主桥,通过指定BDF的方式,访问特定PCI设备的配置空间。

以x86为例,它提供了两个I/O port来访问配置空间,分别为CONFIG_ADDRESS(0xCF8)和CONFIG_DATA(0xCFC)

CONFIG_ADDRESS寄存器结构如下图:

下面来看一个pci agent的配置空间:

  • Vendor ID,Device ID 标识PCI设备
  • Header Type,第7位为1表示多功能设备,为0表示单功能设备;6~0位为1表示PCI桥配置空间,为0表示PCI Agent配置空间
  • BAR0~5,保存PCI设备使用的MMIO的基地址,注意这个地址属于PCI总线域,使用要有一个转换;另外,通过向BAR寄存器写入0xffffffff,再读取获取PCI设备使用的BAR空间的长度。
  • Command 包含I/O和MMIO的是能 (linux pci_enable_device) 

接下来看一下PCI桥的配置空间:

  • subordinate bus number 存放当前PCI子树中,编号最大的PCI总线号
  • secondary bus number   存放当前PCI子树中,编号最小的PCI总线号
  • primary bus number       存放该PCI桥上游的PCI总线号

一个PCI 桥能管理的总线号的范围是[subordinate bus number, secondary bus number],当进行PCI设备枚举时设置,上述三个初始化时设置为0,可用来判断PCI桥是否被配置过。

  • I/O Limit, I/O Base,存放该PCI子树下,所有PCI设备使用的I/O地址空间的范围
  • Memory Limit, Momory Base 存放PCI子树下,所有PCI设备使用的存储器地址空间的范围
  • Prefetchable Memory Limit, Prefetchable Memory Base

2.2.2 BAR空间

系统通过配置空间获得了PCI整个拓扑,就可以为PCI设备分配I/O port和 MMIO了,我们知道,通过配置空间可以获取上述资源的大小,而当我们通过DFS将资源分配给整个PCI系统时,就可以在BAR里面写上该PCI设备对应的基地址了

对于BAR,还有以下注意的点:

  • BAR寄存器最低位确定该PCI设备访问类型:1代表I/O port, 0代表MMIO
  • BAR分为可预取和不可预取的,一般可预期的主要是设备ram,ram具有每次读取后内容不自动改变性质,因此可以预取,将不需要的数据直接丢到。不可预取类型主要指设备寄存器,有些寄存器本身就是设备FIFO,每次读取完毕后数据可能会改变,因此不能预取

2.2.3 PCI 中断

PCI总线使用INT A#, INT B#, INT C#, INT D#向处理器发送请求。但是PCI总线规范没有规定PCI设备的INT x信号如何与中断控制器相连,为此系统软件使用中断路由表存放INT x信号与中断控制器的连接关系。如在x86系统中由ACPI表中记录着中断路由表:

上表就说明了pci设备的连接关系,获取到这个信息,就可以处理对应设备的中断了

2.2.4 DMA

分为DMA read、 DMA write

简单说就是PCI设备将要写的数据放到pci域地址由主桥转换成存储器域地址从而完成写操作。

2.3 处理器访问PCI设备流程

主要分成两种情况:

  1. 处理器读写配置空间,使用ID译码方式(Bus Number, Device Number, Function number, Register num)
  2. 处理器读写BAR空间, 使用地址译码方式(存储器译码或者I/O 译码)

三、PCIe

PCI总线使用并行总线结构,在同一条总线上所有外部设备共享总线带宽,而PCIe总线使用高速差分总线,并采用端到端的连接方式,在同一条PCIe链路上只能各连一个设备,互为数据发送端和接收端。

3.1 基本概念

  • lane

PCIe总线物理链路的一个数据通路,有两组差分信号(RX, TX),四根信号线。PCIe链路可以由多条Lane组成,如x1,x2,x4,x8,x12,x16,x32宽度的PCIe链路。PCIe总线物理链路间的数据传送使用基于时钟的同步传送机制,接收端使用CDR提取接收时钟,从而进行数据同步的操作。

  • switch

3.2 PCIe资源

3.2.1 扩展配置空间 

PCI配置空间由64字节组成(0x00~0x3F)有些设备还扩展了0x40~0xFF这段配置空间,这段空间主要存放一些与MSI/MSI-X和电源相关的一些Capability结构。在x86处理器上,上述空间统一用I/O port访问(CONFIG_ADDRESS/CONFIG_DATA)。除此之外,对于PCIe来说,它还支持0x100~0xFFF,从而将PCIe最大配置空间扩展到4K,这部分使用ECAM访问(MMIO)

PCIe的Capability结构示意如下图:

一个PCIe设备可以包含多个Capability结构,包括电源管理相关,PCIe总线结构相关,与中断相关的结构。每个Capability是一个单链表结构——Pointer指针指向下一个Capability结构的起始地址,而最后一个Capability的Pointer为0。每个Capability以ID选项唯一标识自身。

3.2.2 MSI/ MSI-X

MSI Capability结构有四种方式:

  • message control控制是否使用64-bit地址,使能等特性

MSI capability可以类比于一个中断控制器的特性,Mask bits,由于MSI 最多使用32个中断向量,使用Mask屏蔽对应的中断请求。当mask为1时,产生中断时,对应的pending bits表示中断还没有向中断控制器提交,当mask清空时,提交中断,这样可以防止处理器丢失中断请求。

PCI设备通过MSI触发中断的方式是将Message Data的值写入到Message Address对应的地址中去

 

MSI-X

MSI最多只支持32个中断向量,且要求中断向量连续,为了改进,引入MSI-X,其Capability结构如下:

MSI-X使用MSI-X Table的形式,将多个entry存在BAR空间而非capability中,从而扩展了MSI-X中断数()

其中Message Control可以参考下表:

  • Table BIR 存放MSI-X Table所在位置——bar空间的编号,Table Offset则对应在相应BAR空间的偏移
  • PBA /PBA offset 描述Pending Table

看一下MSI-X Table表项结构:

  • 其中vector就是mask

其中Message Address字段存储PCIe域地址,通过上层桥转换为存储域地址:

这个地址是APIC的MMIO地址:

fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
  fed00000-fed003ff : pnp 00:04
fee00000-fee00fff : Local APIC

Message Data的格式:

系统软件初始化好vector对应Destination ID的对应关系,PCIe产生中断时将Message Data数据写入Message Address,就会产生Interrupt Message 总线事务,从而向CPU提交中断请求。        

 

 

pci总线扫描及pci网卡驱动 本文讲述的基于intel 总线架构的硬件架构为例来说明linux是如何扫描总线上的PCI设备。 CPU通过前端总线FS连接到北桥芯片North Bridge Chip(又称host Bridge), 北桥芯片本身也是PCI总线0上的PCI设备。北桥芯片通过DMI总线连接南桥芯片Sourth Bridge Chip。北桥芯片内置内存控制器,访问内存需要通过北桥芯片; 南桥芯片负责IO操作,以及下挂子pci总线,usb总线等。 Linux kernel扫描pci总线从pci总线0开始,即pci0。 阅读详情

相关推荐

PCI PCI-X PCI-E区别

PCI PCI-X PCI-E区别

qq_43746783的博客 6581

PCIE学习系列 三(PCIE中断)

在PCIe中有三种中断方式,分别是INTx、MSI、MSI-X,下面将对三种中断类型分别进行描述。PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,在PCI总线中,所有需要提交中断请求的设备,必须能够通过INTx引脚提交中断请求,而MSI机制是一个可选机制。

qq_42208449的博客 9235

Linux PCI pci_dev 的创建

简单分析linux pci驱动的框架以及pci_dev的创建过程。

alex_mianmian的博客 4654

PCIe中断之MSI和MSI-X的区别(详细)总结附图文快速掌握

本文主要介绍MSI和MSI的基本概念和差异,通过图文的方式方便读者快速掌握,最后章节也简单介绍了INTx的基本概念。MSI(Message Signaled Interrupts)是一种通过在内存中写入信息来产生中断的方式,其中内存地址由设备驱动程序和硬件设备协商确定。MSI与传统的中断线不同,它不需要单独的中断线,而是通过PCI总线进行通信。

Luckiers的博客 1万+

PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2、Add-in Card 它们有啥区别?这些概念你搞清楚了吗?

搞硬件或通信的“攻城狮”们,免不了要和各种通信协议及接口打交道。比如,专注于通信模组的移远人,我们经常接触PCI、PCI-X、PCI-E、PCI-E Card、Mini PCI-E、M.2(NGFF)、Add-in Card这些概念,作为“攻城狮”队伍中的一员,你搞清楚它们之间的关系了吗?搞不清楚?It Doesn't Matter,且看下文分解。

“电源先生”的博客 4594

别再傻傻分不清了!STM32定时器里Prescaler和ClockDivision到底有啥区别?

本文深入解析STM32定时器中Prescaler和ClockDivision的区别与应用场景。Prescaler作为定时器的'心跳调节器',决定计数频率;而ClockDivision则是输入捕获的'抗噪滤镜',有效抑制高频噪声。通过实战案例和示波器实测数据,帮助开发者避免常见配置误区,提升嵌入式系统稳定性。

weixin_29193259的博客 316

PCIe中断机制

PCIe有三种中断,分别为I,其中INTx是可选的,MSI/MSI-X是必须实现的。MSI, message signal interrupt, 是PCI设备通过写一个特定消息到特定地址,从而触发一个CPU中断。特定消息指的是PCIe总线中的Memory Write TLP, 特定地址一般存放在MSI capability中。

奔跑的蜗牛的博客 3357

【NVIDIA Jetson Orin系列 - 安装NVIDIA SDK Manager】

NVIDIA Jetson Orin - 安装NVIDIA SDK Manager

dally2的博客 2688

PCIE 配置空间 基本能力 定义

今天我们来学习一下pcie 配置空间中的基本能力:PCIe 的基本能力(Capabilities)是一组定义在 PCI 配置空间中的标准功能块,每个能力都有唯一的 Cap ID,用于标识该功能的类型和结构。 这些能力属于PCI/PCIe 规范的核心部分,几乎所有设备都会实现其中一部分,用来描述设备类型、链路参数、中断机制、PM 节能能力等。它们和扩展能力(Extended Capabilities)不同,扩展能力通常位于配置空间 0x100 以后的区域,提供更高级、可选的功能(如 AER、ACS、SR-I

芯片驱动开发实践 1565

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3544

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2420

PCI——第1章——PCI总线的基本知识

摘要:自己对PCI 总线基本知识的理解

Y__Yshans的博客 1万+

【推荐100个unity插件】unity易于使用模块化设计的天空、体积云和天气系统——Enviro 3

Enviro 3是一款功能强大的Unity天空与天气系统插件,提供动态天空、体积云、天气模拟等丰富功能。安装时需将预制体拖入场景并配置主相机,URP支持需激活深度纹理和添加渲染特性。模块化设计允许自由添加/移除时间、光照、雾效等模块,并通过API控制参数。推荐配合色调映射(如ACES模式)获得最佳视觉效果。插件支持季节、温湿度模拟及闪电风暴等特效,适用于需要逼真环境渲染的Unity项目。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2091

VirtIO实现原理——PCI基础

virtio设备可以基于不同总线来实现,本文主要介绍基于pci的实现,virtio-pci设备。 以virtio-blk为例,首先介绍virtio设备的配置空间内容,之后介绍为实现virtio-pci设备,在pci配置空间基础上增加的capability的内容,然后介绍virtio-blk规定的配置空间内容,最后介绍virtio设备的初始化和vring环初始化和使用。

Take Easy,Work Hard! 1万+

Spring Boot 与 Redisson 版本适配深度解析

Spring Boot 与 Redisson 的版本适配是一个动态演进的过程。开发者需要密切关注两者官方的版本更新日志,建立完善的版本验证机制。本文提供的适配方案基于当前最新技术状态(2024年1月),建议在实际生产环境中通过灰度发布策略验证版本兼容性。只有深入理解底层技术原理,才能在分布式系统的星辰大海中稳健航行。延伸阅读Spring Boot 官方迁移指南。

fudaihb的博客 1078

Exchange Server 2013 运维系列——邮箱配额设置(管理中心)

邮箱配额需要设置三个参数: 1、发出警告限制:表示在向用户发出警告之前的最大存储限制。如果邮箱大小达到或超过指定值,Exchange 将向邮箱用户发送警告消息。 2、禁止发送限制:表示邮箱的“禁止发送”限制。如果邮箱大小达到或超过指定的限制,Exchange 将阻止邮箱用户发送新邮件,并显示一条描述性错误消息。 3、禁止发送和接收限制:表示此邮箱的“禁止发送和接收”限制。如果邮箱大小

白昼的技术专栏 1万+

PCI、PCIe 一篇搞定

PCI、PCIe 概述

lyndon 9910

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1133

PCI、PCI-x,PCI-E

PCI一、PCIPCI-XPCI-EPCI-E各版本的传输速度PCI-E不同传输通道数设备的金手指数和长度三种接口的传输速度比较 一、PCI PCI接口分为32bit和64bit两种,32bit就是一般台式机使用的普通的pci接口 ,64bit接口比32bit接口长一些一般只出现在服务器上。32bit和64bit都有5v和3.3v电压两种,5v电压的是PCI2.1标准的时钟频率为33MHz,3.3v电压的是PCI2.2标准以后出现的可以工作在66MHz的时钟频率上。不过现在一般来说,卡和插槽都做成可以同时兼

3237

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【驱动设计的硬件基础】PCI和PCI-E

从 PCI 到 PCI-E,20 多年的技术迭代,不变的是即插即用的核心设计 —— 设备通过配置空间主动 "报家门",驱动根据这些信息完成控制。对于开发者来说,理解配置空间的每一个寄存器,搞懂 PCI-E 的链路协议,就是打开硬件世界的 "钥匙"。

byte轻骑兵的技术小窝 2657

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

PCI入门

PCI入门 1. PCI基础 基于PCI总线的处理器系统结构图如下: 1.1 Host主桥 PCI总线树主要由Host主桥(存在与SouthBridge)、PCI总线、PCI设备构成,Host主桥主要功能包括: 隔离处理器系统的存储器域和PCI总线域,每个Host主桥都对应一个PCI总线域 管理PCI总线域 完成处理起与PCI设备间的数据交换 1.2 PCI总线 PCI总线由Host主桥或P...

OnePiece 5750

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

PCI设备与PCI桥的配置空间

PCI设备与PCI桥的配置空间

chen_xing_hai的博客 5298

PCI PCI-X PCI-E介绍

PCI PCI-X PCI-E介绍 1.PCI 外设互联标准(或称个人电脑接口,Personal Computer Interface),实际应用中简称PCI(Peripheral Component Interconnect),是一种连接电子计算机主板和外部设备的总线标准。一般PCI设备可分为两种形式:直接布放在主板上的集成电路,在PCI规范中称作”平面设备“,另一种是安装...

weixin_30300225的博客 1万+

深入PCI与PCIe

转载于老狼: https://zhuanlan.zhihu.com/p/26172972 https://zhuanlan.zhihu.com/p/26244141 PCI总线和设备树是X86硬件体系内很重要的组成部分,几乎所有的外围硬件都以这样或那样的形式连接到PCI设备树上。虽然Intel为了方便各种IP的接入而提出IOSF总线,但是其主体接口(primary interface)还依然是PCIe形式。我们下面分成两部分介绍PCI和他的继承者PCIe(PCI express):第一部分是历史沿革和硬件

qq_41854911的博客 7045

【PCI】PCI入门介绍(包含部分PCIe讲解)

PCI全称外围部件互连。PCI总线是由ISA(Industy Standard Architecture)总线发展而来的,ISA总线由于CPU资源占用太高,数据传输带宽太小,作为插槽接口已经被淘汰。1992年Intel提出PCI总线,用来连接CPU和外围设备的局部总线,解决了CPU和外围设备尤其是显卡的数据瓶颈(在此之前MCA设备也挺慢,就比ISA好一点)。PCI规范已经到7.0了,详情可以去官网上看。

qq_44954543的博客 4241

PCI设备编号

1.PCI设备编号 每一个PCI device都有其unique PFA(PCI Fcntion Address) PFA由 bus number、device number、function number组成 一条PCI总线支持256个PFA,即支持256个PCI device 每个PCI芯片都有自己的device number(取决于IDSEL管脚),每个PCI芯片占用8个PFA。 每个PCI...

老鹰不捉小鸡 9289
上一篇: 同步(二) —— 操作系统wait,signal原句实现分析
下一篇: LVS
whenloce
博客等级 码龄17年 106粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值