问题标签 [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共享内存和warp同步
以下主机代码test.c
和设备代码test0.cu
旨在提供相同的结果。
test.c
test0.cu
如果我编译并运行它们,它们会给出与我预期相同的结果。
但是,如果我在设备代码中使用共享内存而不是全局内存,如 中test1.cu
所示,它会给出不同的结果。
test1.cu
如果我编译并运行它,它会给出与ortest1.cu
不同的结果。test0.cu
test.c
经纱同步不应该与共享内存一起使用吗?
对此问题的一些调查:
使用 CUDA8.0 时,如果我test1.cu
使用-arch=sm_61
选项进行编译(我正在使用 GTX 1080 进行测试),它会给出与test0.cu
and相同的结果test.c
。
但这不适用于较新版本的 CUDA。如果我使用任何比 8.0 更新的版本,即使我给出-arch=sm_61
选项,测试结果也会有所不同。
cuda - 为什么使用大于每个多处理器内核数的线程块
我有一块 Nvidia GeForce GTX 960M 显卡,它具有以下规格:
- 多处理器:5
- 每个多处理器的核心数:128(即 5 x 128 = 总共 640 个核心)
- 每个多处理器的最大线程数:2048
- 最大块大小(x、y、z):(1024、1024、64)
- 翘曲尺寸:32
如果我运行 1 个 640 个线程块,那么单个多处理器会获得 640 个线程的工作负载,但一次只能同时运行 128 个线程。但是,如果我运行 5 个 128 个线程的块,那么每个多处理器都会得到一个块,并且所有 640 个线程都同时运行。因此,只要我创建 128 个线程的块,那么每个多处理器的线程分布就可以尽可能均匀(假设总共至少有 640 个线程)。
那么我的问题是:为什么我要创建大小大于每个多处理器内核数的块(只要我没有达到每个维度的最大块数)?
cuda - 计算能力 6 上 __match_any_sync 的替代方案是什么?
在 cuda 示例中,例如这里,__match_all_sync
__match_any_sync
用来。
这是一个示例,其中一个扭曲被分成多个(一个或多个)组,每个组都跟踪自己的原子计数器。
这里__match_any_sync
将warp中的线程分成具有相同ptr
值的组,以便每个组可以原子地更新自己的ptr而不会妨碍其他线程。
我知道 nvcc 编译器(从 cuda 9 开始)会自动在后台进行这种优化,但这只是关于__match_any_sync
有没有办法做到这种预计算能力7?
c++ - Pre 8.x 相当于 CUDA 中的 __reduce_max_sync()
cuda-memcheck
在执行以下操作的代码中检测到竞争条件:
所以基本上这段代码根据某些条件计算每个扭曲的所有者线程。对于某些 warp 可能没有所有者,但对于某些所有者的数量可能超过 1,然后发生竞争条件,因为多个线程将值分配给同一共享内存区域。
在尝试了文档之后,我认为我需要做的事情是:
但是,我的尝试有两个问题:
- 我真的不需要找到最大线程 - 如果有一个线程,则为每个经纱选择任何 1 个线程就足够了
condition==true
- 它需要CUDA计算能力8.x,而我需要支持5.2计算能力的设备
你能帮我解决以上问题吗?
c++ - 在发散的 CUDA 运行期间监视活动的经纱和线程
我实现了一些 CUDA 代码。它运行良好,但算法本质上会产生强烈的线程分歧。这是意料之中的。
稍后我将尝试减少分歧。但目前我很高兴能够测量它。
是否有一种简单的方法(最好使用运行时 API 调用或 CLI 工具)来检查我最初计划的扭曲和/或线程中有多少仍然处于活动状态?