parallel-processing - CUDA 中的忙碌旋转

标签 parallel-processing cuda synchronization

如何实现表单的忙自旋机制

while(variable == 0);

变量在某些事件发生后被其他 CUDA 线程更新为 1。

我试着像上面那样写它,但代码似乎被忽略了,调用线程只是跑过它而根本没有等待。我绝对确定该值为 0,但线程根本不等待。 另外,如果我写:

while(variable == 0) __threadfence();

为了不冒变量被缓存的风险,即使变量最终被设置为 1,线程也会无限期地阻塞。 这对我来说都是非常奇怪的行为,因为在 CPU 上复制这段代码会产生正确的行为。

编辑:奇怪的是,如果我每个 block 有 1 个线程,这似乎可以正常工作,但如果我在一个 block 中有多个线程,则不能正常工作。因此,一个 block 中的线程可以看到其他 block 中的线程完成的写入,但看不到同一 block 中的线程完成的写入。奇怪……

最佳答案

忙碌的纺纱需要很多注意力,你必须非常小心!

您必须记住,32 个线程,形成一个完美同步的经线工作。如果您遇到一个分支,则未使用它的线程将被禁用,直到执行该分支的线程 - 退出它。 这就是为什么尝试在 warp 中忙自旋会导致死锁:31 个线程将永远等待单个禁用的线程完成其工作。

其次,如果你尝试在 block 之间进行同步,你必须知道两个 block 是并行运行的。理论上,你不知道有多少 block 正在运行;在实践中,您可以阅读 GPU 的规范并尽可能多地启动它(驱动程序和/或硬件中存在一些错误,这也可能导致一些问题)

第三,您必须记住 CUDA 编译器会尝试优化。您必须将您的共享或全局变量设置为“ volatile ”以确保它始终被读取。

关于parallel-processing - CUDA 中的忙碌旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756961/

相关文章:

c# - 如何设置 Socket.ConnectAsync 超时?

c++ - 在 openacc 中为每个帮派进行递归的私有(private)数组

c++ - Cuda有效地从字节数组复制到不同大小的共享内存元素

matlab - 从 Matlab CSC 到 CSR 格式的转换

scala - parallelsim下scala并发类和非并发类的区别

c++ - 如何编辑和重新构建 GCC libstdc++ C++ 标准库源代码?

c++ - 如何优化 VBO/IBO 以最大化 GPU 缓存使用

c++ - 在网络游戏中通过 UDP 发送键盘输入

java - 优化 : Painting synchronization

Javascript 时间同步