标准

ACPI 是什么?

ACPI是一个开放标准,全称为Advanced Configuration and Power Interface(高级配置与电源接口)。它是一种用于电源管理和配置硬件设备的接口规范。

ACPI的主要目的是提供一种标准化的方法,使操作系统能够与计算机的固件(如BIOS)进行交互,管理电源管理、设备配置和系统资源的一致性。它定义了一组操作系统接口和数据结构,用于控制和监测硬件设备的电源状态、配置和事件。

通过ACPI,操作系统能够实现电源管理的功能,如系统的睡眠、休眠和唤醒,以及动态调整设备的功耗和性能。它还提供了高级功能,包括热插拔设备的支持、温度传感器的监测以及处理器性能的调整。

ACPI存在于大多数现代计算机系统中,并得到广泛支持。它在各种操作系统中广泛使用,包括Windows、Linux、Apple macOS等。通过ACPI,计算机系统能够更好地管理电源和硬件资源,实现能效和性能的平衡,提供更好的用户体验。

UEFI GOP 是什么?

UEFI GOP 是 UEFI(统一可扩展固件接口)中的一个图形输出协议。它提供了在 UEFI 环境下进行图形输出的标准接口。

UEFI GOP 的主要功能包括:

  • 提供图形模式设置、获取当前图形模式等图形初始化相关功能。

  • 提供绘制像素、填充矩形、绘制线条等基本图形输出功能。

  • 提供双缓冲区切换、视口管理等高级图形功能。

  • 支持各种颜色格式如 RGB、YUV 等。

  • 提供与硬件无关的抽象接口,通过 GOP 驱动与特定硬件交互。

  • 支持全屏和窗口两种输出模式。

  • 支持各种分辨率的图形输出。

通过使用 UEFI GOP,操作系统和应用可以在 UEFI 阶段实现图形界面和图形输出,如启动菜单、系统配置界面等。许多操作系统的启动器都会使用 GOP 进行图形化显示。

所以简单来说,UEFI GOP 为 UEFI 固件和操作系统提供了标准的图形输出接口,使其可以实现固件过程中的图形化显示和交互。它是实现 UEFI 图形环境的基础。

HSA 是什么?

HSA(Heterogeneous System Architecture) 是一种异构系统架构,用于在CPU和GPU等异构处理器之间进行并行计算。其主要特点包括:

  • 协处理器架构:HSA定义了主处理器(CPU)和协处理器(GPU等)之间的关系,协处理器协助CPU完成计算任务。

  • 统一地址空间:CPU和协处理器共享同一个虚拟地址空间,可以直接访问对方的内存。

  • 协作计算模型:支持CPU和协处理器之间的并行计算,任务可以自动在最合适的处理器上运行。

  • 优化数据传输:通过DMA等机制优化CPU和协处理器之间的数据传输。

  • 标准化程序接口:为开发人员提供标准化的程序接口,简化异构计算的软件设计。

HSA让CPU和GPU之间可以高效协作,优化系统整体的并行计算性能,被认为是未来异构计算架构的发展方向。AMD是HSA的主要推动者,其APU产品已经开始支持HSA。HSA也吸引了其他处理器厂商的广泛支持。

总而言之,HSA是一种创新的异构系统架构,通过处理器协作和优化提升整体计算性能,对高效并行计算有重要意义。

目前支持HSA标准的SoC产品不多,主要有:

  • AMD Kaveri APU:这是AMD于2014年发布的首款HSA 1.0兼容APU,集成CPU和GPU,支持共享虚拟内存。

  • AMD Carrizo APU:2015年发布,同样支持HSA 1.0,并进一步增强了CPU和GPU的协作计算能力。

  • AMD Ryzen APU:如Ryzen 5 2400G,集成Vega graphics,支持共享内存和异构计算。

  • AMD Raven Ridge APU:首款集成Vega图形的Ryzen移动APU,支持HSA。

  • Qualcomm Snapdragon 820:高通在Snapdragon 820平台增加了HSA 1.1支持。

  • 领悟科技(HSA Foundation)Mustang-V100-A10:这是全球首块完全兼容HSA 1.0规范的独立heterogeneous SoC。

  • 领悟科技(HSA Foundation)Mustang-F100-A10:进一步优化的heterogeneous SoC。

总体来说,AMD是目前最主要的HSA支持厂商,其多款APU产品都实现了HSA规范。高通也加入了HSA支持。此外,一些创业公司如领悟科技也推出了支持HSA的SoC。随着规范的逐步完善,预计未来将会有更多的异构SoC产品实现HSA兼容。

我:那么符合 HSA 标准的 APU 与普通的 SoC 有什么区别?

ChatGPT:

符合HSA标准的APU和普通SoC的主要区别有:

  1. 统一地址空间

