CUDA 联合访问全局内存

2023-11-23

我已经阅读了 CUDA 编程指南,但我错过了一件事。假设我在全局内存中有 32 位 int 数组,我想通过合并访问将其复制到共享内存。 全局数组的索引从 0 到 1024,假设我有 4 个块,每个块有 256 个线程。

__shared__ int sData[256];

何时执行合并访问?

1.

sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y];

全局内存中的地址从 0 复制到 255,每个地址由 warp 中的 32 个线程复制,所以这里可以吗?

2.

sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y + someIndex];

如果 someIndex 不是 32 的倍数,那么它不会合并?地址错位?那是对的吗?


您想要什么最终取决于您的输入数据是一维还是二维数组,以及您的网格和块是一维还是二维。最简单的情况都是一维的:

shmem[threadIdx.x] = gmem[blockDim.x * blockIdx.x + threadIdx.x];

这是合并的。我使用的经验法则是,将变化最快的坐标(threadIdx)添加为块偏移量(blockDim * blockIdx)的偏移量。最终结果是块中线程之间的索引步长为 1。如果步长变大,则会失去合并。

简单的规则(在 Fermi 和更高版本的 GPU 上)是,如果 warp 中所有线程的地址落入相同的对齐 128 字节范围,则将产生单个内存事务(假设为负载启用了缓存,这是默认)。如果它们落入两个对齐的 128 字节范围,则会产生两个内存事务,依此类推。

在 GT2xx 和更早的 GPU 上,情况变得更加复杂。但您可以在编程指南中找到详细信息。

其他示例:

未合并:

shmem[threadIdx.x] = gmem[blockDim.x + blockIdx.x * threadIdx.x];

没有合并,但在 GT200 及更高版本上还不错:

stride = 2;
shmem[threadIdx.x] = gmem[blockDim.x * blockIdx.x + stride * threadIdx.x];

根本没有合并:

stride = 32;
shmem[threadIdx.x] = gmem[blockDim.x * blockIdx.x + stride * threadIdx.x];

合并、2D 网格、1D 块:

int elementPitch = blockDim.x * gridDim.x;
shmem[threadIdx.x] = gmem[blockIdx.y * elementPitch + 
                          blockIdx.x * blockDim.x + threadIdx.x]; 

合并的二维网格和块:

