CUDA实践指南(二十六)

简介:

数学库:
中等优先级:每当速度超过精度时使用快速数学库。
支持两种类型的运行时数学运算。 它们可以用它们的名字加以区分:一些名称带有前置下划线,而另一些则没有(例如,__functionName()functionName())。 遵循__functionName()命名约定的函数直接映射到硬件级别。 它们速度更快,但准确度稍低(如__sinf(x)__expf(x))。 functionName()命名约定的函数较慢但具有较高的准确性(例如,sinf(x)和expf(x))。 __sinf(x)__cosf(x)__expf(x)的吞吐量远远大于sinf(x),cosf(x)和expf(x)的吞吐量。 如果参数x的大小需要减小,后者变得更加昂贵(大约慢一个数量级)。 此外,在这种情况下,自变量缩减代码使用本地内存,由于本地内存的高延迟,这会更多地影响性能。 更多详细信息可在CUDA C编程指南中找到.
还要注意,无论何时计算相同参数的正弦和余弦,sincos系列指令都应该用于优化性能:

  • __sincosf()用于单精度快速数学(参见下一段)
  • sincosf()用于常规的单精度
  • sincos()用于双精度

nvcc的-use_fast_math编译器选项强制每个functionName()调用等效的__functionName()调用。 只要准确度优先于性能,就应该使用此开关。 超验函数通常是这种情况。 请注意,此开关仅在单精度浮点上有效。
中等优先:如果可能,优先选择速度更快,更专业化的数学函数,而不是更慢,更一般的数学函数。
对于小整数幂(例如$x^2$或$x^3$),显式乘法几乎肯定比使用pow()等一般指数运算例程更快。 虽然编译器优化改进不断寻求缩小这种差距,但明确的乘法(或使用等效的专用内联函数或宏)可以具有显着的优势。 当需要几个相同基数的幂(例如,其中$x^2$和$x^5$都靠近计算)时,这个优点增加,因为这有助于编译器进行其常见的子表达式消除(CSE)优化。
对于使用基数2或10的指数,使用函数exp2()或expf2()和exp10()或expf10()而不是函数pow()或powf()。 pow()和powf()在寄存器压力和指令计数方面都是重量级的函数,这是由于在大多数幂运算中产生了许多特殊情况,并且难以在整个基数和指数的整个范围内实现良好的精度。 另一方面,函数exp2(),exp2f(),exp10()和exp10f()在性能方面与exp()和expf()类似,并且可以比它们快十倍 pow()/ powf()等价物。
对于指数为1/3的指数,使用cbrt()或cbrtf()函数而不是泛指数函数pow()或powf(),因为前者明显快于后者。 同样,对于指数为-1/3的指数,使用rcbrt()或rcbrtf()。
用sincospi()替换sinpi(),cos(π )与cospi()和sincos(π )的sin(π )。 就精度和性能而言这是有利的。 作为一个特殊的例子,为了评估正弦函数而不是弧度,使用sinpi(x / 180.0)。 类似地,当函数参数的形式为π 时,单精度函数sinpif(),cospif()和sincospif()应该替换对sinf(),cosf()和sincosf()的调用。 (性能优势sinpi()超过sin()是由于简化了参数约简;精确度优势是因为sinpi()仅隐式乘以π,有效地使用无限精确的数学π而不是单精度或双精度逼近。)
精度相关的编译器标志:
默认情况下,nvcc编译器为计算能力2.x的设备生成符合IEEE标准的代码,但它也提供了生成代码的选项,这些代码的精确度稍低但速度更快,并且更接近为早期设备生成的代码:

  • -ftz = true(非规格化数字被刷新为零)
  • -prec-div = false(不太精确的划分)
  • -prec-sqrt = false(不精确的平方根)

另一个更积极的选项是-use_fast_math,它强制每个functionName()调用等效的__functionName()调用。 这使得代码运行速度更快,代价是精度和准确性降低。
内存指令:
高优先级:尽量减少全局内存的使用。 尽可能优先使用共享内存访问。
内存指令包括从共享,本地或全局内存读取或写入的任何指令。 访问未缓存的本地或全局内存时,存在400至600个时钟周期的内存延迟。 例如,以下示例代码中的赋值运算符具有较高的吞吐量,但关键的是,从全局内存中读取数据的延迟时间为400至600个时钟周期:

