什么时候纹理内存应该优先于常量内存?

2023-12-04

如果线程之间的数据请求频率非常高(每个线程从特定列中选取至少一个数据),那么在 Pascal 架构中使用常量内存中的数据存储是否比纹理有任何好处?

编辑:这是一个拆分版本这个问题改善社区搜索


如果满足对恒定内存使用的期望,则在一般情况下使用恒定内存是一个好主意。它允许您的代码利用 GPU 硬件提供的额外缓存机制,从而减轻代码其他部分使用纹理的压力.

由于常量内存及其缓存,就像纹理和表面内存及其自己的缓存一样,都是由硬件定义的计算能力,应考虑目标硬件。因此,恒定存储器和纹理存储器的选项取决于访问模式和高速缓存使用,以及高速缓存可用性。

恒定的内存性能与扭曲中线程之间的数据广播有关,因此如果所有线程请求完全相同的数据地址并且数据已经在缓存上,则可以实现最大性能。因此,如果在同一个 warp 中存在对多个地址的请求,则服务会分为多个请求,因为它每次操作都可以检索单个地址。如果由于从多个地址检索数据而导致的拆分请求数量过高,则在这种特定情况下,纹理和表面内存性能可能优于恒定内存。。此信息详细说明在Cuda编程指南:

常量内存空间驻留在设备内存中,并缓存在中提到的常量缓存中计算能力2.x.

然后,一个请求被分成尽可能多的单独请求 初始请求中不同的内存地址,递减 吞吐量的倍数等于单独请求的数量。

然后以吞吐量处理生成的请求 缓存命中或设备吞吐量时的恒定缓存 否则记忆。

纹理内存缓存比常量内存缓存更灵活。它可以利用同一地址扭曲中以 2D 方式靠近的读数。尽管与常量内存相比有一些优点,但一般来说,如果数据访问模式或数据大小不遵循常量内存要求或要使用纹理内存缓存,则应使用纹理内存。更详细的信息可以found at:

纹理和表面内存空间 驻留在设备内存中并缓存在纹理缓存中,因此纹理 获取或表面读取仅花费一次从设备内存读取的内存 缓存未命中,否则只需要从纹理缓存读取一次。这 纹理缓存针对 2D 空间局部性进行了优化,因此 读取接近的纹理或表面地址的相同扭曲 在 2D 中一起使用将实现最佳性能。此外,它还专为 具有恒定延迟的流式读取;缓存命中会减少 DRAM 带宽需求但不是获取延迟。

通过纹理或表面获取来读取设备内存呈现出一些 可以使其成为阅读的有利替代方案的好处 来自全局或常量内存的设备内存:

  • 如果内存读取不遵循全局或 必须遵循持续的内存读取才能获得良好的性能,更高的性能 如果存在局部性,则可以实现带宽 纹理获取或表面读取;
  • 寻址计算是 由专用单元在内核外部执行;
  • 打包的数据可能是 在单个操作中广播到单独的变量;
  • 8 位和 16 位整数输入数据可以选择转换为 32 位 [0.0, 1.0] 或 [-1.0, 1.0] 范围内的浮点值(请参阅纹理内存).

