1
churchmice 2023-09-24 11:48:55 +08:00 via Android 1
因为你之前学的是错的
|
2
dududupapapa OP @churchmice 对的是啥
|
3
leonshaw 2023-09-24 12:00:57 +08:00 via Android 1
看看 MMIO 和 DMA
|
4
e9pWeUbh9PGCnp95 2023-09-24 12:38:20 +08:00 3
就是把 pcie 的 bar 空间映射到统一的地址空间里面, 实际的操作就和读写内存一样
|
5
fangjue 2023-09-24 16:48:31 +08:00 2
IN/OUT 、MOV 甚至中断都会用到,比如在 Windows 设备管理器中找到你的显卡,看看属性中资源标签页,里面会详细列出你的显卡用到的 I/O 端口、内存地址范围和中断编号。
|
6
TESTFLIGHT2021 2023-09-24 20:04:57 +08:00 1
MMIO 和 DMA
显卡自己有 DMA 控制器 你也可也用 CPU 的 DMA |
7
dududupapapa OP @leonshaw 看了一下,然后我就不太理解 cpu 上的 PCI x16 通信引脚有啥作用了。。。毕竟都直接通过内存控制了
|
8
dududupapapa OP @TESTFLIGHT2021 cpu 现在都集成了 pcie 控制器,这个控制器实现了 pcie 协议,是不是这个控制器里也就包含了固件。然后汇编指令不能够直接让 cpu 通过 PCI x16 通讯引脚发送数据,而是只能通过 MIMO 或者 DMA 机制,让 PCI x16 通讯引脚发送数据。是这样吗
|
9
TESTFLIGHT2021 2023-09-24 20:26:37 +08:00
@dududupapapa 你不需要关注底层 显卡的地址空间已经映射到了 CPU 寻址空间里
|
10
TESTFLIGHT2021 2023-09-24 20:27:37 +08:00
一般是 memory map 不是 IO 操作
|
11
dududupapapa OP @TESTFLIGHT2021 因为查了一下 cpu 的引脚描述,发现既有内存数据引脚,又有 PCI x16 通信引脚,搞不清与显卡的通信到底是通过内存数据引脚,还是 PCI x16 通信引脚,毕竟汇编语言里没有直接向 PCI x16 通信引脚发送数据的指令,就很在意就是了。我只想要知道一个大概的通信逻辑就满足了
|
12
TESTFLIGHT2021 2023-09-24 20:39:03 +08:00
@dududupapapa 那不是你需要了解的。。
|
13
RobertYang 2023-09-25 14:36:26 +08:00 1
@dududupapapa 先去了解下 PCIe 总线知识,PCIe 是个复杂的串行总线,现代设备都是直接把 PCIe EP 设备的内存地址直接映射到 CPU 的特定 MEM 区域,CPU 使用正常的访存指令访问对应的地址就能被 PCIe 控制器捕获并且从 PCIe 总线送出。IO 指令只是 X86 访问特殊地址空间的方式,PCIe 同时支持 MEM 和 IO 两种访问方式,IO 指令也不是单独给 PCI 设备用的,只是 IO 和 MEM 访问不同的地址域罢了。
|
14
AirCrusher 2023-09-25 14:36:31 +08:00 1
@dududupapapa 参考文章的第四部分
Exploring AMD GPU Scheduling Details by Experimenting With “Worst Practices”, https://www.cs.unc.edu/~otternes/papers/rtns2021.pdf |
15
dududupapapa OP @RobertYang 谢谢谢谢。。。之前就是这里没想明白,原来是控制器捕获然后送出
|
16
RobertYang 2023-09-27 11:28:11 +08:00 1
@dududupapapa SOC 上的内存地址分配你都可以理解成,CPU 送出的地址到一个 interconnect 结构上,按照对应的地址 map 分发到设置好的控制器总线上。PCIe 也不例外,PCIe 控制器在简化的角度来看可以看成一个转换桥,把 CPU 内部总线的数据包跟 PCIe 总线的数据包互相转化罢了。
|
17
RobertYang 2023-09-27 11:33:40 +08:00 1
@RobertYang 所以这里是两步,第一步是 CPU 的 Write 指令在总线形成一个数据包送到 interconnect 上,interconnect 通过地址对应关系,将这个数据包送到 PCIe 控制器上(outbound 方向),PCIe 控制器将这个包转换成 PCIe 总线的数据送出,显卡收到这个数据包。
|