什么时候真正需要填充共享内存?

2023-11-26

我对 NVidia 的 2 个文档感到困惑。CUDA 最佳实践描述了共享内存是按bank组织的,一般来说在32位模式下每4个字节就是一个bank(我就是这么理解的)。然而使用 CUDA 并行前缀和(扫描)详细介绍了由于库冲突而应如何将填充添加到扫描算法中。

对我来说问题是,该算法的基本类型是float它的大小是4个字节。因此每个float是一家银行,不存在银行冲突。

我的理解是否正确——也就是说,如果你继续工作4*N-byte 类型,您不必担心银行冲突,因为根据定义,不会有银行冲突?如果不是,我应该如何理解它(何时使用填充)?


您可能感兴趣这次网络研讨会来自NVIDIA CUDA 网络研讨会页面包括库在内的共享内存也在幻灯片 35-45 中进行了描述这次网络研讨会.

一般来说,只要两个不同的线程尝试访问(来自同一内核指令)共享内存中的较低 4 位(cc2.0 之前的设备)或 5 位(cc2.0 及更新版本)的位置,共享内存组冲突就可能发生。设备)的地址是相同的。当确实发生存储体冲突时,共享内存系统会串行访问同一存储体中的位置,从而降低性能。对于某些访问模式,填充尝试避免这种情况。请注意,对于 cc2.0 及更高版本,如果所有位都相同(即相同位置),则不会导致存储体冲突。

从形象上来说,我们可以这样看:

__shared__ int A[2048];
int my;
my = A[0]; // A[0] is in bank 0
my = A[1]; // A[1] is in bank 1
my = A[2]; // A[2] is in bank 2
...
my = A[31]; // A[31] is in bank 31 (cc2.0 or newer device)
my = A[32]; // A[32] is in bank 0
my = A[33]; // A[33] is in bank 1

现在,如果我们在 warp 中跨线程访问共享内存,我们可能会遇到存储体冲突:

my = A[threadIdx.x];    // no bank conflicts or serialization - handled in one trans.
my = A[threadIdx.x*2];  // 2-way bank conflicts - will cause 2 level serialization
my = A[threadIdx.x*32]; // 32-way bank conflicts - will cause 32 level serialization

让我们仔细看看上面的双向银行冲突。既然我们在乘法threadIdx.x到 2,线程 0 访问存储体 0 中的位置 0,但线程 16 访问位置 32,即also在银行 0 中,从而造成银行冲突。对于上面的 32 路示例,所有地址都对应于存储体 0。因此,必须发生对共享内存的 32 个事务才能满足此请求,因为它们都是序列化的。

所以要回答这个问题,if我知道我的访问模式将是这样的,例如:

my = A[threadIdx.x*32]; 

然后我可能想要填充我的数据存储,以便A[32]是一个虚拟/焊盘位置,原样A[64], A[96]ETC。 然后我可以像这样获取相同的数据:

my = A[threadIdx.x*33]; 

并在没有银行冲突的情况下获取我的数据。

希望这可以帮助。

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

