问题标签 [gpu-warp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - CUDA 扭曲调度是确定性的吗?
我想知道 CUDA 应用程序的扭曲调度顺序是否是确定性的。
具体来说,我想知道在同一设备上使用相同输入数据多次运行同一内核时,warp 执行的顺序是否会保持不变。如果没有,是否有任何东西可以强制执行扭曲执行的顺序(比如在调试依赖于顺序的算法时)?
cuda - cuda warp 大小和控制发散
我对以下问题有疑问:
假设我们有一张 9*7 的图片(x 方向上 7 个像素,y 方向上 9 个像素),假设 4*4 线程块和每个 warp 8 个线程,有多少个 warp 将具有控制散度?
块和经线将如何组织在这里?对于 x 或水平方向,我可以假设每行 2 个块。类似地,对于垂直方向,每列 3 个块。但是,经线将如何组织?有人可以指出扭曲的线程ID,以及发生控制分歧的情况(线程ID等)。
谢谢
cuda - 基于 WARP ID 的分支
有什么方法可以在 CUDA 中找到线程的 WARP id?我想根据 WARP id 执行一个分支。
cuda - CUDA 翘曲发散
我正在使用 cuda 进行开发并且有一个算术问题,我可以在有或没有经线分歧的情况下实现。有了经线发散,它看起来像:
没有经线发散,版本看起来像:
问题是,哪个版本更快?
换句话说,与一些额外的计算和添加 0 相比,扭曲禁用有多昂贵?
c - 避免翘曲发散
我有T[N]
控制移位值的布尔一维数组,如下所示:
**a
:指向全局内存中矩阵的指针数组n*n
我希望每个矩阵a
都包含一个 shift*Identity 来获得:
我有:
shift 的值由 T 控制 if T[i]==true => shift=shift1 else shift=shift2;
这将导致扭曲发散并减慢我的代码。是否有避免上述循环的翘曲发散的技巧?
c++ - 我什么时候应该使用 CUDA 的内置 warpSize,而不是我自己的常量?
nvcc 设备代码可以访问内置值 ,warpSize
该值设置为执行内核的设备的扭曲大小(即在可预见的将来为 32)。通常你不能把它和一个常量区分开来——但是如果你尝试声明一个长度为 warpSize 的数组,你会收到一个关于它是非常量的抱怨......(使用 CUDA 7.5)
所以,至少为了这个目的,你有动力去拥有类似(编辑)的东西:
在你的标题中的某个地方。但是现在 - 我应该更喜欢哪个,什么时候?:warpSize
,还是warp_size
?
编辑: warpSize
显然是 PTX 中的编译时常量。不过,问题仍然存在。
cuda - CUDA 的 resident warp 问题
我已经使用 CUDA 一个月了,现在我想弄清楚需要多少扭曲/块来隐藏内存访问的延迟。我认为这与多处理器上的最大常驻扭曲有关。
根据 CUDA_C_Programming_Guide (v-7.5) 中的 Table.13,每个多处理器的驻留扭曲的最大值为 64。那么,我的问题是:什么是驻留扭曲?它是指那些从 GPU 内存读取的数据并准备好由 SP 处理的扭曲吗?或者指可以为数据读取内存的经线或准备好由 SP 处理的经线,这意味着除了这 64 个经线之外的其余经线既不能读取内存也不能被 SP 处理,直到这 64 个常驻经线中的一些完成.
cuda - CUDA 合并访问 FP64 数据
我对 FP64 数据如何影响 warp 发出的内存访问感到有点困惑。
- 不管这些线程是在做 FP32 还是 FP64 计算,一个 warp 总是由 32 个线程组成。对?
- 我已经读过,每次经线中的线程尝试读/写全局内存时,经线访问 128 个字节(32 个单精度浮点数)。对?
- 因此,如果 warp 中的所有线程都以合并的方式从内存中读取不同的单精度浮点数(总共 128 个字节),则 warp 将发出单个内存事务。对?
这是我现在的问题:
- 如果 warp 中的所有线程都尝试以合并的方式访问不同的双精度浮点数(总共 256 个字节)怎么办?warp 会发出两个内存事务(128+128)吗?
PS:我最感兴趣的是 Compute Capability 2.0+ 架构
cuda - 有没有办法将线程显式映射到 CUDA 中的特定扭曲?
比如说,动态分析是在一个 CUDA 程序上完成的,这样某些线程最好在同一个 warp 中。
例如,假设我们有 1024 个 cuda 线程,warp 大小为 32。经过动态分析,我们发现线程 989、243、819、...、42(总共列出了 32 个线程)应该在同一个 warp 上。我们确定它们应该在同一个 warp 上,因为它们在代码执行方面几乎没有分歧——(在执行 CUDA 程序的动态分析时,它们可能不一定在同一个 warp 上)。
有没有办法控制线程在 CUDA 中扭曲调度?如果没有,是否有另一种 GPU 编程语言可以提供这种显式的扭曲调度。如果没有,可以做些什么(甚至可能是解决这个问题的非常低级的方法)?我希望至少有最后一个问题的答案,因为这可能是 CUDA 的实现方式——除非在硬件级别完成扭曲调度,这将是不幸的。谢谢!
parallel-processing - 用简单的矩阵乘法核控制发散
给定以下简单的矩阵乘法内核
如果我们在 1000X1000 矩阵上启动块大小为 16X16 的内核,有多少扭曲将具有控制散度?
答案:500
解释:水平方向有 63 个方块。每行 x 维度中的 8 个线程将在无效范围内。每两行形成一个经线。因此,有 1000/2=500 个扭曲将跨越水平方向的有效和无效范围。至于底部块中的warp,有效范围内有8个warp,无效范围内有8个warp。这些经线中的线程要么完全在有效范围内,要么完全在无效范围内。
问题:我试图理解为什么在这种情况下,x 维度中的 8 个线程将在无效范围内?