cuda的Shuffle技术以及自定义双精度版本

2023-10-27


还是数组求和问题引起的,发现之前那个版本http://blog.csdn.net/lingerlanlan/article/details/24630511

对于数组的维度是有要求的。因为归约每次变为一半,所以对于线程块的数量和每个线程块线程的数量都要是2的倍数。


今天看到这篇文章https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/。

对并行归约进行了讨论。目前还没完全读懂,读懂了翻译一下。

现在对刚了解的shuffle技术写一下体会。


这玩意就是使得线程束内的线程可以共享寄存器变量。

比如函数

int __shfl_down(int var, unsigned int delta, int width=warpSize);

有点像在线程间左移变量。

下面用具体例子来说明,

int i = threadIdx.x % 32;
int j = __shfl_down(i, 2, 8);
这里32指一个线程束的线程数量是32

第一句:

int i = threadIdx.x % 32;

每个线程都有一个变量i,即是线程在所在线程束的id。

第二句:

int j = __shfl_down(i, 2, 8);
首先8指明了范围,就是0-7,8-15,16-23,24-31。

2指明了步长。比如i=5的线程,把i值赋值给了i=3的线程中的j变量。本质上就是在一定范围内线程间按照一定的步长来访问另一格线程的寄存器变量。

这幅图很好的说明了



测试例子:

#include <stdio.h>

__global__ void kernel()
{
	int i = threadIdx.x % 32;
	int j = __shfl_down(i, 2, 8);
	printf("%d:%d\n",i,j);
}

int main()
{

	kernel<<<1,32>>>();
	cudaDeviceSynchronize();

return 0;
}

输出结果:

0:2
1:3
2:4
3:5
4:6
5:7
6:6
7:7
8:10
9:11
10:12
11:13
12:14
13:15
14:14
15:15
16:18
17:19
18:20
19:21
20:22
21:23
22:22
23:23
24:26
25:27
26:28
27:29
28:30
29:31
30:30
31:31

注意红色的部分,因为参数8指明了执行范围。



因为库指提供了int和float的shuffle版本,http://docs.nvidia.com/cuda/cuda-c-programming-guide/#warp-shuffle-functions。

双精度的需要自己实现

__device__ inline
double __shfl_down(double var, unsigned int srcLane, int width=32) {
  int2 a = *reinterpret_cast<int2*>(&var);
  a.x = __shfl_down(a.x, srcLane, width);
  a.y = __shfl_down(a.y, srcLane, width);
  return *reinterpret_cast<double*>(&a);
}

这个很巧妙的。用两个32位的int来跟64位的double转换。

其实理解这个,关键是要彻底明白计算机存储数据就是若干个0和1。

而这里巧妙的另外一个地方是用到了

reinterpret_cast函数来强制转换。

这让我想起了曾经面试qq后台开发经历,貌似就是实现两个很大整数数的相加,具体多少位忘了,反正超过32位。

应该就是这种思路。




参考资料:

https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/

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

