在下面的讲解之前,我们先看一下并行计算的量纲。

随着计算机和计算机学科的发展,所有的学科都转向定量化和精确化,因此也出现了很多计算开头的学科,如计算数学、计算物理、计算生物等。目前所有的学科可以归结为三大类:即理论科学、实验科学和计算科学。其中计算科学是一个交叉学科,用计算的方法来解决应用问题,但是其中的问题也暴露出来——很多理论模型复杂或尚未建立、实验费用昂贵或无法进行。
为此,很多模型在无法实际操作的情况下,通过超级计算机的仿真模拟,可以初步探测该模型的可行性。比较常见的应用就是气象局天气预报、原子弹爆炸模拟等。
并行计算技术是一个国家的综合国力的体现,并行计算在国民经济、国防建设和科技发展中占有重要的战略地位。在飞机设计、药物设计、全球气候预测、人类基因等巨大挑战性问题时,并行计算机发挥了巨大的作用。
国家目前正在大力发展高性能计算,在军事上,我国拥有银河、神威等超级计算机;在民用上,我国拥有曙光、联想等超级计算机。需要注意的是,在08年时,我国的国产高性能计算机就已经进入TOP500前十位,总数也在大幅增加。
并行计算需求有很多种。一般分为计算密集型应用、数据密集型应用、通信密集型应用。
计算密集型应用应用于大型科学工程计算,数值模拟等,其应用领域通常在石油、气象、CAD、核能、制药、环境监测分析、系统仿真等。
数据密集型应用则应用于数字图书馆、数据仓库、数据挖掘、计算可视化等,应用领域通常在图书馆、银行、证券、税务、决策支持系统等。
通信密集型应用应用于协同工作、网格计算、遥控和远程诊断等。其应用领域通常在网站、信息中心、搜素引擎、电信、流媒体等。
不同带宽和距离的互连技术有多种,比较常用是:广域网WAN、城域网MAN、局域网WAN、个人区域网PAN、总线。广域网一般跨国,城域网一般城市,局域网一般一栋楼,个人区域网一般几台设备。其中广域网使用了交换技术,而局域网使用的是广播技术。如果是使用总线的话,总线是最快的,你可以理解为总结传输时不需要网络,直接用一条USB连接的那种。
网络性能指标一般由下面的参数来衡量:
静态互联网络是处理单元间有着固定连接的一类网络,在程序执行期间,这种点到点的连接保持不变;典型静态网络有一维线性阵列、二维网孔、树连接、超立方网络、立方环、洗牌交换网、蝶状网络等。
换而言之,静态互连网络就是用一个链路把多个处理器连接起来,构成物理意义上的并行计算机,如果某个处理器想发信息给另外一个处理器,总是能通过这条链路来干这种事。
一维线性阵列可以看成是单链表,即每个节点只与左右相邻相连,故其别名为二近邻连接。N个结点用N-1条边串联而成,内结点度为2,直径为N-1,对剖宽度为1。

这种结构虽然简单方便,但是恢复性较差。而且首尾两个计算机太远了,时延也差。所以在构造并行计算机时基本不采用。
如果将上述网络拓扑收尾节点重合,即可变为环。环可以是单向可以是双向,其节点度也是2,直径为N/2或N-1,对剖宽度为2。

二维网孔是并行计算机中较为常用的。设二维网孔为 n × n \sqrt{n}×\sqrt{n} n×n大小。其每个节点只与其上下左右的近邻相连,边界除外,节点度为4,网络直径为 2 N − 1 2 \sqrt{N-1} 2N−1,对剖宽度为 N \sqrt {N} N。
当然,二维网孔也有拓展类型,详见下图这里不再赘述。

一般采用树的网络拓扑结构用的大多数是二叉树。除了根、叶节点以外,每个内节点只与其父节点和子节点相连。
节点度为3,对剖宽度为1,而树的直径为2[logN]-1。如果尽量增加节点度,则直径缩小为2,此时就变成了星型网络,其对剖宽度为[n/2]。
传统的二叉树的主要问题是根容易成为通信瓶颈,且时延很低可恢复性也很差。,因而出现了新型的胖二叉树。
胖树的含义是:越往根部走,通信链路就越宽,这样能够有效避免根位置出现通信瓶颈的情况。
星型模式下处于中间位置的节点会成为通信瓶颈,因为所有的通信都要经由它传输。