HSA APU采用统一地址空间,CPU和GPU可以直接访问对方的缓存和内存,简化数据传输。普通SoC的CPU和GPU存在独立的地址空间。

  1. 优化的内存访问

HSA APU支持CPU和GPU直接访问系统内存,无需数据复制,提高效率。普通SoC需要在内存空间之间进行数据复制。

  1. 标准化的程序接口

HSA提供标准化的程序接口如HSAIL,简化异构编程的复杂ity。普通SoC缺乏统一的接口。

  1. 优化的协作计算

HSA APU通过协处理器等机制,可根据workload自动在CPU和GPU间分配任务,调度更优化。普通SoC无法做到如此灵活的协作计算。

  1. 更高效的互联

HSA APU采用高速互联如AMD的Infinity Fabric,提升CPU和GPU之间的数据传输速度。

  1. 更紧密的硬件协作

HSA APU通过硬件级的优化如内存控制器集成,实现更紧密的协作。

综上,HSA APU通过硬件架构和软件接口的优化,实现了CPU与GPU更加紧密、高效的异构计算,相比普通SoC有明显优势。这使其在并行计算性能上有显著提升。

Linux

mmu_notifier vs. mmu_interval_notifier

M: please shed light on the distinction mmu_notifier from mmu_interval_notifier in the linux kernel

C: In the Linux kernel, both MMU notifier and MMU interval notifier are used to track changes in page tables and memory mappings. However, there are some differences between the two:

MMU notifier is used to track changes to page tables and memory mappings, and it is designed to be a general-purpose notifier. It is used by various subsystems in the kernel, such as memory management, file systems, and device drivers.

MMU interval notifier, on the other hand, is used specifically to track changes to a range of memory pages. It is used by subsystems that need to be notified of changes to a particular range of memory pages, such as virtualization subsystems.

In summary, MMU notifier is a more general-purpose notifier used to track changes to page tables and memory mappings, while MMU interval notifier is used specifically to track changes to a range of memory pages.

Why is wound/wait mutex capable of deadlock avoidance in the linux kernel?

In the Linux kernel, the wound/wait mutex is a synchronization mechanism used to protect shared data structures from concurrent access by multiple threads. It is called wound/wait mutex because a thread that tries to acquire the mutex is wounded (i.e., put to sleep) and waits until it can acquire the mutex.

The wound/wait mutex is capable of deadlock avoidance because it uses a priority inheritance protocol to prevent priority inversions, which can cause deadlocks. In a priority inversion scenario, a high-priority thread is blocked by a lower-priority thread that holds a resource it needs, which can lead to a deadlock. The priority inheritance protocol ensures that the priority of the thread holding the mutex is temporarily boosted to the same priority as the highest-priority thread waiting for the mutex, preventing priority inversions and potential deadlocks.

In summary, the wound/wait mutex is capable of deadlock avoidance because it uses a priority inheritance protocol to prevent priority inversions and potential deadlocks.

伤口/等待互斥锁是一种用于Linux内核的互斥锁类型,由于其独特的实现方式,能够避免死锁。

在伤口/等待互斥锁中,当一个线程尝试获取已经被锁定的互斥锁时,它会被“伤口”,并被放置在无法运行的状态。之后互斥锁等待锁的所有者释放锁才唤醒该线程。这种方法确保了等待互斥锁的线程在等待期间不会旋转或消耗CPU资源,从而有助于避免死锁。

此外,伤口/等待互斥锁可以通过跟踪锁获取的顺序来检测潜在的死锁情况。如果一个线程试图获取已经被另一个线程持有,并且该线程正在等待第一个线程的锁,则可能会出现死锁情况。但是,伤口/等待互斥锁会检测到这种情况并通过释放第二个锁并唤醒等待线程来解决死锁问题。

总体而言,在Linux内核中,伤口/等待互斥锁能够避免死锁,因为它具有高效的等待机制,并且能够检测和解决潜在的死锁情况。

为什么 Sleep to RAM 在 Linux 里又被称为 S3?

在Linux中,Sleep to RAM模式被称为S3,因为它对应于ACPI(高级配置和电源接口)规范的系统状态S3。 ACPI规范为计算机系统定义了几种电源状态,从完全开启(S0)到完全关闭(S5)。

系统状态S3表示“睡眠”状态,在此状态下,计算机将其当前状态保存到RAM内存中,然后关闭大部分组件以节省电力。当用户唤醒计算机时,它会从RAM中恢复保存的状态并恢复操作。

在ACPI中,每个电源状态都被分配一个唯一的标识符,以”S”开头,后面跟着一个数字。因此,S3特指将内容保存在易失性内存中以便快速恢复操作的Sleep to RAM模式。

AMDGPU KFD 是什么意思?

