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


NVQLink 不是连接 GPU 和量子处理器的又一条“电缆”,而是一个完整的框架,允许互连从网络到软件堆栈的异构设备:
图片来源:Nandod
关键的“硬件”规格侧重于网络和计算资源的性能:
网络吞吐量:从 GPU 到 QPU 最高可达 400 Gb/s。
网络延迟:往返延迟(FPGA → GPU → FPGA)小于 4.0 微秒。
GPU 硬件:基于 NVIDIA GB200 Grace Blackwell 超级芯片构建的实时主机,具有大量的 TFLOPS。
为什么需要 NVQLink
链接到标题
你可能会问:“这为什么重要?”
它创建了一个开放标准,将量子硬件与加速的 GPU 计算紧密集成。
它支持混合工作流程:神经网络校准、量子纠错(QEC)等。
它提供了一个将软件和硬件集成在一起的开放平台,使任何人都能与量子计算机进行交互,而无需淹没在浩瀚的知识海洋中,这要归功于Cuda-Q。
NVQLink 规范:架构设计
链接到标题
NVQLink 白皮书现已发布在 https://arxiv.org/abs/2510.25213,让我们深入了解一下所提出的架构的细节:
系统架构
(系统图改编自白皮书中的原始图片)
正如预期,细节与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 个类别,从最快到最慢:

物理时域(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 微秒的往返延迟。
(图表改编自白皮书中的原始图片)
编译架构(又称 CudaQ+NVQLink 编程模型)
链接到标题
NVQLink区分了慢速模态和快速模态,本节将重点探讨快速模态架构的影响(即所谓的“高延迟敏感性”)。与慢速模态的主要区别在于,该架构支持即时编译(JIT)以及在执行过程中进行RTH(返回到目标)调解。
为了使 CudaQ + NVQLink 能够支持快速模式,规范规定_完整的指令集架构 (ISA) 程序必须预先上传到 FPGA,并以原子方式触发,执行期间与实时主机 (RTH) 的交互通信量要尽可能少_。JIT 确实是一项很棒的技术,可惜它不能用于快速模式。不过,规范明确指出,只要指令队列在程序终止前保持非空状态,FPGA 就可以“接收”来自 RTH 的动态更新(“通过_指令队列_”)。这听起来像是“即时”调度。

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

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 运行时也提倡高性能和零开销抽象,这是通过两个关键的基本概念实现的:
它具备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 提供了一套用于编译、上传和执行(触发)量子内核的标准接口。正所谓一图胜千言,我将用这张图来总结本节内容:

需要注意的是,量子控制系统 (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:
In the press
链接到标题
QPU Vendor
链接到标题
Control Stack vendors
链接到标题
The un-mentionned
链接到标题