CUDA学习(二十九)

本文涉及的产品
数据传输服务 DTS,同步至DuckDB 3个月
简介:

占用率计算器:
有几个API函数可以帮助程序员根据寄存器和共享内存的要求来选择线程块大小:

  • 占用计算器API cudaOccupancyMaxActiveBlocksPerMultiprocessor可以根据内核的块大小和共享内存使用情况提供占用率预测。 该函数根据每个多处理器的并发线程块数来报告占用情况。

    • 请注意,此值可以转换为其他指标。 乘以每块的warp数量会得到每个multiprocessor的并发warp数量; 通过每个多处理器的最大warp进一步划分并发warp给出占用率的百分比。
  • 基于占用的启动配置程序API cudaOccupancyMaxPotentialBlockSize和cudaOccupancyMaxPotentialBlockSizeVariableSMem启发式地计算实现最大多处理器级占用率的执行配置。

以下代码示例计算MyKernel的占用情况。 然后它会报告占用率级别,其中每个多处理器的并发warp与最大warp之间的比率。

// Device code
__global__ void MyKernel(int *d, int *a, int *b)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    d[idx] = a[idx] * b[idx];
}
// Host code
int main()
{
    int numBlocks; // Occupancy in terms of active blocks
    int blockSize = 32;
    // These variables are used to convert occupancy to warps
    int device;
    cudaDeviceProp prop;
    int activeWarps;
    int maxWarps;
    cudaGetDevice(&device);
    cudaGetDeviceProperties(&prop, device);
    cudaOccupancyMaxActiveBlocksPerMultiprocessor(
        &numBlocks,
        MyKernel,
        blockSize,
        0);
    activeWarps = numBlocks * blockSize / prop.warpSize;
    maxWarps = prop.maxThreadsPerMultiProcessor / prop.warpSize;
    std::cout << "Occupancy: " << (double)activeWarps / maxWarps * 100 << "%" <<
        std::endl;
    return 0;
}

以下代码示例根据用户输入配置MyKernel的基于占位的内核启动。

// Device code
__global__ void MyKernel(int *array, int arrayCount)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    if (idx < arrayCount) {
        array[idx] *= array[idx];
    }
}
// Host code
int launchMyKernel(int *array, int arrayCount)
{
    int blockSize; // The launch configurator returned block size
    int minGridSize; // The minimum grid size needed to achieve the
                     // maximum occupancy for a full device
                     // launch
    int gridSize; // The actual grid size needed, based on input
                 cudaOccupancyMaxActiveBlocksPerMultiprocessor // size
                cudaOccupancyMaxPotentialBlockSize(
        &minGridSize,
        &blockSize,
        (void*)MyKernel,
        0,
        arrayCount);
    // Round up according to array size
    gridSize = (arrayCount + blockSize - 1) / blockSize;
    MyKernel << <gridSize, blockSize >> >(array, arrayCount);
    cudaDeviceSynchronize();
    // If interested, the occupancy can be calculated with
    // cudaOccupancyMaxActiveBlocksPerMultiprocessor
    return 0;
}

CUDA工具包还为 / include / cuda_occupancy.h中的任何不依赖于CUDA软件堆栈的使用情况提供自记录,独立占用计算器和启动配置器实现。 还提供了电子表格版本的占用率计算器。 电子表格版本作为一种学习工具特别有用,可以将影响占用率的参数(块大小,每个线程的寄存器和每个线程的共享内存)

最大化内存吞吐量:
为应用程序最大化整体内存吞吐量的第一步是使带宽较低的数据传输最小化。
这意味着最大限度地减少主机和设备之间的数据传输,详见主机和设备之间的数据传输,因为它们比全局内存和设备之间的数据传输具有更低的带宽。
这也意味着通过最大限度地利用片上内存来最大限度地减少全局内存和设备之间的数据传输:共享内存和高速缓存(例如,计算能力2.x或更高的设备上可用的L1高速缓存和L2高速缓存,纹理高速缓存和常量高速缓存 适用于所有设备)。
共享内存相当于用户管理的缓存:应用程序显式分配并访问它。 如CUDA C运行时所示,典型的编程模式是将来自设备内存的数据放入共享内存; 换句话说,要让块的每个线程:

  • 将数据从设备内存加载到共享内存
  • 与块的所有其他线程同步,以便每个线程可以安全地读取由不同线程填充的共享内存位置,
  • 处理共享内存中的数据,
  • 如果需要再次同步以确保共享内存已更新结果,
  • 将结果写回设备内存