AMDGPU KFD(Kernel Fusion Driver)是AMDGPU开源驱动的一部分,用于支持多个GPU和CPU的异构计算。它是AMD在Linux内核中添加的一个模块,用于管理GPU和CPU之间的数据传输和任务调度。

AMDGPU KFD为AMD的异构计算提供了统一的编程接口,使开发人员能够利用GPU和CPU共同完成计算任务。它支持OpenCL和HSA(Heterogeneous System Architecture)等开放标准,允许开发人员在不同的硬件设备上编写并运行并行计算代码。

通过AMDGPU KFD,开发人员可以利用GPU的高度并行处理能力,加速复杂的计算任务,提高应用程序的性能和效率。同时,它也为图形驱动程序提供了必要的功能,以便正确管理和配置GPU和CPU之间的通信和协作。

我:在 linux 源码树里并不能搜到 “Kernel Fusion Driver” 字串。但可以搜到 AMD 出品的 APU (加速处理器) 的名字字串,像 “Kaveri”, “Carrizo”, 这些 APU 都是符合 HSA 标准的,由此可以说 AMDGPU KFD 主要是为这些 APU 产品所写的内核驱动。

AMDGPU KGD 是什么意思?

抱歉,我之前给出的回答有误。实际上,AMDGPU KGD(Kernel Graphics Driver)是指用于AMDGPU开源驱动的一部分,这部分专注于图形渲染和显示相关的功能。

AMDGPU KGD模块负责在Linux内核中管理和控制显卡的图形渲染流程。它提供了对AMD显卡的低级别访问,允许应用程序通过调用相应的API来与显卡进行通信,并控制图像的输出和显示。

通过AMDGPU KGD,开发人员可以在Linux系统上进行图形渲染和加速,并使用OpenGL、Vulkan等图形API来开发和运行图形相关的应用程序。此外,AMDGPU KGD还提供了一些额外的功能,如显卡的电源管理、显卡状态的查询和控制等。

计算机术语

什么是 Snoop the cache?

“Snoop the cache” 是计算机架构中的一个术语,用于指代处理器在多处理器系统中维护缓存一致性的技术。在多处理器系统中,每个处理器都有自己的缓存内存,这可能会导致不一致性,因为不同缓存可能持有相同数据的不同版本。

当处理器需要访问某个内存位置时,它首先检查自己的缓存中是否有该数据。如果在缓存中找不到该数据,处理器将向主内存发送请求以检索数据。然而,如果其他处理器在其缓存中有该数据的副本,则请求处理器需要使该副本失效,以确保获得最新版本的数据。

这就是“snoop the cache”的作用。发送请求到主内存的处理器还会向系统中所有其他处理器广播特殊信号(称为 snoop 信号)。这个 snoop 信号告诉其他处理器检查它们的缓存是否有被请求的数据的任何副本。如果发现了副本,则持有该副本的处理器会使其失效,并向请求处理器发送确认。这个过程确保所有处理器都有最新的数据副本,并维护系统中的缓存一致性。

什么叫 pointer chasing?

“指针追踪”是一种描述通过跟随指针从一个节点到另一个节点遍历链式数据结构的过程。指针本质上是一个变量,用于存储另一个对象或数据结构的内存地址,在像C和C ++这样的编程语言中被广泛用于实现链表、树、图和其他复杂的数据结构。

在”指针追踪”中,您从指向链表中第一个节点的指针开始,然后沿着指针到下一个节点,直到到达列表的末尾。可以重复对每个节点执行此过程以遍历整个数据结构。

“指针追踪”可能会引起计算上的开销,因为它涉及访问内存中的不同位置,这可能导致缓存未命中并降低程序的性能。但是,在处理链接数据结构时,这是必要的操作,并且有一些优化技术可以用于减少访问内存的开销,例如预取和缓存策略。

什么是 DMA coherence?

DMA一致性是一种机制,用于在DMA传输期间确保缓存中的数据与内存中的数据一致性。DMA是一种用于设备直接访问系统内存而无需涉及CPU的技术。

在具有DMA一致性的系统中,如果设备需要从主存储器读取或写入数据,则必须首先检查缓存以确保它要访问的数据是最新的,然后才能访问内存。类似地,在设备将数据写入内存后,缓存控制器会确保缓存被更新为新数据,以便后续的读取将检索到最新的数据。

DMA一致性非常重要,因为如果没有它,缓存中的数据和内存中的数据之间可能存在不一致性。这可能会导致系统的不正确行为,因为系统的不同部分可能对相同的数据具有不同的视图。DMA一致性确保系统中的所有设备都具有数据的一致视图,从而导致正确的行为和高效的性能。

为什么一个 64-bit 的值不是原子的 (atomic)?