cuda的Shuffle技术以及自定义双精度版本 的相关文章

  • cudaGetDevice() 失败。状态:CUDA 驱动程序版本不足以满足 CUDA 运行时版本

    当我在 GPU 中运行 TensorFlow 时 出现以下错误 2018 09 15 18 56 51 011724 E tensorflow core common runtime direct session cc 158 Intern
  • CUDA __syncthreads() 编译正常,但带有红色下划线

    我已经使用 CUDA 4 2 一周了 但遇到了一些问题 当我编写 syncthreads 函数时 它会带有下划线 看起来是错误的 然后 如果我将鼠标放在该函数上 则会出现一条消息 标识符 syncthreads 未定义 但是当我编译我的项目
  • CUDA - 为什么基于扭曲的并行减少速度较慢?

    我有关于基于扭曲的并行减少的想法 因为根据定义 扭曲的所有线程都是同步的 因此 我们的想法是输入数据可以减少 64 倍 每个线程减少两个元素 而无需任何同步 与 Mark Harris 的原始实现相同 减少应用于块级 数据位于共享内存上 h
  • 如何获取要执行的 PTX 文件

    我知道如何生成 ptx文件来自 cu以及如何生成 cubin文件来自 ptx 但我不知道如何获得最终的可执行文件 更具体地说 我有一个sample cu文件 编译为sample ptx 然后我使用 nvcc 来编译sample ptx to
  • 在 Windows 上的 Qt Creator 中编译 Cuda 代码

    几天来我一直在尝试获取在 32 位 Windows 7 系统上运行的 Qt 项目文件 我希望 需要在其中包含 Cuda 代码 这种组合要么非常简单 以至于没有人愿意在网上放一个例子 要么非常困难 似乎没有人成功 不管怎样 我发现的唯一有用的
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • CUDA:如何在设备上填充动态大小的向量并将其内容返回到另一个设备函数?

    我想知道哪种技术可以填充设备上的动态大小数组 int row 在下面的代码中 然后返回其内容 以供另一个设备函数使用 为了将问题置于上下文中 下面的代码尝试使用在 GPU 上运行的高斯 勒让德求积来跨越勒让德多项式基组中的任意函数 incl
  • Cuda Bayer/CFA 去马赛克示例

    我编写了一个 CUDA4 Bayer 去马赛克例程 但它比在 16 核 GTS250 上运行的单线程 CPU 代码慢 块大小是 16 16 图像暗淡是 16 的倍数 但更改此值并不会改善它 我做了什么明显愚蠢的事情吗 calling rou
  • cudaMallocManaged() 返回“不支持的操作”

    在 CUDA 6 0 中尝试托管内存给了我operation not supported打电话时cudaMallocManaged include cuda runtime h include
  • 使用 QuasirandomGenerator (对于傻瓜来说)

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

    我在尝试开发以练习 CUDA 的 CUDA 应用程序时遇到并发问题 我想通过使用 cudaMemecpyAsync 和 CUDA 内核的异步行为来共享 GPU 和 CPU 之间的工作 但我无法成功重叠 CPU 执行和 GPU 执行 它与主机
  • MPI+CUDA 与纯 MPI 相比有何优势?

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

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my

