如何实现表单的忙自旋机制
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/