Loren在Matlab的艺术上

将想法转化为matlab

比较单线程与多线程浮点计算

仍然存在一系列疑问,表明Matlab在某些操作中具有困难,如添加的某些操作,就具有多个值。有时,有什么提示,这是一个注意到在多个核或处理器上使用MATLAB时,他或她会得到不同的答案,并将这些结果与在单个核心上运行的结果进行比较时。这是Matlab新闻组中的一个示例交换。

实际上,您可以随时获得不同的结果在MATLAB中进行浮点数,甚至粘在一个线程中。大多数语言不保证对给定行的代码行的执行顺序,以及您所获得的编译器依赖于编译(C为truit)。拥有多个线程只是将问题更加复制,因为编译器有更多选项如何控制语句执行。

在MATLAB中,在将更多元素添加到变量时,您可能会看到不同的结果,具体取决于正在使用多少个线程。原因是数值圆形,不是一个错误。幸运的是,通过使用括号来强制计算顺序,易于模拟具有多于一个简单计算的核心或线程。让我们试试一个小例子。我们将使用以下几种方式计算以下表达式并进行比较结果。

1E-16 + 1E-16 + 1E30  -  1E30

内容

单线程(顺序)计算

一个单一的,总和会从左到右评估。使用括号,我们可以强制实现这一目标。

SequentialSum =((1E-16 + 1E-16)+ 1E30) -  1E30
SequentialSum = 0.

多线程计算(对于两个线程)

矢量将在两个线程之间拆分的最合乎逻辑的方式是上半部分,另一个在另一个线程上。我们在这里模拟。

Twothreadsum =(1E-16 + 1E-16)+(1E30  -  1E30)
twothreadsum = 2e-016

一个组合

让我们尝试采取其他每一个元素。那将是基本上

alternateum =(1E-16 + 1E30)+(1E-16  -  1E30)
alternateum = 0.

正确的答案

所有答案都是正确的!欢迎来到浮点算术的喜悦。你有没有遇到类似于其中一个令人困惑的情况?你是如何弄明白这个问题真的是非问题的?在重要的时候,您是否解决了(例如,不要检查浮点答案的平等,但测试值在某个有限范围内)?让我知道在这里




发布MATLAB®7.9

|

评论

要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。