英伟达CUDA 13.0:统一Arm开发,边缘AI性能大增。

2025-09-03AI工具

Image

英伟达(NVIDIA)专为Jetson Thor系统级芯片(SoC)开发的CUDA 13.0工具包即将面世,这款由英伟达Blackwell GPU架构驱动的最新产品,预示着嵌入式和边缘计算领域将迈向更快、更高效、更通用的新纪元。新媒网跨境获悉,此次发布的CUDA 13.0核心亮点在于其为Arm平台提供了统一的CUDA工具包,打破了以往服务器级与嵌入式系统需要独立工具包的局面。此外,Jetson Thor还将支持带有完整缓存一致性的统一虚拟内存(UVM)、诸如多进程服务(MPS)和绿色上下文等GPU共享功能、增强的开发者工具,以及全新的互操作性选项。这些前沿进展将共同为开发者带来更流畅的工作流程,并在边缘AI应用中开启性能与便携性的更多可能性。

统一Arm平台的CUDA开发体验:一次构建,随处部署

CUDA 13.0通过统一服务器级和嵌入式设备的CUDA工具包,极大地简化了Arm平台的开发流程。开发者不再需要为符合服务器基础系统架构(SBSA)标准的服务器或像Thor这样的下一代嵌入式系统维护独立的安装或工具链。目前唯一的例外是Orin(sm_87),它将暂时沿用现有路径。

这一变革为开发者带来了显著的效率提升。开发者现在可以一次性构建机器人或AI应用,先在GB200和DGX Spark等高性能系统上进行模拟测试,然后无需任何代码修改,就能将完全相同的二进制文件直接部署到像Thor这样的嵌入式目标设备上。尽管编译器和运行时仍会为目标GPU架构生成优化的代码,但开发者无需再管理两个工具链。如下方图1所示,这种统一的开发流程大大简化了操作。

统一化还延伸到了容器层面,整合了英伟达的镜像生态系统,使得模拟、测试和部署工作流能够依赖共享的容器 lineage。这减少了重复构建,降低了持续集成(CI)开销,并为从代码到硬件的转换提供了更顺畅的路径。

对于开发团队而言,这意味着CI流水线中的重复工作减少,容器管理更简单,且由于无需处理不同的SDK,一致性得到了提高。对于企业来说,它为跨模拟和边缘平台的构建提供了一个单一的真相来源,从而节省了工程时间,并提高了跨不断演进的GPU代系和平台的代码可移植性。这也为在Jetson和IGX平台上同时使用集成GPU(iGPU)和独立GPU(dGPU)铺平了道路,提供了无缝且高效的计算体验。
Comparison of developer workflow before and after CUDA Toolkit unification. Before on the left: Developers install either the SBSA Toolkit or Jetson Toolkit separately. Development, build, and simulation/deployment require transferring code between toolkits. With after on the right, developers install a single unified toolkit, enabling a streamlined workflow where development leads directly to build, with both simulation and deployment supported without extra transfers.
图1:统一的工具包消除了维护多个代码库的必要性,并简化了开发流程。

CUDA 13.0中统一虚拟内存(UVM)与完整缓存一致性的工作机制

英伟达Jetson平台首次支持统一虚拟内存(UVM)和完整的缓存一致性。这项技术允许设备通过主机的页表访问可分页的主机内存。

在Jetson Thor平台上,cudaDeviceProp::pageableMemoryAccessUsesHostPageTables被设置为1,这表明GPU可以通过主机的页表访问可分页的主机内存。GPU对这些CPU缓存内存的访问也会在GPU上进行缓存,并通过硬件互连机制管理完整的缓存一致性。

实际应用中,通过mmap()malloc()创建的系统分配内存现在可以直接在GPU上使用。类似地,使用cudaMallocManaged()创建的分配也将报告cudaDeviceProp::concurrentManagedAccess为1,这意味着设备可以与CPU并发访问此内存,并且像cudaMemPrefetchAsync()这样的API也能按预期工作。然而,在CUDA 13.0中,cudaMallocManaged()分配的内存不会在GPU上缓存。

这些变化使得Jetson平台上的UVM功能与独立GPU(dGPU)系统保持一致。以下示例演示了如何使用mmap()将文件映射到内存中,并直接在GPU内核中对该指针进行直方图操作。输出直方图缓冲区同样通过mmap()获取,无需任何CUDA分配调用。输入数据和输出直方图均缓存在GPU的L2缓存中,并且一致性由硬件自动管理。这消除了对显式CUDA分配或cudaMemcpy()调用的需求,同时保持了良好的性能。

#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

#define HIST_BINS 64
#define IMAGE_WIDTH 512
#define IMAGE_HEIGHT 512

