我非常高兴能成为 Qblox 团队的一员,该团队一直以来都在积极与 Nvidia 合作,以推广 NVQLink 标准,以此作为连接在 GPU、CPU 和 QPU(量子处理器,包括 Qblox 正在开发的前端量子控制器)上计算的异构系统的一种方式。

NVQLink概览 链接到标题

NVQLink 不是连接 GPU 和量子处理器的又一条“电缆”,而是一个完整的框架,允许互连从网络到软件堆栈的异构设备:

NVQLink 高级系统架构 图片来源:Nandod

性能规格 链接到标题

关键的“硬件”规格侧重于网络和计算资源的性能:

  • 网络吞吐量:从 GPU 到 QPU 最高可达 400 Gb/s。

  • 网络延迟:往返延迟(FPGA → GPU → FPGA)小于 4.0 微秒。

  • GPU 硬件:基于 NVIDIA GB200 Grace Blackwell 超级芯片构建的实时主机,具有大量的 TFLOPS。

你可能会问:“这为什么重要?”

  • 它创建了一个开放标准,将量子硬件与加速的 GPU 计算紧密集成。

  • 它支持混合工作流程:神经网络校准、量子纠错(QEC)等。

  • 它提供了一个将软件和硬件集成在一起的开放平台,使任何人都能与量子计算机进行交互,而无需淹没在浩瀚的知识海洋中,这要归功于Cuda-Q。

NVQLink 规范:架构设计 链接到标题

NVQLink 白皮书现已发布在 https://arxiv.org/abs/2510.25213,让我们深入了解一下所提出的架构的细节:

系统架构

NVQlink 系统架构及组件(系统图改编自白皮书中的原始图片)

正如预期,细节与Nannod提供的概要相符。从组件角度来看,NVQLink架构包含实时主机(RTH)和QPU控制系统(QSC)。这两个组件通过低延迟、可扩展的实时互连(RTI)连接。RTH拥有传统的高性能计算(HPC)资源,例如CPU和GPU。而QSC通常包含控制QPU的脉冲处理单元(PPU)。

此图引入了两个重要的关键词:fn 和 NI。在 NVQLink 的思维模型(“编程模型”)中,每个 CPU、GPU、PPU(或其他专用 IC/FPGA)都被称为“设备”,NVQLink 允许对任何这些设备进行远程过程调用(“回调”或 fn)。这是一个功能强大的解决方案,NVQLink 充当了异构系统的粘合剂。fn 运行时的实际实现经过高度优化,甚至连编组都已处理完毕。这样一来,就能确保几微秒的延迟。至于 NI,它代表网络接口,其概念是所有参与方都可以使用的“小型”可选网络卡/接口/电缆,从而构建一个统一的互连系统。

时域 链接到标题

NVQLink 还引入了非常重要的时间域概念:这是必要的,因为系统中涉及的“处理单元”并非都期望遵循“同一时钟”。

时钟或时间域分为 4 个类别,从最快到最慢: NVQLink 处理时间域

  • 物理时域(PTD):通常指 QPU 时钟。

  • 确定性时域 (DTD):通常是 QSC/FPGA 时钟,能够以量子相干时间尺度运行。

  • 实时域(RTD):通常在经典的CPU或GPU中。可以在量子相干时间范围内,也可以在两个量子相干实验之间。

  • 应用时域 (ATD):通常指运行 jupyter notebook 的笔记本电脑!

网络架构

不出所料,NVQLink 利用 RDMA 和 GPUDirect 技术来绕过任何不必要的 CPU 处理,从而确保最佳延迟。正如规范中所述,“受益于这两项技术,在处理进出 QSC 的数据包时,只有网卡和 GPU 参与,主机无需参与”。

该规范还建议使用“不可靠连接”RDMA 模式,因为与精心设计的网络相比,为可靠连接 (RC) 付出的延迟代价可能过高。

该规范为网络架构提供了一个“概念验证”,以此来验证可能达到的延迟。它使用了 Holoscan Sensor Bridge 模块,该模块能够使用基于融合以太网的 RDMA (RoCE) 协议在 FPGA 和网卡之间发送数据,并处理枚举步骤和控制信号。该规范表明,使用此架构,对于 32 字节的 RDMA 有效载荷(相当于 92 字节的以太网帧),可以实现低于 4 微秒的往返延迟。

NVQLink 网络架构概念图(图表改编自白皮书中的原始图片)

NVQLink区分了慢速模态和快速模态,本节将重点探讨快速模态架构的影响(即所谓的“高延迟敏感性”)。与慢速模态的主要区别在于,该架构支持即时编译(JIT)以及在执行过程中进行RTH(返回到目标)调解。

