Tud*_*dor 3 parallel-processing synchronization cuda
如何实现表单的繁忙旋转机制
while(variable == 0);
Run Code Online (Sandbox Code Playgroud)
在某个事件发生后,其他CUDA线程将变量更新为1.
我试着像上面那样编写它,但代码似乎被忽略了,调用线程只是在没有等待的情况下运行它.我绝对确定该值为0,但线程根本不会等待.另外,如果我写:
while(variable == 0) __threadfence();
Run Code Online (Sandbox Code Playgroud)
为了不让缓存变量的风险,线程无限期地阻塞,甚至认为变量最终被设置为1.这对我来说都是非常奇怪的行为,因为在CPU上复制此代码会产生正确的行为.
编辑:奇怪的是,如果我有每个1个线程的块,这似乎正常工作,但如果我在一个块中有多个线程则不行.因此,来自一个块的线程可以看到来自其他块的线程完成的写入,但不能查看来自同一块的线程完成的写入.奇怪...
繁忙的纺纱需要很多关注,你必须要非常小心!
你必须记住,32个线程,形成一个完美同步的扭曲工作.如果遇到分支,则不执行分支的线程将被禁用,直到线程执行分支 - 从中退出.这就是为什么尝试在warp中忙碌旋转会导致死锁:31个线程将永远等待单个禁用线程执行其工作.
其次,如果尝试在块之间进行同步,则必须知道两个块并行运行.从理论上讲,您不知道有多少块正在运行; 实际上,您可以阅读GPU的规格,并尽可能多地启动(驱动程序和/或硬件中存在一些错误,这也会导致一些问题)
第三,你必须记住CUDA编译器试图优化.您必须将共享或全局变量设置为"volatile"以确保始终读取它.