0

是否有任何范式可以给您不同的思维方式或对编写多线程应用程序有不同的看法?也许是感觉非常不同的东西,比如过程编程和函数编程。

4

5 回答 5

2

并发对于不同的问题有很多不同的模型。Wikipedia page for concurrency列出了一些模型,还有一个并发模式页面,它为处理并发的不同方法提供了一些很好的起点。

您采用的方法很大程度上取决于手头的问题。不同的模型解决了并发应用程序中可能出现的各种不同的问题,有些是基于其他的。

在课堂上我被教导并发使用互斥同步来解决并发问题。有些解决方案只需要一个,但两者都应该能够解决任何并发问题。

对于一个截然不同的概念,您可以查看不变性和并发性。如果所有数据都是不可变的,那么甚至不需要传统的并发方法。本文探讨了该主题。

于 2009-02-27T20:18:12.287 回答
0

我不太明白这个问题,但是如果您开始使用CUDA进行一些编码,那么您会对多线程应用程序有一些不同的思考方式。

它不同于一般的多线程技术,如信号量、监视器等,因为您同时有数千个线程。因此,CUDA 中的并行问题更多地在于对数据进行分区并稍后混合数据块。

SCAN算法是对常见串行问题进行彻底重新思考的一个小例子。它很简单:

  • 给定一个 SET {a,b,c,d,e}

我想要以下套装:

{a, a+b, a+b+c, a+b+c+d, a+b+c+d+e}

在这种情况下,符号“+”是任何交换运算符(不仅是加号,您还可以进行乘法运算)。

如何并行执行此操作?这是对问题的彻底重新思考,本文对此进行了描述。

可以在 NVIDIA网站上找到更多 CUDA 中不同算法的实现

于 2009-02-27T20:21:49.267 回答
0

嗯,一个非常保守的范式转变是从以线程为中心的并发(共享一切)到以进程为中心的并发(地址空间分离)。这样可以避免意外的数据共享,并且更容易在不同子系统之间实施通信策略。

这个想法很古老,并且被微内核操作系统社区(以及其他)传播,以构建更可靠的操作系统。有趣的是,微软研究院的Singularity OS 原型表明,在使用该模型时甚至不需要传统的地址空间。

于 2009-02-27T20:47:05.010 回答
0

我最喜欢的相对较新的想法是事务性内存:通过确保更新始终是原子的来避免并发问题。

于 2009-02-27T20:49:47.140 回答
0

查看OpenMP以了解有趣的变化。

于 2009-02-28T17:08:04.933 回答