开发人员应该记住,利用纹理内存与常量内存的组合可能比单独使用纹理内存具有真正的优势,因为它可以允许利用两者的专用缓存,因为两个缓存都具有更高的性能比在缓存(即设备内存)之外检索的任何数据都要多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候纹理内存应该优先于常量内存? 的相关文章

  • 如何获取要执行的 PTX 文件

    我知道如何生成 ptx文件来自 cu以及如何生成 cubin文件来自 ptx 但我不知道如何获得最终的可执行文件 更具体地说 我有一个sample cu文件 编译为sample ptx 然后我使用 nvcc 来编译sample ptx to
  • 优化三角矩阵计算的 CUDA 内核的执行

    我正在开发我的第一个 Cuda 应用程序 并且我的内核 吞吐量低于预期 这似乎是目前最大的瓶颈 内核的任务是计算一个 N N 大小的矩阵 DD 包含数据矩阵上所有元素之间的平方距离 数据矩阵 Y 的大小为 N D 以支持多维数据 并存储为行
  • C 中带括号和不带括号的循环处理方式不同吗?

    我在调试器中单步执行一些 C CUDA 代码 如下所示 for uint i threadIdx x i lt 8379 i 256 sum d PartialHistograms blockIdx x i HISTOGRAM64 BIN
  • 如何用Go语言的cgo编译Cuda源码?

    我用 cuda c 编写了一个简单的程序 它可以在 eclipse nsight 上运行 这是源代码 include
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • 使用 QuasirandomGenerator (对于傻瓜来说)

    我是 CUDA 的新手 我正在努力在内核中生成随机数 我知道有不同的实现 而且 在 SDK 4 1 中有一个 Niederreiter 拟随机序列生成器的示例 我不知道从哪里开始 我有点悲伤 感觉自己像个傻瓜 有人可以制作一个使用 Nied
  • 寻找 CUDA 中的最大值

    我正在尝试在 CUDA 中编写代码来查找最大值 对于给定的一组数字 假设您有 20 个数字 并且内核在 2 个块 每块 5 个线程 上运行 现在假设 10 个线程同时比较前 10 个值 并且thread 2找到最大值 因此线程 2 正在更新
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • CUDA 中的广义霍夫变换 - 如何加快分箱过程?

    正如标题所示 我正在对并行计算机视觉技术进行一些个人研究 使用 CUDA 我尝试实现 GPGPU 版本的霍夫变换 我遇到的唯一问题是在投票过程中 我调用atomicAdd 来防止多个同时写入操作 但我似乎没有获得太多的性能效率 我在网上搜索
  • 为什么numba cuda调用几次后运行速度变慢?

    我正在尝试如何在 numba 中使用 cuda 然而我却遇到了与我预想不同的事情 这是我的代码 from numba import cuda cuda jit def matmul A B C Perform square matrix m
  • 传递给 CUDA 的结构中的指针

    我已经搞砸了一段时间了 但似乎无法正确处理 我正在尝试将包含数组的对象复制到 CUDA 设备内存中 然后再复制回来 但当我遇到它时我会跨过那座桥 struct MyData float data int dataLen void copyT
  • MPI+CUDA 与纯 MPI 相比有何优势?

    加速应用程序的常用方法是使用 MPI 或更高级别的库 例如在幕后使用 MPI 的 PETSc 并行化应用程序 然而 现在每个人似乎都对使用 CUDA 来并行化他们的应用程序或使用 MPI 和 CUDA 的混合来解决更雄心勃勃 更大的问题感兴
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • 使用 CUDA 进行逐元素向量乘法

    我已经在 CUDA 中构建了一个基本内核来执行逐元素两个复向量的向量 向量乘法 内核代码插入如下 multiplyElementwise 它工作正常 但由于我注意到其他看似简单的操作 如缩放向量 在 CUBLAS 或 CULA 等库中进行了
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • CUDA、NPP 滤波器

    CUDA NPP 库支持使用 nppiFilter 8u C1R 命令过滤图像 但不断出现错误 我可以毫无问题地启动并运行 boxFilterNPP 示例代码 eStatusNPP nppiFilterBox 8u C1R oDeviceS
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每