int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
int elementPitch = blockDim.x * gridDim.x;
shmem[threadIdx.y * blockDim.x + threadIdx.x] = gmem[y * elementPitch + x];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA 联合访问全局内存 的相关文章

  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl
  • CUDA 代码会损坏 GPU 吗?

    在测试包含内存错误的 CUDA 时 我的屏幕被冻结了 重新启动后我无法再检测到显卡 我的代码是否有可能物理损坏该卡 这发生在 Ubuntu 14 04 下 我不知道该卡的型号 因为我无法检测到它 但我记得它是一张相当新的卡 感谢所有的评论我
  • 如何降级cuda版本

    我目前使用的是 cuda 版本 4 2 但我需要将其更改为 3 1 是否可以卸载当前版本 4 2 版 然后安装以前的版本 3 1 版 编辑 请参阅我的操作系统是linux ubuntu 10 04 64位 编辑 我找到了如何获取 3 1 版
  • CUDA cutil.h 在哪里?

    有谁知道包含 cutil h 的 SDK 工具包在哪里 我尝试了 CUDA toolkits3 2 和 toolkits5 0 我知道这个版本已经不支持 cutil h 我还注意到一些提到的如何在 Linux 中包含 cutil h htt
  • 将 cuda 数组传递给 Thrust::inclusive_scan

    我可以对 cpu 上的数组使用包容性扫描 但是否可以对 gpu 上的数组执行此操作 注释是我知道有效但我不需要的方式 或者 是否有其他简单的方法可以对设备内存中的数组执行包含扫描 Code include
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n
  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • 为什么 CUDA 内存复制速度会这样,有一些恒定的驱动程序开销?

    在我的旧 GeForce 8800GT 上使用 CUDA 内存时 我总是会遇到奇怪的 0 04 毫秒开销 我需要将 1 2K 传输到设备的常量内存中 处理其中的数据并从设备中仅获取一个浮点值 我有一个使用 GPU 计算的典型代码 alloc
  • Valgrind 输出中的错误摘要?

    我看过一些关于 valgrind 的帖子 但没有一篇帖子帮助我理解 valgrind 输出的解释 我用 valgrind 运行了两个程序 都有内存泄漏 测试 1 的示例输出 20422 LEAK SUMMARY 20422 definite
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 为什么在 CUDA 中启动 32 倍数的线程?

    我参加了 CUDA 并行编程课程 并且看到了许多 CUDA 线程配置的示例 其中通常将所需的线程数四舍五入到最接近的 32 倍数 我知道线程被分组为 warp 并且如果您启动 1000 个线程 GPU 无论如何都会将其四舍五入到 1024
  • CUDA 中的原子操作失败

    由于计算能力为2 1 atomicAdd and atomicMax操作不支持双精度 那么我根据堆栈溢出的一些答案定义这两个函数 奇怪的是atomicAdd功能运行良好 但atomicMax不起作用 这是我的代码 我的代码的测试是在每个块上
  • 在 Java 中,是否可以增加 JVM 的可用内存和/或终止其他 Java 程序?

    我对高级 Java 缺乏经验 所以请耐心等待 我对 Java 实现可称为 自主 功能的能力感到好奇 假设我们有两个 Java 程序正在运行 一个程序确定另一个程序正在占用内存 从而终止该程序和 或向 JVM 分配更多内存 我知道在 Java
  • fork后CUDA初始化错误

    调用 fork 后出现 初始化错误 如果我在没有 fork 的情况下运行相同的程序 则一切正常 if fork 0 cudaMalloc 什么会导致这种情况呢 下面是一个完整的示例 如果我注释掉 cudaGetDeviceCount 调用
  • 如何在 Java 中复制堆栈?

    我有一个堆栈 A 我想创建一个与堆栈 A 相同的堆栈 B 我不希望堆栈 B 只是指向 A 的指针 我实际上想创建一个包含相同元素的新堆栈 B作为堆栈 A 其顺序与堆栈 A 相同 堆栈 A 是字符串堆栈 Thanks 只需使用 Stack 类
  • 初学者 CUDA - 简单的 var 增量不起作用

    我正在使用 CUDA 开发一个项目 为了掌握它 我有以下代码 include
  • pandas 数据框 - 选择行并清除内存?

    我有一个大的 pandas 数据框 大小 3 GB x read table big table txt sep t header 0 index col 0 因为我在内存限制下工作 所以我对数据帧进行了子集化 rows calculate
  • 在SVN中,如何将一个目录的子目录复制到另一个目录?

    通过命令行 我通常这样做 cp rRp path to a folder path to another folder 这仅复制下面的内容a folder to 另一个文件夹 在 SVN 中我需要做同样的事情 但无法弄清楚 我总是这样结束
  • iOS 内存占用的正确统计数据是什么?活字节?真实记忆?其他?

    我在这一点上肯定很困惑 我有一个 iPad 应用程序 在对象分配工具中显示 6 12mb 的 实时字节 使用情况 如果我调出内存监视器或活动监视器 在严重使用后 实际内存 列会持续攀升至 80 90mb 左右 那么我的内存占用是正常的还是高

