首页 > 编程知识 正文

临界区调度原则,临界区问题三原则

时间:2023-05-06 18:44:23 阅读:150244 作者:4453

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问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。