Critical Section gpu在多线程处理数据时,可能会同时访问同一数据,从而导致临界区域处理问题。
CDA提供了多个atmoic原子操作,但仅支持一些基础数据类型,无法定制结构。 可能会影响多个数据的同步操作。
另一种解决临界区域的方法是使用锁保护临界区域。
以下是关于在论坛上找到的临界区的一些讨论。
code 1https://stack overflow.com/questions/2021 019/implementing-a-critical-section-in-cuda
3358 yosefk.com/blog/SIMD-simt-SMT-parallelism-in-NVIDIA-GPUs.html
因为gpu以wrap为单位调度线程,所以每个wrap有32个线程,wrap遵循SIMT。 这意味着wrap中的线程执行相同的执行。
根据上面的编写方式,如果wrap中的一个线程获得了锁定并退出了while循环,则在下一次执行之前不需要等待wrap中的其他线程完成该循环,但其他线程正在等待第一个线程解锁
代码2
Deadlock死锁的原因与code1相似。
这个可以正常工作。 在wrap中只有一个满足if条件。 即使调度程序先调度该线程,也可以正常运行。
代码3
上面两个代码的主要区别在于退出while循环的条件不同。 第一个是使用bool变量进行判断,第二个是使用break退出。
使用调试工具时,atomicexch(0048 )将在分支语句if ) 0038 )之后执行。 这带来了if divergence的问题。 调度程序的调度可能会导致code1死锁。 因为摇滚的释放是不确定的。
调试工具可以看到,此代码中的atomicexch(0040 )出现在if ) 0060 )条件之前,不会发生以上情况。
Conclusion应尽量避免临界区域问题,如果不能避免,请减小临界区域的大小,看看能否将一些操作向外移动。
使用锁解决临界区域问题时,请特别小心。 这是因为gpu的特殊调度机制(wrap )会导致if divergence问题。