对于某些应用程序(例如,全局内存访问模式依赖数据),传统的硬件管理缓存更适合利用数据局部性。 如计算能力3.x和计算能力7.x中所述,对于计算能力3.x和7.x的设备,L1和共享内存使用相同的片上存储器,并且其中有多少是专用的 到L1与共享内存是可配置的每个内核调用。
内核对内存访问的吞吐量可以根据每种内存的访问模式而变化一个数量级。 因此,最大化内存吞吐量的下一步是基于设备内存访问中描述的最佳内存访问模式尽可能最佳地组织内存访问。 这种优化对于全局内存访问尤为重要,因为全局内存带宽较低,所以非最佳全局内存访问对性能影响较大。
timg

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
机器学习/深度学习 算法 数据可视化
一图胜千言:EBImage库分割和标注让你的图像说话
一图胜千言:EBImage库分割和标注让你的图像说话
705 0
|
6月前
|
人工智能 搜索推荐 数据可视化
不只是作品集:用 Next.js 打造我的数字作品库
这篇文章介绍了作者使用Next.js和Shadcn UI构建的一个个人作品信息展示模板。该模板设计简洁且结构清晰,适合直接使用或作为学习参考。作者在原有基础上进行了个性化调整,增加了交互细节和动画效果。文章还强调了开发者拥有一个统一技术身份的重要性,并详细列出了项目的技术栈、特性和环境变量配置,最后提供了在线预览链接和GitHub地址。
256 1
|
缓存 测试技术 API
解锁开源模型高性能服务:SGLang Runtime 应用场景与实践
SGLang 是一个用于大型语言模型和视觉语言模型的推理框架。
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过阿里云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
1278 94
|
7月前
|
人工智能 自动驾驶 计算机视觉
CVPR 2024 目标检测!开放词汇
YOLO-World是CVPR 2024提出的一种实时开放词汇目标检测模型,首次将YOLO的高速特性与开放词汇识别能力结合。它无需微调即可通过文本提示检测任意物体,支持零样本推理,兼具高精度与灵活性,适用于机器人、自动驾驶等实时感知场景,标志着目标检测迈向通用化新阶段。
574 0
CVPR 2024 目标检测!开放词汇
|
物联网 数据管理 Apache
拥抱IoT浪潮,Apache IoTDB如何成为你的智能数据守护者?解锁物联网新纪元的数据管理秘籍!
【8月更文挑战第22天】随着物联网技术的发展,数据量激增对数据库提出新挑战。Apache IoTDB凭借其面向时间序列数据的设计,在IoT领域脱颖而出。相较于传统数据库,IoTDB采用树形数据模型高效管理实时数据,具备轻量级结构与高并发能力,并集成Hadoop/Spark支持复杂分析。在智能城市等场景下,IoTDB能处理如交通流量等数据,为决策提供支持。IoTDB还提供InfluxDB协议适配器简化迁移过程,并支持细致的权限管理确保数据安全。综上所述,IoTDB在IoT数据管理中展现出巨大潜力与竞争力。
667 1
|
网络虚拟化 Windows
Windows 10 Windows1011出现0x80190001错误解决方案! Windows微软账户无法登录问题 Microsoft Store商店用不了
Windows 10 Windows1011出现0x80190001错误解决方案! Windows微软账户无法登录问题 Microsoft Store商店用不了
1370 1
|
测试技术 Android开发 数据安全/隐私保护
脚本 | 手机大麦网脚本使用说明
这篇文章主要针对上篇文章的代码做一个使用说明
4710 0
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
1305 4
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。