CUDA实践指南(十六)

简介:

共享内存启用块中线程之间的协作。当一个块中的多个线程使用全局内存中的相同数据时,共享内存只能用于从全局内存访问一次数据。共享内存还可以用来避免未合并的内存访问,方法是从全局内存中加载和存储合并模式的数据,然后将其重新排列在共享内存中。除了存储体冲突之外,共享内存中的变形对非连续或未对齐访问不会造成任何损失。
对于具有维度Mxw的A,具有维度wxN的维度B以及维度MxN的维度C的情况,通过矩阵乘法C = AB的简单示例来说明共享存储器的使用。为了简化内核,M和N是32的倍数,对于计算能力2.0或更高的设备,w为32。
问题的自然分解是使用wxw线程的块和瓦片大小。因此,就wxw瓦片而言,A是列矩阵,B是行矩阵,C是它们的外积;参见图9.以M / w块为单位的N / W网格被启动,其中每个线程块从A的单个块和B的单个块计算C中不同块的元素
1

为此,simpleMultiply内核(未优化矩阵乘法)计算矩阵C的一个瓦片的输出元素。
未经优化的矩阵乘法:

__global__ void simpleMultiply(float *a, float* b, float *c,
    int N)
{
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;
    float sum = 0.0f;
    for (int i = 0; i < TILE_DIM; i++) {
        sum += a[row*TILE_DIM + i] * b[i*N + col];
    }
    c[row*N + col] = sum;
}

在未优化的矩阵乘法中,a,b和c分别是矩阵A,B和C的全局存储器的指针; blockDim.x,blockDim.y和TILE_DIM都等于w。 wxw-thread块中的每个线程计算一个图块中的一个元素
C.行和列是C中元素的行和列由特定的线程计算。 for循环结束我将一行A乘以B的列,然后写入C.
该内核的有效带宽在NVIDIA Tesla K20X上仅为6.6GB / s(ECC关闭)。 为了分析性能,有必要考虑warp在for循环中如何访问全局内存。 每个线程的变形计算C的一个图块的一行,这取决于A的单个行和B的整个图块,如图10所示。
对于for循环的每个迭代i,warp中的线程读取B tile的一行,这是所有计算功能的顺序和合并访问。
但是,对于每次迭代i而言,warp中的所有线程都从矩阵A的全局内存中读取相同的值,因为索引行* TILE_DIM + i在warp内是不变的。 尽管在计算能力2.0的设备上这种访问只需要1次事务 或更高,因为事务中存在浪费的带宽,因为高速缓存行中的32个字中只有一个4字节的字被使用。 我们可以在循环的后续迭代中重用这个缓存行,我们最终将使用全部32个字; 然而,当许多warps同时在同一个多处理器上执行时,就像通常情况一样,高速缓存行可能容易从迭代i和i + 1之间的高速缓存中逐出。

目录
相关文章
|
人工智能 运维 Cloud Native
阿里云祝顺民:云网络领域关键技术创新
2023年10月31日,云栖大会,阿里云技术主论坛带来了一场关于阿里云主力产品与技术创新的深度解读,阿里云网络产品线负责人祝顺民带来《云智创新,网络随行》的主题发言,针对阿里云飞天洛神云网络(下文简称洛神网络)领域产品服务创新以及背后的技术积累进行了深度解读,不少背后的创新技术系首次重磅披露。
|
算法 数据可视化 前端开发
第三代软件开发-QCustomPlot核心迁移
欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。 在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。 在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资
|
机器学习/深度学习 算法 存储
一文读懂大规模图神经网络平台AliGraph
2019阿里云峰会·上海开发者大会于7月24日盛大开幕,本次峰会与未来世界的开发者们分享开源大数据、IT基础设施云化、数据库、云原生、物联网等领域的技术干货, 共同探讨前沿科技趋势。本文整理自开源大数据专场中阿里巴巴资深技术专家李永先生的精彩演讲,将为大家分享AliGraph:大规模图神经网络平台。
8936 0
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
这篇文章介绍了在Visual Studio Code (VSCode) 中进行离线安装插件的详细步骤,包括如何下载插件、以SVN插件为例的离线安装过程、通过命令行安装以及一个更加简单的离线安装方式,还提供了操作界面的截图帮助理解。
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
|
8月前
|
NoSQL 关系型数据库 MongoDB
微服务——MongoDB常用命令——集合操作
本节主要介绍MongoDB中的集合操作,包括显式与隐式创建集合的方法。显式创建使用`db.createCollection(name)`,需遵循命名规范(如不能以&quot;system.&quot;开头或包含`\0`字符)。隐式创建则通过直接向不存在的集合插入文档实现,更为常用。此外,还介绍了集合删除方法`db.collection.drop()`及其返回值规则,帮助用户管理数据库中的集合资源。
319 0
「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件
Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入,如音量调节;Progress 显示任务的完成状态,如下载进度。本文通过代码示例展示如何使用这些组件,并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更新。
334 7
「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件
|
存储 关系型数据库 MySQL
MySQL删除数据 文件大小不变的原因以及处理空洞问题
总之,MySQL中删除数据后文件大小不变的现象是由于InnoDB存储引擎的设计决策,旨在优化性能和空间的重用。处理这一问题需要综合考量数据库的使用场景以及可能的性能影响,选择合适的策略
1311 6
|
网络协议 物联网 数据安全/隐私保护
物联网卡:什么是NB卡
对于物联网NB卡的操作,我们可以从多个方面进行详细阐述,包括其基本概念、选购注意事项、配置过程以及使用注意事项等。以下是对物联网NB卡操作的全面指导:
|
运维 监控 安全
多云环境下的Docker部署策略
随着云计算的快速发展,多云环境(Multi-Cloud Environment)已经成为了现代应用部署的一种重要选择。在这种环境下,企业可以利用多个云服务提供商的资源来提高可用性、灵活性和容错性。Docker容器技术在多云环境中的应用变得越来越普遍,本文将探讨多云环境下的Docker部署策略,并提供丰富的示例代码,以帮助大家更好地管理和运维容器化应用。
|
监控
如何确保多路直播中的视角多样性和同步性?
如何确保多路直播中的视角多样性和同步性?
196 0