随机推荐

  • 【SAML2.0】概念盲扫

    目录 一 SAML是什么 二 SAML 1 SAML的构成 2 SAML的流程分析 3 SAML的优点 简介 安全断言标记语言 英语 Security
  • final的分析

    源自 http www cnblogs com dolphin0520 p 3736238 html 1 修饰类 当用final修饰一个类时 表明这个类不能被继承 2 修饰方法 使用final方法的原因有两个 第一个原因是把方法锁定 以防任
  • 寻找第k大元素,时间复杂度是多少?

    寻找第k大元素可以通过多种算法实现 其中时间复杂度最优的是基于快速排序的算法 称为快速选择 QuickSelect 算法 快速选择算法的基本思想是选择一个基准元素 然后将数组划分为比基准元素小和比基准元素大的两个子数组 如果第k大元素在比基
  • 关于图像的傅里叶变换的理解

    最近再学opencv关于图像的傅里叶变换的知识 自己感觉很难理解 查阅相关书籍和博客发现很多写的都比较含糊 下面是转载自知乎一个博主关于图像的傅里叶变换的通俗解释 通俗讲解 图像傅里叶变换 文末加了一点冈萨雷斯 数字图像处理 中的关于频谱中
  • Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:请求与响应

    文章目录 目的 解析客户端请求 服务器进行响应 URL重定向 总结 目的 WebServer功能很多 最主要的一块就是解析来自用户的HTTP请求 然后根据功能需求将响应的消息发送给客户 这篇文章将粗略介绍ESPAsyncWebServer中
  • 组成原理---控制器

    文章目录 控制器的组成及指令的执行 基本的计算机组成和功能 控制器的组成 时序及控制方式 数据通路和指令的执行过程 简单计算机系统主机各部件的实现方案 简单计算机系统中指令的执行过程 MIPS单周期CPU的数据通路和指令的执行过程 硬布线控
  • 机器学习实战——6.支持向量机

    目录 6 1 基于最大间隔分隔数据 6 2 寻找最大间隔 6 2 1 分类器求解的优化问题 6 2 2 SVM应用的一般框架 6 3 SMO高效优化算法 6 3 1 Platt的SMO算法 6 3 2 应用简化版SMO算法处理小规模数据集
  • springboot 全局异常处理类

    目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖
  • 在CocosCreator的3.x版本中实现贝塞尔曲线

    使用环境参考 CocosCreator v3 7 3 前情提要 在之前的 2 x 版本中 CocosCreator 关于贝塞尔曲线是内置了 API 可以让节点动画直接使用 但在升级到 tween 实现后 灵活了但没有了现成的贝塞尔曲线的实现
  • 2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)

    目录 1 概述 2 问题 3 运行结果 4 Python代码 1 概述 校园供水系统是校园公用设施的重要组成部分 学校为了保障校园供水系统的正常运行需要投入大量的人力 物力和财力 随着科学技术的发展 校园内已经普遍使用了智能水表 从而可以获
  • 用geoda软件进行空间自相关分析示例

    毕业论文需要用到空间自相关 所以摸索摸索了好久 终于弄出了大概的流程了 情景1 如果你没有shp格式的文件数据 那么我建议你下载geoda095i这个版本 因为最新版本的我不太会操作 明确问题 假如我们要对广东省各市2005人均GDP进行空
  • 算法设计与分析 期末考试试卷

    1 渐进表示法中f n O g n 意味着f n 的数量级 不大于 g n 的数量级 填 小于 大于 不小于 或 不大于 平时各种教材中见到的O n2 表达的意思是算法的复杂度 等于 n2数量级 填 小于 等于 或 大于 2 算法的正确性通
  • 【C语言】超详细的移位、位操作符详解(含力扣实战)

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 1 整数的二进制表示 2 移位操作符 2 1左移操作符 低
  • 第086讲: Pygame:碰撞检测

    今天我们来学习碰撞检测 大部分游戏都是需要做碰撞检测的 因为你需要知道小球是否发生了碰撞 子弹是否击中了目标 主角是否踩到了狗屎 那应该如何实现呢 说白了 它这个原理很简单 就是检测两个精灵之间是否存在重叠的部分 像我们上节课的小球 在图1
  • innodb_flush_method理解(图解)

    innodb flush method这个参数控制着innodb数据文件及redo log的打开 刷写模式 对于这个参数 文档上是这样描述的 有三个值 fdatasync 默认 O DSYNC O DIRECT 默认是fdatasync 调
  • wsl2 出现 Vmmem内存占用过大问题解决

    分步解决方法 定期执行缓存删除 在WSL bash上 执行 sudo crontab e u root 并添加以下行 15 sync echo 3 gt proc sys vm drop caches touch root drop cac
  • AD常用DRC规则简单介绍

    前言 最近在复习AD中画PCB板时的DRC规则 在这里做一个常用规则的简单总结 虽然有时候可以无脑将除电气规则以外的其他规则全部取消勾选 但是这样并不好 正文 Electrical Clearance Constraint 走线的线路间隔
  • Cannot construct instance of `com.baomidou.mybatisplus.core.metadata.IPage

    Feign调用无法解析 IPage包裹的数据 目前解决方案有两种 一种是转Page 另一种是序列化 一 转Page传递 api接口 PostMapping value queryEnterprise public Result
  • Mysql基础(入门)

    一 数据库介绍 1 什么是数据库 数据库就是 个存放计算机数据的仓库 这个仓库是按照 定的数据结构 数据结构是指数据的组织形式或数据之间的联系 来对数据进 组织和存储的 可以通过数据库提供的多种 法来管理其中的数据 2 数据库的种类 最常
  • cuda的Shuffle技术以及自定义双精度版本

    还是数组求和问题引起的 发现之前那个版本http blog csdn net lingerlanlan article details 24630511 对于数组的维度是有要求的 因为归约每次变为一半 所以对于线程块的数量和每个线程块线程的