__shared__ float shared[32];
__device__ float device[32];
shared[threadIdx.x] = device[threadIdx.x];

如果在等待全局内存访问完成时可以发出足够的独立算术指令,那么线程调度程序可以隐藏大部分全局内存延迟。 但是,最好尽可能避免访问全局内存。

目录
相关文章
|
11月前
|
人工智能 自然语言处理 数据可视化
AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
 AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
|
11月前
|
机器学习/深度学习 人工智能 程序员
MiniMind:3小时训练26MB微型语言模型,开源项目助力AI初学者快速入门
在大型语言模型(LLaMA、GPT等)日益流行的今天,一个名为MiniMind的开源项目正在AI学习圈内引起广泛关注。项目让初学者能够在3小时内从零开始训练出一个仅26.88MB大小的微型语言模型。
775 1
|
数据采集 存储 监控
网站价格监控:动态价格数据的实时抓取案例
本案例展示了如何利用爬虫技术实时抓取京东等电商平台的商品信息、价格及用户评价,通过代理IP、Cookie和User-Agent确保数据稳定采集。关键数据分析包括价格动态监控、评价趋势分析和竞争情报获取,助力商家制定策略。代码从简单请求逐步演进为具备异常处理、数据解析等功能的完整体系,并设计了「技术关系图谱」,直观展示系统模块间的关系,为开发者提供全局视角和技术路径参考。
2014 0
网站价格监控:动态价格数据的实时抓取案例
|
SQL 运维 关系型数据库
数据库自治服务DAS:云数据库高效运维的最佳拍档
数据库自治服务DAS是阿里云推出的高效运维解决方案,旨在简化复杂数据库管理。DAS基于机器学习和专家经验,提供自修复、自防护、自优化功能,涵盖多源数据库支持、丰富的应用场景及端到端运维能力。其企业版引入AI技术,实现智能诊断与优化,显著提升数据库稳定性、安全性和性能。通过自动化处理常见问题,如SQL优化、容量规划等,DAS大幅降低人工干预需求,缩短故障恢复时间,助力企业实现高效、智能化的数据库运维管理。
969 2
|
Java Shell Linux
11MyCat - Window下安装MyCat
11MyCat - Window下安装MyCat
407 0
|
存储 安全 Linux
离线Linux服务器环境搭建
【9月更文挑战第3天】在离线环境下搭建Linux服务器需按以下步骤进行:首先确定服务器用途及需求,准备安装介质与所需软件包;接着安装Linux系统并配置网络;然后设置系统基础参数,如主机名与时区;安装必要软件并配置服务;最后进行安全设置,包括关闭非必要服务、配置防火墙、强化用户认证及定期备份数据。整个过程需确保软件包的完整性和兼容性。
609 3
|
Ubuntu
Ubuntu 20.10安装完成后,启动后无法进入桌面,黑屏光标闪烁
Ubuntu 20.10安装完成后,启动后无法进入桌面,黑屏光标闪烁
3110 0
|
计算机视觉 机器学习/深度学习 自然语言处理
【YOLOv8改进】CoTAttention:上下文转换器注意力(论文笔记+引入代码)
本文介绍了YOLO目标检测的创新改进,提出了一种名为Contextual Transformer (CoT)块的新型Transformer模块,用于增强视觉识别能力。CoT块通过3×3卷积编码上下文信息,并结合动态多头注意力矩阵,提高了视觉表示。此外,还提到了Large Separable Kernel Attention (LSKA)模块,它解决了大内核卷积的计算效率问题。CoTNet是基于CoT模块的Transformer风格骨干网络,可替代ResNet中的3×3卷积。CoTAttention类展示了如何在YOLOv8中集成此模块。文章还提供了源码链接和更多实战案例详情。
|
算法 决策智能 Python
Python高级算法——线性规划(Linear Programming)
Python高级算法——线性规划(Linear Programming)
1152 0
Python高级算法——线性规划(Linear Programming)