为了使 CudaQ + NVQLink 能够支持快速模式,规范规定_完整的指令集架构 (ISA) 程序必须预先上传到 FPGA,并以原子方式触发,执行期间与实时主机 (RTH) 的交互通信量要尽可能少_。JIT 确实是一项很棒的技术,可惜它不能用于快速模式。不过,规范明确指出,只要指令队列在程序终止前保持非空状态,FPGA 就可以“接收”来自 RTH 的动态更新(“通过_指令队列_”)。这听起来像是“即时”调度。

NVQLink + CudaQ 编译与执行工作流程

不出所料,规范明确指出编译过程必须进行积极的预先优化——这无疑是所有量子控制协议栈供应商的核心做法。规范还提到,如果需要在GPU中执行任何回调,则GPU中的CUDA内核必须预先初始化并主动等待事件——这没什么特别的,这是标准的DOCA GPUNetIO工作流程。

NVQLink + CudaQ 编译:降低工作流

CUDA=Q 编译和降维到 NVQLink 架构的工作流程基于标准的 LLVM MLIR 架构(参见上图)。第一步是解析 CUDA 内核,并生成 Quantum IR(也称为 QIR 或 QUAKE)和 CC(经典计算)中间 IR,这些中间 IR 在门级进行抽象。后续阶段引入必要的优化和内核融合,生成脉冲级方言。然后,根据模态类型,下一个降维阶段使用 RTH 或 FPGA 中介。

“量子内核”由“qpu”前缀标识。


int gpu_adder(int, int);  // This function is executed on GPU
__qpu__ int simple_quantum_kernel(int i) { // This function (kernel) is executed on the QCU
cudaq::qubit q;
h(q); // Operate an H gate on qubit q
auto readout = mz(q); // Read the Z axis of qubit q
return cudaq::device_call(2, gpu_adder, i, readout); // This is tail function call
}

在编译阶段,它首先被转换(“降级”)为 QUAKE(量子方言)和 CC(经典计算方言)中间表示(IR)或方言的混合:

func.func @simple_quantum_kernel(%arg0: i32) -> i32 {
%0 = quake.null_wire
%1 = quake.h %0 : (!quake.wire) -> !quake.wire
%measOut, %wires = quake.mz %1 : (!quake.wire) -> (!quake.measure, !quake.wire)
%2 = quake.discriminate %measOut : (!quake.measure) -> i1
%3 = cc.cast unsigned %2 : (i1) -> i32
%4 = cc.device_call @gpu_adder on 2 (%arg0, %3) : (i32, i32) -> i32
return %4 : i32
}

运行时架构:使用 traits 进行元编程 链接到标题

与 RDMA 中根深蒂固的零拷贝概念一致,NVQLINK 运行时也提倡高性能和零开销抽象,这是通过两个关键的基本概念实现的:

  • 基于特性的组合:这是一种在编译时表达任何设备行为的方法,NVQLink 提出了一组标准特性。

  • 静态多态:这是一种编译时方法,允许编译器实例化正确的方法,而无需虚函数表间接寻址。

它具备4个基本特征:

  • explicit_data_marshalling_trait:表示在系统中分配和传输数据。

  • device_callback_trait:表示调用设备函数(“RPC”)

  • quantum_control_trait:指在量子控制系统上上传并启动程序。

  • rdma_trait:表示从原始内存缓冲区高效地初始化结构。

实际上,这些特性将 C++ 语言运用到了非常高级的程度。例如,数据封送特性就是如此。

template <typename Derived> class explicit_data_marshaling_trait {
public:
void *resolve_pointer(device_ptr &devPtr);
device_ptr malloc(size_t size) const;

template <typename... Sizes, enable_if_t<(conjunction_v<is_integral<Sizes>...>),int> = 0>
auto malloc(Sizes... szs) { return make_tuple(static_cast<Derived *>(this)->malloc(szs)...); }

void free(device_ptr &d);

template <typename... Ptrs, typename = enable_if_t<(conjunction_v<is_same< remove_cv_t<remove_reference_t<Ptrs>>, device_ptr>...>)>>
void free(Ptrs &&...d) { (free(d), ...);
}
void send(device_ptr &dest, const void *src);
void recv(void *dest, const device_ptr &src);
};

这种语法蕴含着很多值得探讨的内容,在我看来,它甚至比 Rust 的语法(例如 cow)更加强大。这种语法也被称为元编程,在 NVQLINQ 的上下文中,它指的是编译时或静态多态。让我们来看一下 _template 这行代码。 <typename… Sizes, enable_if_t<(conjunction_v<is_integral …>),int> = 0>_ 更详细的信息:

  • is_integral<Sizes> as α: 如果 Sizes 是 整型,即 int、float、bool 等,则为 true

  • conjunction_v<α...> as β: 如果 α... 中的所有值都为真,则返回 true

  • enable_if_t<(β),int> 作为 δ: 一个 组 2 条件语句,如果 β 为假,则该条件语句应该失败。

  • 模板<typename... Sizes, δ = 0>: 一个 SFINAE 构造,防止 δ 失败。

