鲲鹏社区首页
中文
注册
开发者
鲲鹏统一并行加速库KUPL--异步数据拷贝

鲲鹏统一并行加速库KUPL--异步数据拷贝

HPC

发表于 2025/11/25

0

基本概念与背景

基础概念

异步拷贝是一种数据拷贝技术,调用拷贝函数后立即返回,无需等待数据完全拷贝完成,数据拷贝在后台进行。

异步内存拷贝和同步拷贝的主要区别在于操作的执行方式和资源利用效率。异步拷贝允许任务在后台执行,而同步拷贝则需要等待操作完成后才能继续执行。

优势对比

以下是异步内存拷贝对比同步拷贝的主要优势:

1、提高资源利用率:异步拷贝在执行内存传输时,不会阻塞主线程或主程序。这意味着 CPU 可以在等待内存操作完成的同时执行其他任务,从而提高整体资源利用率。

2、减少等待时间:同步拷贝需要等待操作完成后才能继续执行,这可能导致程序的主线程处于空闲状态。而异步拷贝通过并行处理,可以显著减少等待时间,提升程序的响应速度。

3、灵活性更高:异步拷贝允许开发者更灵活地设计程序逻辑,例如通过回调函数、事件驱动等机制处理操作完成后的任务。这种灵活性使得异步编程在复杂场景中更具优势。

综上所述,异步数据拷贝能够实现数据拷贝和计算的相互隐藏,提高资源利用率,对于HPC具有重要作用;基于鲲鹏高性能CPU硬件平台,实现一套异步数据拷贝功能,对于鲲鹏HPC具有必要性。

推荐场景

符合以下特性的问题可采用异步数据拷贝进行解决:

1、数据拷贝任务不要求立即完成;

2、计算任务与数据拷贝任务无依赖关系,可并行。

满足上述场景的问题,使用异步数据拷贝方法,能够实现数据拷贝和计算的相互隐藏,实现性能优化。

业界总览

异步数据拷贝作为现代高性能计算的重要技术,已在多个技术领域形成成熟且多样化的实现方案。其核心目标是在不阻塞主线程/主设备的前提下完成数据传输,从而实现计算与通信的重叠,最大化系统吞吐与资源利用率。

CUDA异步数据拷贝是GPU编程中提升性能的关键技术,它允许数据传输与计算并行执行,从而隐藏数据传输的延迟,实现计算与通信的重叠。CUDA异步数据拷贝实现了数据传输操作在指定的CUDA流中异步执行,通过流机制实现计算与数据传输的重叠,提升GPU利用率,避免等待数据传输时的空闲。

KUPL异步拷贝与鲲鹏920新型号CPU硬件平台

KUPL全称鲲鹏统一并行加速库,是基于鲲鹏处理器深度优化的并行加速库,高效使能HPC各领域应用。

System Direct memory access(SDMA)是鲲鹏硬件平台中负责数据的高带宽低延迟搬运的模块,是一种分布式分离式的DMA引擎。SDMA提供安全和性能两种模式,可满足多种应用场景需求,能够支持高性能异步数据拷贝;鲲鹏硬件平台提供了SDMA设备,为鲲鹏HPC异步数据拷贝提供了硬件支持。

KUPL是基于鲲鹏硬件平台的编程框架;在此基础上,KUPL实现了基于鲲鹏硬件SDMA单元,进行异步数据拷贝的方法。KUPL异步数据拷贝基于SDMA模块,提供了高效的异步数据拷贝功能,高效使能鲲鹏硬件能力。

KUPL异步数据拷贝相关基础概念介绍

KUPL异步数据拷贝的实现依托于KUPL队列和事件,提供了一维、二维的异步数据拷贝接口。以下是相关基础概念介绍说明。

KUPL队列与事件

KUPL异步数据拷贝需要了解KUPL多队列多流编程,而使用多队列多流编程首先需要了解队列(queue)和事件(event)相关的概念。

多队列编程也是使用依赖进行编程的方式。队列(queue)用于组织和执行一系列操作, 这些操作按顺序在流中执行,但不同流之间的操作可以并行执行(如果硬件资源允许)。事件(event)是一个轻量级的同步标记,用于记录时间点或标记流中的某个位置。事件可以插入到流中, 用于事件同步或者队列间同步。

KUPL异步数据拷贝接口入参包括可选参数queue与必选参数event。传入参数queue代表将异步数据拷贝任务提交到该queue上,若queue传空则不需要将异步拷贝任务提交到任何queue上;event是必选参数,用于后续的同步操作。

一维/二维数据拷贝

一维数据拷贝,即为一个维度上的数据的拷贝,如下图所示,将以src为起始地址的len长度的数据拷贝到以dst为起始地址的len长度的位置。

二维数据拷贝,即为两个维度上的数据的拷贝,如下图所示,将width*height大小的数据,从src拷贝到dst位置,其中src数据每拷贝width长度,间隔spitch-width长度;dst数据每存放width长度,间隔dpitch-width长度。

KUPL异步数据拷贝能够支持一维、二维的数据拷贝。

异步数据拷贝与计算相互隐藏

KUPL实现了异步数据拷贝,在下发数据拷贝任务后,不必等待拷贝完成。异步数据拷贝能够实现数据拷贝和计算的相互隐藏,提高资源利用率;KUPL底层通过SDMA设备实现异步数据拷贝。

如下图所示,当计算任务(C)与数据拷贝任务(A->B)不存在数据依赖时,在单核情况下,可通过异步数据拷贝任务与计算任务的并行,实现异步数据拷贝与计算相互隐藏。

KUPL异步数据拷贝example介绍

下面将就A->B异步数据拷贝与C计算隐藏的示例进行说明。具体的,程序需要完成A->B的拷贝与C的计算;在单核情况下,可通过异步数据拷贝实现任务并行。

一、创建需要的queue/event

q1 = kupl_queue_create();		// 用于数据拷贝的队列
q2 = kupl_queue_create();		// 用于计算的队列
event = kupl_event_create();

二、提交异步数据拷贝任务

kupl_memcpy_async(B, A, len, q1, event);	// A->B数据拷贝

三、提交计算任务

kupl_queue_item_desc_t desc = {
    .func = compute_c,			// C计算任务
    .args = nullptr
};
kupl_queue_submit(q2, &desc);

四、等待任务执行完成

kupl_queue_wait(q2);		//等待计算任务执行完成
kupl_event_wait(event);		//等待数据拷贝任务执行完成

五、销毁event/queue

kupl_event_destroy(event);
kupl_queue_destroy(q1);
kupl_queue_destroy(q2);

总结

KUPL异步数据拷贝基于鲲鹏硬件SDMA单元,提供了高效的异步数据拷贝功能,能够实现数据拷贝和计算的相互隐藏,提升HPC应用性能。

本页内容