随机推荐

  • UINavigationBar 以按钮为标题。

    我做了一些挖掘 似乎没有得到任何有用的东西 我想做的是非常基本的 但我不确定它们是否是 1 更简单的方法 2 或者苹果是否会拒绝 我有一个通过 UINavigationController 控制的视图 显然从这篇文章的标题来看 并且其中有一
  • 为什么在将 ApplicationCookie 与 ASP.Net Identity 一起使用之前调用 SignOut(DefaultAuthenticationTypes.ExternalCookie)?

    为什么此示例在使用 ApplicationCookie 登录之前调用ExternalCookie 的SignOut 这只是确保身份验证信息干净的一种方法吗 完整的例子在这里 http www asp net identity overvie
  • Python utf-8,如何对齐打印输出

    我有一个包含日语字符以及 正常 字符的数组 如何对齐这些打印件 usr bin python coding utf 8 a1 trazan a2 dipsy laa laa banarne po tinky winky for i j in
  • 从大型数据集中删除重复项(>100Mio 行)

    我知道这个主题在此之前出现过很多次 但建议的解决方案都不适用于我的数据集 因为我的笔记本电脑由于内存问题或已满存储而停止计算 我的桌子如下所示108澪行 Col1 Col2 Col3 Col4 SICComb NameComb Case N
  • C 样式强制转换可以处理但 C++ 强制转换不能处理的转换

    据说C 风格的强制转换只是尝试应用 C 强制转换的不同组合 并使用第一个允许的组合 但是 我有一种感觉 听说有些情况只能处理 C 风格的强制转换 而不允许使用 C 强制转换的组合 我错了吗 是这样吗anyC型铸入式any上下文 在 C 中
  • 从报告中的两个表查询

    我的 VB 应用程序通过 ODBC 打印报告 我使用数据库专家添加了表格并设计了水晶报表 我的查询应该放在哪里 这是我的查询 SELECT ts SCHEDIDNO ts DAYNAME DATE FORMAT ts TIMESTART h
  • 如何从 boto 调用返回 XML?

    我在用博托2 32 1使用Python 2 7 6 我遇到了问题订单列表boto 的 mws 模块的功能是获取我的亚马逊订单的 XML 数据 这是我拨打的电话 response connection list orders CreatedA
  • 如何将月份名称映射到月份编号,反之亦然?

    我正在尝试创建一个函数 可以将月份数字转换为缩写的月份名称或将缩写的月份名称转换为月份数字 我认为这可能是一个常见问题 但我在网上找不到 我在想calendar模块 我发现要将月份数字转换为缩写月份名称 您可以这样做calendar mon
  • Linux下Python / GTK中检测用户注销/关闭 - SIGTERM/HUP未收到

    好吧 这可能是一个困难的问题 我有一个 pyGTK 应用程序 由于我无法捕获 控制的 X Window 错误而随机崩溃 因此 我创建了一个包装器 一旦检测到崩溃 它就会重新启动应用程序 现在问题来了 当用户注销或关闭系统时 应用程序会以状态
  • jquery 下拉选择器 AutoPostback

    在 jQuery 中 有什么方法可以区分回发下拉列表和非回发下拉列表 ASP NET 3 5 select change function e something like this if this attr AutoPostback tr
  • dyld:库未加载:新 Xcode 的 @rpath/libswiftCore.dylib 问题(10.2)

    引用的答案都不起作用 Xcode 10 2 发生了一些新变化 无论我使用 Swift 4 2 还是 5 都会发生这种情况 使用全新的 未经编辑的命令行工具 它会立即发生 您需要做的就是创建一个 MacOS 命令行工具 然后点击 运行 您会立
  • .slice 和 .wrapall

    我正在使用 stackoverflow 上的一位成员建议的一些代码 并由我进行修改 将每 3 个列表项包装为大型菜单的一部分 代码是 var lis ul gt li for var i 0 i lt ls length i 3 lis s
  • 加载此程序集将产生与其他实例不同的授权集

    从 ASP net 2 0 网站调用 vb net 1 1 程序集时 我在运行时收到以下错误 加载此程序集将产生与其他实例不同的授权集 知道这个错误背后的原因是什么吗 场景是 有一个 Web 应用程序是在 ASP NET 2 0 中构建为
  • 启用 Proguard 后应用程序崩溃

    我的应用程序在没有启用混淆器的情况下运行得很好 但是当我启用它时 应用程序立即崩溃 我在配置中尝试了多种组合 但均无济于事 有什么我应该保留而遗失的东西吗 混淆器配置 https gist github com hanleyhansen 9
  • 登录后重定向到特定 URL

    Devise 1 0 Rails 2 3 的库 中是否有一种方法可以在登录后重定向到特定 URL 而不是 root url 编辑 忘了提及它是 Devise 1 0 您的用户可能之前已被重定向after sign in path叫做 如果用
  • 是否有一个工具可以根据当前工作目录使用 SHA 创建存储库清单文件?

    我正在使用 Android 项目使用的 repo 来管理我的项目 是否有一个工具可以根据当前工作目录使用 SHA 创建存储库清单文件 如下所示
  • TfIdfVectorizer:固定词汇的向量化器如何处理新单词?

    我正在研究约 10 万篇研究论文的语料库 我正在考虑三个领域 纯文本 title abstract 我使用 TfIdfVectorizer 获取明文字段的 TfIdf 表示 并将由此产生的词汇反馈回标题和摘要的矢量化器中 以确保所有三种表示
  • 如何在 JavaScript 中使用 Math.random 进行测试?

    我有一个函数可以在最小值和最大值之间选择一个随机值 因此 当我进行测试时 我会测试该值是否落在最小值和最大值之间 但由于我的应用程序出现一些故障 测试有时会通过 有时由于随机性而失败 覆盖 模拟是个好主意吗Math random 返回 0
  • 如何在没有 Box 授权页面的情况下获取访问令牌

    我已被授予访问 协作 文件夹的权限 我需要的是每天访问该文件夹并从中获取文件 现在我生成的开发者令牌将在 1 小时后过期 有什么方法可以让我得到authorization code没有第一条腿 这需要用户界面 这样我就可以在每次获取文件时刷
  • CUDA 联合访问全局内存

    我已经阅读了 CUDA 编程指南 但我错过了一件事 假设我在全局内存中有 32 位 int 数组 我想通过合并访问将其复制到共享内存 全局数组的索引从 0 到 1024 假设我有 4 个块 每个块有 256 个线程 shared int s