[英]Threading paradigm?
是否有任何范例给您不同的心态或对编写多线程应用程序有不同的看法? 也许感觉上有很大的不同,例如从过程编程到函数编程。
我不太了解这个问题,但是如果您开始使用CUDA进行一些编码,则会为您提供有关多线程应用程序的不同思考方式。
它与一般的多线程技术(例如信号量,监视器等)不同,因为您同时具有数千个线程。 因此,CUDA中的并行性问题更多地在于对数据进行分区和稍后混合数据块。
完全重新思考一个常见串行问题的一个小例子就是SCAN算法。 它很简单:
我需要以下设置:
{a,a + b,a + b + c,a + b + c + d,a + b + c + d + e}
在这种情况下,符号“ +”是任何交换运算符(不仅是加号,还可以进行乘法运算)。
如何并行执行此操作? 本文对此进行了全面的重新思考。
可以在NVIDIA 网站上找到CUDA中不同算法的更多实现。
好吧,一个非常保守的范式转换是从以线程为中心的并发(共享所有内容)到以进程为中心的并发(地址空间分离)。 这样一来,可以避免意外的数据共享,并且可以更轻松地在不同子系统之间实施通信策略。
这个想法是古老的,并由Micro-Kernel OS社区传播(其中包括)以构建更可靠的操作系统。 有趣的是,Microsoft Research的Singularity OS原型表明,使用此模型时,甚至不需要传统的地址空间。
我最喜欢的一个相对较新的想法是事务性存储 :通过确保更新始终是原子性来避免并发问题。
看看OpenMP的有趣变化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.