什么时候真正需要填充共享内存? 的相关文章

  • CUDA全局内存事务的成本

    根据 CUDA 5 0 编程指南 如果我同时使用 L1 和 L2 缓存 在 Fermi 或 Kepler 上 则所有全局内存操作都使用 128 字节内存事务完成 但是 如果我仅使用 L2 则使用 32 字节内存事务 第 F 4 2 章 让我
  • 如何在 Linux 中分析 PyCuda 代码?

    我有一个简单的 经过测试的 pycuda 应用程序 正在尝试对其进行分析 我尝试过 NVidia 的 Compute Visual Profiler 它运行该程序 11 次 然后发出以下错误 NV Warning Ignoring the
  • 优化三角矩阵计算的 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
  • 指定 NVCC 用于编译主机代码的编译器

    运行 nvcc 时 它始终使用 Visual C 编译器 cl exe 我怎样才能让它使用GCC编译器 设置CC环境变量到gcc没有修复它 我在可执行文件帮助输出中也找不到任何选项 在 Windows 上 NVCC 仅支持 Visual C
  • 将 GPUJPEG 项目移植到 Windows

    我目前正在尝试移植 GPUJPEG 在 Sourceforge 上 http sourceforge net projects gpujpeg 库 基于 CUDA 从 Unix 到 Windows 现在我被卡住了 我不知道发生了什么或为什么
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 某些子网格未使用 CUDA 动态并行执行

    我正在尝试 CUDA 5 0 GTK 110 中的新动态并行功能 我遇到了一个奇怪的行为 即我的程序没有返回某些配置的预期结果 不仅是意外的 而且每次启动都会出现不同的结果 现在我想我找到了问题的根源 似乎当生成太多子网格时 某些子网格 由
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • 用于类型比较的 Boost 静态断言

    以下问题给我编译器错误 我不知道如何正确编写它 struct FalseType enum value false struct TrueType enum value true template
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • cuda cpu功能-gpu内核重叠

    我在尝试开发以练习 CUDA 的 CUDA 应用程序时遇到并发问题 我想通过使用 cudaMemecpyAsync 和 CUDA 内核的异步行为来共享 GPU 和 CPU 之间的工作 但我无法成功重叠 CPU 执行和 GPU 执行 它与主机
  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • 使用 CUDA 进行逐元素向量乘法

    我已经在 CUDA 中构建了一个基本内核来执行逐元素两个复向量的向量 向量乘法 内核代码插入如下 multiplyElementwise 它工作正常 但由于我注意到其他看似简单的操作 如缩放向量 在 CUBLAS 或 CULA 等库中进行了
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • __device__ __constant__ 常量

    有什么区别吗 在 CUDA 程序中定义设备常量的最佳方法是什么 在 C 主机 设备程序中 如果我想将常量定义在设备常量内存中 我可以这样做 device constant float a 5 constant float a 5 问题 1