使用这种语法,可以一次性对多个内存块进行专门的 malloc 分配:

class gemm_device : public explicit_data_marshalling_trait {  ... }
gemm_device gpu_gemm; // "gemm" stands for general matrix multiply
auto [column, row, matrix] = device.malloc(1024, 1024, 1024*1024);

你可能会问,这有什么意义?很简单,它允许在编译时进行最优的特化。在这种情况下,malloc 的实现可以将内存缓冲区连续地捆绑在一起,使其适用于 RDMA 交换和多个数据的原子编组。很棒,不是吗?

运行时架构:内核 链接到标题

NVQLink 提供了一套用于编译、上传和执行(触发)量子内核的标准接口。正所谓一图胜千言,我将用这张图来总结本节内容:

NVQLink 内核

需要注意的是,量子控制系统 (QCS) 由多个脉冲处理器单元 (PPU) 组成。因此,编译内核时,可能需要在多个 PPU 上同步执行。(请注意,NVQLink 对同步性没有要求,但每个 QCS 供应商都有自己的解决方案,例如 Qblox 的 SYNQ)。

在 NVQLINK 接口中,PPU 的概念被抽象化,并被 QCS 所取代,QCS 代表通用量子设备。因此,在编译内核时,NVQLINK 会为每个 QCS 生成多个程序。

运行时架构:更高层次的抽象“库” 链接到标题

由于上一节中解释的代码可能相当复杂,难以理解和扩展,因此 NVQLINK 提供了一组更高级别的 API,以函数的形式呈现:

该库包含用于处理基本初始化和关闭功能的函数,用于处理设备特定的数据修改 API(例如 memcpy),用于在逻辑 QPU 之间传输数据,以及用于处理上传和执行的函数。以下是这些函数的简化版本:

void initialize(DeviceTypes &&...in_devices);
void shutdown();

device_ptr malloc(size_t size, size_t devId);
void free(device_ptr &d);

void memcpy_to_qpu(device_ptr &arg, const void *src);
void memcpy_from_qpu(void *dest, const device_ptr &src);

handle load_kernel(const string &code, const string &kernel_name);
void launch_kernel(handle kernelHandle, device_ptr &result, const vector<device_ptr> &args);

应用示例:让我们瞬间移动 链接到标题

待完成

# 结论

NVQLink 是一个强大的系统级抽象层,它能够实现异构系统的互连,并提供高效且优化的运行时环境。与其他框架相比,NVQLink 更具吸引力之处在于,它由标准协议栈构成,包括用于网络的 RDMA、用于编译器的 LLVM,以及用于运行时的 trait 和标准化 API。

借助 NVQLINK,开发人员和集成商无需再为互连而烦恼。他们可以专注于构建异构系统,并在单一框架内编译多设备内核,然后让 NVQLINK 运行时协调不同“设备”的执行,就像它们是一个整体系统一样。NVQLINK 运行时会处理网络、编组和设备间调用,让您无需操心这些细节。

这是一次巨大的飞跃——它将与 CUDAQ 结合,使量子工程师能够创建强大的应用程序,就像英伟达 CUDA 赋能强大的神经网络应用程序一样。可以把它想象成带有量子特性的 LLM……

提示:绘制一个“大量子比特模型”的图像,该模型在通过 NVQLINK 系统连接的相邻 GPU 上进行计算。 ChatGPT 没能理解 NVLINK 不是 NVQLINK。

提示:请绘制一幅卡通风格的NVQLINK系统图,该系统将一个“大型量子比特模型”与相邻的GPU连接起来。 ChatGPT 仍然不明白 NVQLINK 不是一条“电缆”,而是一个系统级框架,它使得在多个异构设备上执行内核成为可能。而且,就目前而言,这条“电缆”预计是 RDMA(因为它是一个标准),但五年后很可能变成 NVLink。


References

DrawIO diagrams used in this memo:


.drawio .webp .svg
nvqlink network architecture concept

.drawio .webp .svg
nvqlink lowering workflow

.drawio .webp .svg
nvqlink kernel

.drawio .webp .svg
nvqlink system architecture diagram

.drawio .webp .svg
nvqlink compilation workflow

.drawio .webp .svg
time domains

In the press 链接到标题

QPU Vendor 链接到标题

Control Stack vendors 链接到标题

The un-mentionned 链接到标题