// Error handling macro
#define CUDA_CHECK(call) \
    if ((call) != cudaSuccess) { \
        cudaError_t err = cudaGetLastError(); \
        printf("CUDA error calling \""#call"\", code is %d\n", err); \
    }

__global__ void histogram(
    unsigned int elementsPerThread,
    unsigned int *histogramBuffer,
    unsigned int *inputBuffer)
{
    unsigned int offset = threadIdx.x + blockDim.x * blockIdx.x;
    unsigned int stride = gridDim.x * blockDim.x;

    for (unsigned int i = 0; i < elementsPerThread; i++) {
        unsigned int indexToIncrement = inputBuffer[offset + i * stride] % HIST_BINS;
        atomicAdd(&histogramBuffer[indexToIncrement], 1);
    }
}

int main(int argc, char **argv)
{
    size_t alloc_size = IMAGE_HEIGHT * IMAGE_WIDTH * sizeof(int);
    size_t hist_size = HIST_BINS * sizeof(int);

    unsigned int *histogramBuffer = (unsigned int*)mmap(NULL, hist_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    unsigned int *inputBuffer;

    cudaEvent_t start, end;
    float timeInMs;

    const unsigned int elementsPerThread = 4;
    const unsigned int blockSize = 512;

    dim3 threads(blockSize);
    dim3 grid((IMAGE_WIDTH * IMAGE_HEIGHT) / (blockSize * elementsPerThread));

    int fd;

    if (setenv("CUDA_MODULE_LOADING", "EAGER", 1) != 0) {
        printf("Error: Unable to set environment variable CUDA_MODULE_LOADING.\n");
        return -1;
    }

    fd = open("inputFile.bin", O_RDONLY, 0);
    if (fd == -1) {
        printf("Error opening input file: inputFile.bin\n");
        return -1;
    }

    inputBuffer = (unsigned int*)mmap(NULL, alloc_size, PROT_READ, MAP_PRIVATE, fd, 0);

    CUDA_CHECK(cudaEventCreate(&start));
    CUDA_CHECK(cudaEventCreate(&end));
    CUDA_CHECK(cudaEventRecord(start, NULL));

    histogram<<<grid, threads>>>(elementsPerThread, histogramBuffer, inputBuffer);

    CUDA_CHECK(cudaEventRecord(end, NULL));
    CUDA_CHECK(cudaStreamSynchronize(NULL));
    CUDA_CHECK(cudaEventElapsedTime(&timeInMs, start, end));

    printf("Elapsed Time was %f ms.\n", timeInMs);

    munmap(histogramBuffer, hist_size);
    munmap(inputBuffer, alloc_size);
    close(fd);

    return 0;
}

提升跨工作负载的GPU共享效率

CUDA 13.0在多项GPU共享功能上继续深耕,旨在提高GPU利用率和性能。

通过MPS释放Tegra的GPU全部潜力

随着Tegra GPU计算能力的不断提升,单个进程往往难以充分利用其全部可用的GPU资源,尤其是在工作负载较小或具有突发性(例如应用程序中多个小型生成式AI代理)时,这可能导致多进程系统效率低下。

多进程服务(MPS)解决了这一问题,它允许多个进程并发共享GPU,避免了上下文切换的开销,从而实现了真正的并行执行。MPS将轻量级工作负载整合到单一GPU上下文中,从而提高了占用率、吞吐量和可扩展性。重要的是,MPS无需应用程序代码修改,因此可以轻松集成到现有的多进程架构中。

对于构建现代化多进程应用程序的开发者而言,MPS是释放Tegra GPU全部性能潜力的关键。

在Tegra上开始使用MPS:

MPS相关的两个二进制文件nvidia-cuda-mps-controlnvidia-cuda-mps-server通常存储在/usr/bin目录下。

要启动MPS控制守护进程,请按照以下步骤操作:

export CUDA_MPS_PIPE_DIRECTORY=<Path to pipe dir>
export CUDA_MPS_LOG_DIRECTORY=<Path to log dir>
nvidia-cuda-mps-control -d   # Start the control daemon in background mode
ps –ef | grep mps         # To check if MPS control daemon has started

要将应用程序作为MPS客户端运行,请设置与守护进程相同的管道和日志目录,然后正常运行应用程序。

日志文件存储在$CUDA_MPS_LOG_DIRECTORY/control.log$CUDA_MPS_LOG_DIRECTORY/server.log

要停止MPS:

echo quit | nvidia-cuda-mps-control

更多详细信息请参阅MPS文档。

通过绿色上下文实现确定性GPU调度

绿色上下文是轻量级的CUDA上下文,它们预先分配GPU资源,特别是流式多处理器(SM),以确保确定性执行。通过提前分配SM,每个上下文的运行不会受到其他活动的影响,从而提高了对延迟敏感型工作负载的可预测性。

例如,Jetson上的机器人应用程序可能同时运行SLAM(即时定位与地图构建)、目标检测和运动规划,每个都有不同的实时性要求。为了满足可预测延迟、资源隔离和高效GPU利用率的综合要求,开发者可以结合使用多实例GPU(MIG,一项将在未来版本中推出的功能)、绿色上下文和MPS。

MIG将GPU划分为独立的切片,这样时间关键型模块(如SLAM)就不会受到对时间不那么敏感的任务的资源需求影响。在每个MIG切片内,绿色上下文通过CUDA驱动程序API调用(如cuDevSmResourceSplitByCountcuGreenCtxCreate)实现SM向特定CUDA上下文的确定性分配。多个进程可以各自创建自己的绿色上下文,且SM分配不重叠。以下代码片段演示了绿色上下文的用法:

CUdevResource fullSMs;
CUdevResource smGroupA, smGroupB;
CUdevResourceDesc descA, descB;
CUgreenCtx ctxA, ctxB;
CUstream streamA, streamB;

// Get all SMs from device
cuDeviceGetDevResource(device, &fullSMs, CU_DEV_RESOURCE_TYPE_SM);

// Split SMs: assign 1 SM to ctxA, rest to ctxB
unsigned int minCount = 1;
cuDevSmResourceSplitByCount(&smGroupA, &nbGroups, &fullSMs, &smGroupB, 0, minCount);

// Generate descriptors
cuDevResourceGenerateDesc(&descA, &smGroupA, 1);
cuDevResourceGenerateDesc(&descB, &smGroupB, 1);

// Create Green Contexts
cuGreenCtxCreate(&ctxA, descA, device, CU_GREEN_CTX_DEFAULT_STREAM);
cuGreenCtxCreate(&ctxB, descB, device, CU_GREEN_CTX_DEFAULT_STREAM);

// Create streams bound to contexts
cuGreenCtxStreamCreate(&streamA, ctxA, CU_STREAM_NON_BLOCKING, 0);
cuGreenCtxStreamCreate(&streamB, ctxB, CU_STREAM_NON_BLOCKING, 0);

当与MPS结合使用时,此设置允许跨进程并发执行,同时保持SM隔离,只要CUDA_MPS_ACTIVE_THREAD_PERCENTAGE环境变量设置为100或未设置即可。这种配置为每个模块保持了一致的性能,在机器人技术中尤其有价值,因为实时保证和高效多任务处理对于安全响应的运行至关重要。

借助增强的开发者工具获得更好的可见性和控制能力

CUDA 13.0为Jetson Thor平台带来了重要的开发者工具增强,包括对nvidia-smi工具和英伟达管理库(NVML)的支持。这些工具对于许多独立GPU(dGPU)开发者来说已然熟悉,现在也赋予了Jetson开发者对GPU使用情况的更深入洞察和对资源的更大控制。

通过nvidia-smi,开发者可以查询GPU的详细信息,例如设备名称、型号、驱动程序版本和支持的CUDA版本。它还可以报告实时的GPU利用率,从而在开发和调试期间更轻松地监控工作负载行为。

NVML库通过C和Python API提供了对类似功能的编程访问。这使得GPU监控和管理可以集成到自定义工具、CI流水线或部署脚本中。

尽管nvidia-smi和NVML现在已在Jetson Thor上得到支持,但某些功能——例如时钟、功耗和热量查询;每个进程的利用率;以及SoC内存监控——目前尚未提供。本次发布是一个显著的进步,预计在未来的更新中将实现更广泛的功能对等。

通过DMABUF简化内存共享

CUDA 13.0引入了一项新功能,支持在支持开源GPU驱动程序OpenRM的平台上,将CUDA分配的缓冲区转换为dmabuf文件描述符,反之亦然。在Linux系统中,dmabuf提供了一个标准化接口,用于在各种内核模式设备驱动程序之间共享和同步I/O缓冲区。应用程序在用户空间以Linux文件描述符(FD)的形式接收这些缓冲区,从而实现在子系统之间的零拷贝共享。

在新媒网跨境了解到,在Tegra平台(如Jetson车载平台)上,通常使用EGL或NvSci解决方案进行内存共享。随着OpenRM的引入以及采用基于FD机制的L4T插件,dmabuf的集成——与现有专有选项并存——是CUDA、第三方设备和开源软件堆栈之间实现无缝互操作性的重要一步。

将dmabuf导入CUDA内存需要使用CUDA外部资源互操作性API,并将dmabuf添加为一种新的外部内存类型。图2对此进行了概述。
Diagram illustrating the addition of support for a new non-CUDA memory type, dma-buf, as CUDA external memory. The figure shows how dma-buf can now be mapped into either a CUDA pointer or a CUDA array, enabling interoperability between external memory buffers and CUDA.
图2:将dmabuf作为外部内存导入CUDA的工作流程。

将CUDA分配导出为dmabuf通过驱动程序API调用cuMemGetHandleForAddressRange()在受支持的OpenRM平台上完成。应用程序可以使用cuDeviceGetAttribute()并配合CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED属性来检查支持情况,如果可以从CUDA主机内存分配中检索dmabuf,该属性将返回1。

图3展示了应用程序如何将dmabuf文件描述符导入和导出到CUDA,以及如何进行逆向操作。
Sequence diagram showing how CUDA applications can export and import DMA-BUF file descriptors as external memory. The process starts with querying device attributes, optionally retrieving a DMA-BUF handle for a CUDA pointer, and then importing that handle back as external memory. The application can map it to a CUDA pointer, launch kernels on it, and finally destroy resources.
图3:使用dmabuf作为CUDA外部内存的流程:将CUDA指针导出为dmabuf,将其导入回来,并在内核中使用。

将NUMA感知型应用程序移植到Jetson Thor平台

CUDA 13.0还为Tegra引入了非统一内存访问(NUMA)支持。NUMA架构将CPU核心和内存分组到不同的节点中,每个节点对其本地内存的访问延迟低于对其他节点内存的访问延迟。这使得NUMA感知型应用程序能够显式控制内存放置,从而提高性能。此功能简化了多插槽系统的开发,同时还提高了单插槽系统的兼容性。

此前,从独立GPU(dGPU)平台移植的NUMA感知型应用程序需要进行修改,因为Jetson不支持带有CU_MEM_LOCATION_TYPE_HOST_NUMAcuMemCreate()。尽管Jetson Thor只有一个NUMA节点,但本次更新使得最初为dGPU平台编写的应用程序能够无缝地在Tegra上运行,无需任何代码修改。使用步骤如下面的代码片段所示:

CUmemGenericAllocationHandle handle;
CUmemAllocationProp prop;

// size = <required size>;
// numaId = <desired Numa Id>
memset(&prop, 0, sizeof(CUmemAllocationProp));
prop.location.type = CU_MEM_LOCATION_TYPE_HOST_NUMA;
prop.location.id = numaId;
prop.requestedHandleTypes = CU_MEM_HANDLE_TYPE_NONE;
prop.type = CU_MEM_ALLOCATION_TYPE_PINNED;
prop.win32HandleMetaData = NULL;

CHECK_DRV(cuMemCreate(&handle, size, &prop, 0ULL));

未来展望

多实例GPU(MIG)功能将允许将大型GPU划分为具有专用资源的较小设备,从而提供隔离并免受相互干扰。这使得具有混合关键性的工作负载能够并行运行,提高了确定性和故障隔离能力。

例如,在机器人技术中,某些工作负载(如SLAM)被认为是比路径规划等任务优先级更高的。通过将(Thor)GPU划分为两个实例——一个专用于运行关键工作负载,另一个处理次要任务——我们可以确保高优先级进程的确定性得到更大程度的保障。这种设置可以防止关键工作负载与其他任务争夺GPU资源,从而实现更可预测的实时性能。

随着CUDA 13.0带来对nvidia-smi工具和英伟达管理库(NVML)的支持,诸如时钟、功耗、热量查询、每个进程的利用率以及SoC内存监控等特定功能,预计将在未来的JetPack版本中推出。

CUDA 13.0为Jetson Thor带来的新功能,是迈向统一且简化开发者体验的重要一步,它将从并行工具链的繁琐操作,转变为Arm平台上单一的CUDA安装。新的驱动程序功能和高级特性,如UVM、MIG和MPS,使Jetson平台具备了强大的性能和多功能性。

您可以立即通过JetPack 7.0版本探索CUDA 13.0工具包。欢迎加入英伟达开发者论坛,分享您的经验或获取支持,将这些功能融入到您的应用程序中。请持续关注更多更新,我们将继续创新,不断突破CUDA领域所能实现的界限。

致谢: 感谢英伟达以下贡献者:Saumya Nair, Ashish Srivastava, Debalina Bhattacharjee, Alok Parikh, Quinn Zambeck, Ashutosh Jain, and Raveesh Nagaraja Kote。

新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。

本文来源:新媒网 https://nmedialink.com/posts/23982.html

评论(0)

暂无评论,快来抢沙发~
NVIDIA发布CUDA 13.0工具包,专为Jetson Thor SoC设计,基于Blackwell GPU架构。亮点包括统一Arm平台的CUDA工具包,简化开发流程,支持统一虚拟内存(UVM),并增强GPU共享功能和开发者工具,为边缘AI应用带来性能提升。
发布于 2025-09-03
查看人数 116
人民币汇率走势
CNY
关注我们
新媒网跨境发布
本站原创内容版权归作者及NMedia共同所有,未经许可,禁止以任何形式转载。