随机推荐

  • 为什么 ARKit 应用程序在几天后停止工作?

    我在 Unity 中为 iOS 开发了一个简单的 ARKit 应用程序 它工作得很好 但有一个奇怪的问题 几天后它就停止工作了 因此 当我点击 iPhone 上的应用程序图标时 它会打开该应用程序一毫秒 然后立即退出 如果我再次重新安装该应
  • 运行 webpack 后 Javascript 函数未定义

    这是我的 webpack config js module exports entry src index js path relative to this file output filename frontEnd bundle js p
  • 版本控制中的项目结构

    我知道在版本控制中至少有 10 种不同的方式来构建项目 我很好奇正在使用的一些方法是什么以及哪些方法适合您 我曾经使用过 SVN TFS 目前 不幸的是 VSS 我见过版本控制的实现非常糟糕 也还可以 但从来都不是很好 为了让事情顺利进行
  • AWS lambda函数无法访问互联网

    我正在运行一个 lambda 函数 我想访问私有数据库服务器和互联网 我可以很好地访问数据库 但无法访问互联网 设置 VPC 10 0 0 0 16 Public Subnet 10 0 0 0 24 NAT Security Group
  • Android 中滚动“突出的顶部应用栏”的应用中的延迟滚动行为

    Current unexpected behaviour Required scrolling behaviour 我在带有滚动 突出的顶部应用栏 的 Android Kotlin 应用程序中遇到了一些意外的滚动行为 所需的行为是内部片段的
  • JavaScript 中变量初始化是否也被提升

    JavaScript 提升让我很困惑 变量初始化是否被提升 我认为它被提升是因为我们在声明和初始化变量之前访问变量 console log a var a 4 undefined undefined undefined 表明变量 a 在代码
  • 在有限域上插值多项式

    我想在有限域中的点上使用 python 插值多项式 并获得具有该域中系数的多项式 目前我正在尝试使用 SymPy 并专门进行插值 来自sympy polys polyfuncs 但我不知道如何强制插值在特定的 gf 中发生 如果没有 可以用
  • NSXMLParserDelegate 和 iPhone SDK 3.1.X

    我在商店里有一个为 3 1 2 构建的应用程序 但在 4 0GM 下崩溃了 我已经使用 Xcode 3 2 3 修复了崩溃问题 但也收到警告称此类类未实现 NSXMLParserDelegate 我添加到标题中 一切看起来都很好 我现在已经
  • 如何使用 pandas 数据框构建人口金字塔

    如何根据以下起始数据框绘制人口金字塔 Age Gender Count 0 50 45 years male 4 1 50 45 years female 5 2 55 65 years male 6 3 55 65 years femal
  • 在ggplot2中,可以仅更改条形边框的一侧吗? (颜色、厚度)

    我知道 3D 条形图是一种罪过 但我被要求这样做 作为一种权衡 我建议只制作一个比顶部和右侧的栏颜色稍深的边框 这样 条形图就会有某种 阴影 呃 但至少你仍然能够比较它们 有什么办法可以做到这一点吗 ggplot diamonds aes
  • 在代码隐藏中创建数据模板

    如何以编程方式向数据模板添加控件 例如 下面我创建了 TextBlock 和 DataTemplate TextBlock text new TextBlock DataTemplate template new DataTemplate
  • JavaScript Unicode 的长度(星体符号)

    我有一个 lt input type text gt 在 HTML 中 每次我添加一个字符时我都会执行if text length lt x 在 JavaScript 中 问题是 Unicode 特殊字符 星体符号 u 具有超过 4 个十六
  • 如何通过代码关闭 Ionic 5 应用程序?

    我找不到在 Ionic 5 系统中关闭应用程序的方法 看起来 Ionic 4 中的方法不适用于 Ionic 5 可以做吗 closeApp this platform backButton subscribeWithPriority 999
  • 本地修改的按值传递的参数会发生什么情况?

    我很清楚 修改按值传递的函数参数在 C C 函数之外是无效的 但编译器允许这样做 但会发生什么 是该论证的本地副本吗 是可修改的在函数内 include
  • 如何在 Sprite Kit、Objective C 中用手指移动击中物体

    我正在尝试制作一个游戏 其中我有一些 SKSpriteNode 并且用户可以通过手指移动来击中它们 我正在使用苹果的新 Sprite 套件 为此 我尝试了一个技巧 将 Sprite X SKSpriteNode 放置在手指所在的位置 当用户
  • 如何将数据表分成两个单独的列

    我有一个数据表 其中有很多列 只有一行 DataSet myDataSet new DataSet da Fill myDataSet myDataTable new DataTable myDataTable myDataSet Tabl
  • 如何将行动态添加到表格布局中

    我在 sqlite 中有某些数据 每次单击 保存 按钮时它都会更新 并且我想将数据显示到表布局中 以便为更新的数据添加更多行 我有某些代码 但它仅显示更新的数据替换以前的数据 并且我想在数据更新时添加更多行 我知道这只是在表格布局中添加一行
  • 如何从 Databricks 笔记本将文本文件上传到 FTP

    我试图找到解决方案 但一无所获 我是这方面的新手 所以如果您知道解决方案 请帮助我 谢谢 Ok I found a solution copy file from ADLS to SFTP from ftplib import FTP TL
  • 正则表达式替换除斜线之外的所有特殊字符?

    我正在尝试制定一些正则表达式 以消除 SharePoint 在创建文件夹时不会采用的所有特殊字符 这些是不允许的字符 我假设下面的底部正则表达式将处理所有这些字符 但我也想用破折号替换 或 lt gt 这就是我到目前为止所拥有的 但如果可能
  • 什么时候纹理内存应该优先于常量内存?

    如果线程之间的数据请求频率非常高 每个线程从特定列中选取至少一个数据 那么在 Pascal 架构中使用常量内存中的数据存储是否比纹理有任何好处 编辑 这是一个拆分版本这个问题改善社区搜索 如果满足对恒定内存使用的期望 则在一般情况下使用恒定