当前位置: 首页 > news >正文

外设数据到昇腾310推理卡 之五 3403ATU

目录

存储器事务地址空间

ATU 两个方向

outbond

inbond

3403 outbond示例

ATU_REGION_CTRL2

寄存器相关位说明

inbound方向的默认配置

310i pro inbound方向的默认配置

外设到推理卡

总结


存储器事务地址空间

地址空间类型大小起始地址结束地址说明
存储器事务地址空间256M0x0300000000x03FFFFFFF在此空间内的读写操作将在 PCIe 链路上转换为PCIe 协议所定义的存储器读写事务(需地址转换功能配合,地址转换功能请参考地地址转换单元ATU(Address Translation Unit ))。
扩展存储器事务地址空间4G0x3 0000 00000x3 FFFF FFFF支持大地址空间扩展为PCIe 存储器事务地址空间。 在此空间内的读写操作将在 PCIe 链路上转换为PCIe 协议所定义的存储器读写事务(需地址转换功能配合,地址转换功能请参考地址转换单元ATU(Address Translation Unit ))。

ATU 两个方向

 

outbond

即3403 作为事务的发起方。从CPU 地址空间 流转到PCIE地址空间的过程

inbond

即3403 作为事务的接收方。从PCIE地址空间流转到CPU 地址空间 的过程

 

3403 outbond示例

3403 DMA作为主,发起请求事务,从飞腾CPU内存读取数据。

*   1) 采用映射表项2
*   2) 3403侧的地址为0x30000000,即3403对此地址段访问就可以访问到对端内存
*   3) RC侧的基地址为 0x22_0000_0000
*   4)3403侧限制了共享内存的大小,即为256Mstruct dev_addr atu_addr;atu_addr.phy_addr = 0x103D0000;atu_addr.virt_addr = 0;atu_addr.reg_len = 0x1000;if (NULL == ioremap_system_mem(&atu_addr))return -1;write_reg(atu_addr.virt_addr, 0x900, 2); //采用映射表2,支持8个映射表write_reg(atu_addr.virt_addr, 0x90c, 0x30000000); //映射的源地址,即3403侧的地址write_reg(atu_addr.virt_addr, 0x914, 0x3fffffff);  //映射地址的空间大小,总共256M#if 0 //固定内存地址write_reg(atu_addr.virt_addr, 0x918, 0);write_reg(atu_addr.virt_addr, 0x91c, 0x22);
#elsewrite_reg(atu_addr.virt_addr, 0x918, g_buffer_base);  //映射到的目的地址,write_reg(atu_addr.virt_addr, 0x91c, g_buffer_base >> 32); //映射到的目的地址的高位
#endifprintf("buffer base addr:0x%llx\n", g_buffer_base);write_reg(atu_addr.virt_addr, 0x904, 0);write_reg(atu_addr.virt_addr, 0x908, 0x80000000); //使能此区域

 1) 采用映射表2

  2) 设置3403侧的源地址

  3) 设置PCIE侧的目的地地址。

  4) 使能此region。当3403访问0x3000 0000~0x3fff ffff之间的区域时,通过ATU 翻译到中间地址空间的目的地址,而飞腾端不需要配置ATU或者说pcie地址空间与飞腾CPU地址空间是一一对应的,即可以访问到飞腾CPU设备。

    

ATU_REGION_CTRL2

通过这一组寄存器,可以实现对发送方向和接收方向的各 8 个地址转换区的配置

寄存器相关位说明

1)  匹配模式。地址匹配 or bar 匹配模式。

在上述的outbond例程中,我们采用了地址匹配模式。

在后续的inbound使用中,我们采用BAR 匹配模式。

 

 2) bar的编号

 

inbound方向的默认配置

[root@localhost ~]# lspci -vv -s b:0.0
0b:00.0 Multimedia controller: Hunan Goke Microelectronics Co., Ltd Device 0928 (rev 02)Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0Interrupt: pin A routed to IRQ 255NUMA node: 0Region 0: Memory at 800 65800000 (32-bit, non-prefetchable) [size=8M]Region 1: Memory at 800 66200000 (32-bit, non-prefetchable) [size=64K]Region 2: Memory at 800 66000000 (32-bit, non-prefetchable) [size=1M]Region 3: Memory at 800 66100000 (32-bit, non-prefetchable) [size=1M]Region 4: Memory at 800 66210000 (32-bit, non-prefetchable) [size=64K]Region 5: Memory at 800 66220000 (32-bit, non-prefetchable) [size=4K]

310i pro inbound方向的默认配置

Region 0: Memory at 58000000 (64-bit, non-prefetchable) [size=8M]
Region 2: Memory at 1020000000 (64-bit, prefetchable) [size=128M]
Region 4: Memory at 1000000000 (64-bit, prefetchable) [size=512M]

 是否和3403非常像。

外设到推理卡

  此时我们需要3403侧配置为inbound,采用bar4 映射到3403 或者310i pro 的某段内存。

  通过类似outbond的简单配置,就可以实现如下红色线部分RC都512M内存的读写。

   而FPGA通过绿色线访问512M内存,则需要走P2P流程。

 

总结

   虽然我们无从知晓AI卡的详细设计,但通过分析3403的实现及AI卡的外部信息,可以窥测内部实现是一脉相承的。

    通过对外的编程接口文档《CANN社区版 8.1.RC1.alpha001 AscendCL应用软件开发指南(C&C++) 01.pdf》说明: 

  也可以知晓上述的实现是完全可行。

  310i pro此region 4的实现大概率是滑动的,毕竟region大小只有4G,而模块内存为24G或者48G

 

  英伟达在这方面已经做的比较完善,详细可以参考: (81 封私信) 【研究综述】浅谈GPU通信和PCIe P2P DMA - 知乎

http://www.lryc.cn/news/609044.html

相关文章:

  • react native中markdown添加数学公式的支持
  • Java ++i 与 i++ 底层原理
  • 机器翻译入门:定义、发展简史与核心价值
  • [自动化Adapt] 录制引擎
  • MVCC:数据库事务隔离的 “时空魔法”
  • mysql管理
  • 【Linux系统】进程间通信:匿名管道
  • http://localhost:8080/photos/xxx.png的本地图片访问方案
  • 常见的框架漏洞(Thinkphp,spring,Shiro)
  • io_submit系统调用及示例
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-54,(知识点:硬件设计流程)
  • 知识随记-----MySQL 连接池健康检测与 RAII 资源管理技术
  • vulnhub-noob靶机攻略
  • ICT模拟零件测试方法--电位器测试
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
  • 8.1.3 TiDB集群方案雨Replication原理
  • git用户设置
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • Python Seaborn【数据可视化库】 全面讲解
  • C++ 之 【模拟实现 优先级队列】
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • 控制建模matlab练习05:比例积分控制-①系统建模
  • 【游戏比赛demo灵感】Scenario No.9(又名:World Agent)
  • 【Python✨】解决 Conda 安装 MoviePy 报错问题
  • 【Linux系统编程】进程信号
  • Rust 同步方式访问 REST API 的完整指南
  • python学智能算法(三十一)|SVM-Slater条件理解
  • Rust:如何开发Windows 动态链接库 DLL
  • 【AI编程工具IDE/CLI/插件专栏】-国外IDE与Cursor能力对比
  • 08.Redis 持久化