一个64位的值不是原子性的,因为读取或写入其完整值需要多个操作。在计算机系统中,如果一个操作似乎瞬间发生,并且不能被并发操作中断,那么它被认为是原子的。原子性对于某些情况非常重要,特别是在多线程或并发编程中,以避免竞态条件并确保数据一致性。

在大多数处理器中,64位值不是自然对齐的,而是通常被分成两个32位或四个16位块来存储。读取或写入这样的值需要多次内存访问或CPU指令。

当多个线程或进程同时尝试访问相同的64位值时,可能会出现一个线程的操作干扰另一个线程,导致结果不一致或错误。这被称为数据竞争。

为了处理对64位值的原子操作,现代处理器提供了专门的指令或技术,如比较并交换(CAS)或双字比较并交换(DCAS)。这些指令确保对64位值的读取-修改-写入操作在没有其他线程或进程干扰的情况下原子执行。

总之,一个64位的值不是原子性的,因为读取或写入其完整值需要多次内存访问或CPU指令。要实现对64位值的原子操作,需要使用专门的指令或技术。

什么是异构内存管理?

异构内存管理(Heterogeneous Memory Management)是一种技术,用于管理系统中不同类型和特性的内存资源,例如主机内存、图形处理器(GPU)内存和其他加速设备的内存。

在传统计算中,CPU是主要处理器,并具有对系统内存的直接访问权限。然而,现代系统中经常存在其他类型的加速处理器,如GPU、FPGA等,它们具有自己的内存资源。异构内存管理的目标是使应用程序能够跨多个处理器和内存域进行数据共享和协作,从而实现更高效的计算和数据处理。

通过异构内存管理,开发人员可以使用特定的API和技术来实现数据在不同内存域之间的传输和共享。这包括将数据从主机内存传输到GPU内存,以便进行并行计算,以及在不同内存域之间进行数据混合和迁移等操作。

异构内存管理可以提高系统性能,有效利用加速处理器的计算能力,并简化开发过程。它使开发人员能够更好地利用不同类型的内存资源,以实现更高效、灵活和可扩展的计算。

APU 一般应该解释为应用处理器还是加速处理器?

APU 一般来说被解释为加速处理器(Accelerated Processing Unit)更为准确。

主要原因有:

  1. AMD 最先提出 APU 的概念,将其定义为集成CPU和GPU的加速处理器。AMD 认为 APU 通过异构计算,可以加速图形、视频等特定应用的处理速度。

  2. Intel 虽然也使用 APU 这个词,但官方解释为高级处理器(Advanced Processing Unit),意思相近但侧重点不同。

  3. APU 的关键特征是 CPU 与 GPU 的紧密集成,通过协同运算实现计算加速,这与应用处理器的概念有所不同。

  4. 应用处理器通常指 ARM 等 RISC 架构的可嵌入式处理器,用于嵌入式、移动等专门应用,而 APU 通常用于 PC、游戏主机等通用计算平台。

  5. 行业与媒体解读也更多认为 APU 是加速处理器的概念,能加速特定应用场景下的计算性能。

综合来说,APU 的完整 expansition 更准确地应该是Accelerated Processing Unit,highlight 其异构计算能力带来的加速效果。将其解释为应用处理器存在一定的偏差。

Graphics

解释一下 OpenGL 中的 framebuffer 的 layer count 和 geometry shader 中的 gl_Layer 的不同

在OpenGL中,帧缓冲区(framebuffer)的层级(layer count)和几何着色器(geometry shader)中的gl_Layer有不同的含义和用途。

  1. 帧缓冲区的层级(Layer Count):
    帧缓冲区的层级是指帧缓冲区对象中可以存储多少个独立的图像层。每个图像层都可以包含颜色、深度、模板等数据。通常,帧缓冲区的层级用于多重采样和纹理数组等技术,以处理复杂的渲染任务。例如,对于3D纹理渲染到立方体贴图,可以使用一个帧缓冲区对象,其中包含6个图像层,每个层级代表立方体贴图的一个面。

  2. 几何着色器中的gl_Layer
    几何着色器是OpenGL中的一个着色器阶段,用于对原始几何图元进行处理和变换。在几何着色器中,gl_Layer是一个内建变量,用于指示当前处理的几何图元所属的图层。gl_Layer的值是一个整数,表示当前图元所属的层级。几何着色器可以使用gl_Layer来决定将图元输出到哪个图层,以便进行后续的渲染处理。

总结:
帧缓冲区的层级(layer count)是指帧缓冲区对象可以存储的图像层数量,用于多重采样和纹理数组等技术。而几何着色器中的gl_Layer是一个内建变量,用于表示当前几何图元所属的层级,可以在几何着色器中根据不同需求对图元进行处理和发送到不同的层级。它们是在不同的上下文中使用的概念,不要混淆它们的含义。