当结点按正方体的模样构建拓扑结构,每个角作为结点处,那么我们把这个拓扑结构叫做3-立方,将两个3-立方对应顶点相连,则可以构成4-立方。以此类推,n-立方也可以这么干。

这样的超立方结构虽然性能较好但是扩展性却不好,因为每扩展一次立方,每个节点的度数变高,这样扩展起来很麻烦。
我们也可以把正方体对应的角换成三节点环,就可以将拓扑结构变成立方环。

如果是4-立方,那么每个角就要换成4个结点构成的环。

对于网络拓扑结构来说,节点度数衡量其网络的复杂度,而链路数衡量其网络的代价。
动态网络是用交换开关构成的,可按应用程序的要求动态地改变连接组态;典型的动态网络包括总线、交叉开关和多级互连网络等。
这种网络比较普遍的是总线上面挂交换器。我们知道同一时间段中,一条总线只允许两头的设备进行信息交换,而在交换完成后,交换器可以将总线的端口改变,使其连接另外一个设备。通过这种方法,可以根据我们应用的需求,动态地选择我们需要的设备。
在互联网络中还有另外一个概念叫嵌入。其做法是将网络中的各节点映射到另一个网络中去。用膨胀系数来描述嵌入的质量,它是指被嵌入网络中的一条链路在所要嵌入的网络中对应所需的最大链路数。如果该系数为1,则称为完美嵌入。
对于环网和超立方来说,两者皆可被完美嵌入到2D环绕网中。
常用的标准互连网络如下:
PVP也叫并行向量处理机(Parallel Vector Processor),其内部含有为数不多、功能强大的定制向量处理器,以及定制的高带宽纵横交叉开关和高速数据访问。其价格十分昂贵,因为其组件都需定制,一般适用于国家部门。
SMP也叫对称多处理机。其访存、IO都是对称的。其用的处理器大多数是商用处理器。
目前SMP需要解决的主要问题是Cache的一致性问题。多级高速缓存可以支持数据的局部性,而其一致性可由硬件来增强。大多数SMP系统都是基于总线连接的,占据了并行计算机市场中很大的份额。
MMP也叫大规模并行处理机(Massively Parallel Processor),其规模大,性能好。
DSM又叫分布式共享存储器(Distributed Shared Memory,DSM)。在DSM中,每个节点都有本地内存,所有的节点都有一个共享空间。
COW又叫工作站机群(Cluster of Workstation)。工作站机群的结构技术起点比较低,可以自己将一些服务器/微型机通过以太网连起来,加上相应的管理和通讯软件来搭建自己的工作站机群。
在集群中,每个节点都有本地磁盘,除了没有显示器没有鼠标没有键盘之外,基本上其他普通计算机该有的它都有。每个节点用I/O总线连向专门设计的多级高速网络,如前面在标准互连网络提到的那些。
机群也是构建并行计算机一种很廉价的方案,其被称为穷人的解决方案。使用这类并行计算机跑并行程序效率很低,但是由于它的性价比和搭建的简便性,使得近几年常被用于做并行科学计算和并行商用计算。
需要注意的是,机群不适合用于国家级的计算,因为由上述可知,实际上机群可以理解为是很多廉价的机器并在一起,而如果要运行速度跟快,能处理的数据更多,就需要并一个很大的机群。而如果机群并得很大,就会导致散热有问题。我们前面说过它们通过总线互联的,你总不能一个计算机在东一个计算机在西,然后一条总线连着吧。肯定是统一放在一个地方啊。而如果要处理大型的数据,一般机群所处的机房就要三四层楼那么高,篮球场那么宽,肯定不利于散热。

实际上上面的介绍的几类并行计算机结构模型现在已经慢慢地趋近于三类:分布共享存储计算机、分布存储多计算机、共享存储多处理机。刚刚讲过的那几个结构模型如下图所示:

UMA(Uniform Memory Access)模型是均匀存储访问模型的简称。其特点是:

与UMA与之相对的是NUMA(Nonuniform Memory Access)模型。它是非均匀存储访问模型的简称。特点是:
COMA(Cache_Only Memory Access)模型是全高速缓存访问的简称,其特点是:
CC-NUMA(Coherent-Cache Nonuniform Memory Access)模型是高速缓存一致性非均匀访问模型的简称。其特点是:
NoRMA(No-Remote Memory Access)模型是非远程存储访问模型的简称。NORMA的特点是:


我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案