随机推荐

  • javascript Replace() 没有替换所有匹配的字符

    我想转 管理员 电影列表 into Admin 电影列表 using 代替 var id id replace 看起来它只替换了第一个 我如何替换所有这些 谢谢你的帮助 Use a regex with the g flag var id
  • 使用 XmlTextReader

    我是一名初级程序员 从 C 和 Web 服务开始 In the Service cs我的网络服务文件 我创建一个ReadXMLFile 方法 我尝试读取现有的 XML 文件 从中获取数据并将其放置到我在IService cs file 我的
  • Entity Framework Core、DELETE CASCADE 和 [必需]

    我在 Entity Framework Core 中遇到了 DELETE CASCADE 问题 我似乎找不到好的解决方案 这是我的模型的超级简化版本 User UserID Name Recipe RecipeID UserID Ingre
  • PowerShell 中数字后缀的完整列表是什么?

    可在 PowerShell 数字文字上使用的后缀的完整列表是什么 到目前为止我已经发现 Suffix Example Result L 1L Type Int64 D 1D Type Decimal KB 1KB 1KB 1024 MB 1
  • 通过 HTTP 中间件验证 WebSocket 连接

    问题陈述 我正在尝试使用 Golang 中的基本中间件来保护 websocket 升级程序 http 端点 如下所示WebSocket 协议不处理授权或身份验证 社区建议 有些人建议 尽管含糊其辞 我建议使用应用程序的代码来验证升级握手 以
  • apache中这个配置是什么意思? [关闭]

    Closed 这个问题是无关 目前不接受答案 Header append Vary User Agent env dont vary 谁能对此给出详细的解释 这使用阿帕奇模组头将值 User Agent 附加到 Vary HTTP 标头 但
  • 在哪里可以找到 iPhone 上的 Quartz 2D 绘图示例?

    我将使用 Quartz 在 Iphone 中开发 2D 游戏 Quartz 和 QuartzCore 之间的主要区别是什么 我在互联网上搜索了很多 但只能找到带有 Quartz Examples 的 MAC OS 如果任何机构有任何使用 I
  • 如何使用具有该属性名称的字符串变量访问对象属性?

    我如何在 C 中执行此操作 using System namespace TestProperties28373 class Program static void Main string args Customer customer ne
  • 查询数组大小大于1的文档

    我有一个 MongoDB 集合 其中包含以下格式的文档 id ObjectId 4e8ae86d08101908e1000001 name Name zipcode 2223 id ObjectId 4e8ae86d08101908e100
  • 如何为 CSS 自定义属性设置“inherit”值? [复制]

    这个问题在这里已经有答案了 将自定义属性设置为值inherit完全符合您对其他所有 CSS 属性的期望 它继承其父级的相同属性值 普通财产继承
  • 为什么集合初始值设定项末尾可以有逗号?

    这个问题一直让我困惑 但我猜对于为什么会发生这种情况有一个非常合理的解释 当您有集合初始值设定项时 编译器允许尾随逗号 例如 new Dictionary
  • 是否有一个 cordova 插件可以从 config.xml 读取值?

    我希望从我的 Cordova PhoneGap 应用程序中读取这些值config xml在运行时 name 版权 描述 然而 很惊讶地发现没有 ConfigAPI 参考指南中的功能 http cordova apache org docs
  • 如何知道片段何时在 viewpager 中实际可见

    我在 ViewPager 中使用 4 个片段 因为 ViewPager 提前加载上一个和下一个片段 并且在片段之间导航时不会调用生命周期方法 那么有没有什么方法可以检测 Fragment 何时真正可见 提前致谢 根据 Matt的回答setU
  • 附加到末尾时,python utf-8-sig BOM 位于文件中间

    我最近注意到 Python 在使用以下命令附加到文件时的行为方式并不明显utf 8 sig编码 见下文 gt gt gt import codecs os gt gt gt os path isfile 123 False gt gt gt
  • 我应该如何按索引顺序迭代稀疏数组?

    我有一个稀疏数组 其内容不能保证按索引顺序插入 但需要按索引顺序迭代 要迭代稀疏数组 我知道您需要使用 for in 语句 然而 根据本文 不保证 for in 将以任何特定顺序返回索引 But 像这样的计算器问题建议虽然不能保证对象属性顺
  • 插入标识列的 BCP 格式是什么

    我在尝试使用 BCP 将数据插入表时遇到问题 该表有一个标识列 我正在从文本文件中获取输入 如果有什么好的解决办法请告知 问候 茶颜 我需要做同样的事情 我的同事指出您可以使用 BCP 上的 E 开关来执行此操作 从文档中 E 指定导入的数
  • 在内存警告(Apple 文档缺陷)中卸载 iOS 6 中的视图的正确方法是什么?

    在 iOS 6 中 viewWillUnload and viewDidUnload已弃用 并且 UIViewController 不再卸载内存警告期间屏幕上不可见的视图 这查看控制器编程指南有一个如何手动恢复此行为的示例 这是代码示例 v
  • 如何在 PHP 中正确拆分 PATH 变量?

    我想分开 path getenv PATH 进入其组件 如何以依赖于操作系统的方式确定分隔符 您可以使用PATH SEPARATOR常数 则DIRECTORY SEPARATOR如果需要的话 用于分割路径的常量 看Directory Pre
  • C++ 编译器/链接器是否允许删除未使用的方法?

    C 编译器或链接器 根据任何 C 标准 是否允许删除未使用的方法 编译器似乎可以删除未使用的静态函数 链接器可以删除未使用的函数 但我没有找到类方法的信息 当方法是虚拟的时 这变得非常有趣 Yes 如果该方法未使用 则无法知道它已被删除 因
  • 什么时候真正需要填充共享内存?

    我对 NVidia 的 2 个文档感到困惑 CUDA 最佳实践描述了共享内存是按bank组织的 一般来说在32位模式下每4个字节就是一个bank 我就是这么理解的 然而使用 CUDA 并行前缀和 扫描 详细介绍了由于库冲突而应如何将填充添加