To compile: 'mpicc -g -o matrix matrix.c'
To run: 'mpirun -np 4 matrix'
"-np 4" specifies the number of processors.
#include <stdio.h>
#include <mpi.h>
#define SIZE 4
int main(int argc, char **argv) {
int j;
int rank, size, root;
float X[SIZE];
float X1[SIZE];
float Y1[SIZE];
float Y[SIZE][SIZE];
float Z[SIZE];
float z;
root = 0;
/* Initialize MPI. */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
/* Initialize X and Y on root node. Note the row/col alignment. This is specific to C */
if (rank == root) {
Y[0][0] = 1; Y[1][0] = 2; Y[2][0] = 3; Y[3][0] = 4;
Y[0][1] = 5; Y[1][1] = 6; Y[2][1] = 7; Y[3][1] = 8;
Y[0][2] = 9; Y[1][2] = 10;Y[2][2] = 11;Y[3][2] = 12;
Y[0][3] = 13;Y[1][3] = 14;Y[2][3] = 15;Y[3][3] = 16;
Z[0] = 1;
Z[1] = 2;
Z[2] = 3;
Z[3] = 4;
MPI_Barrier(MPI_COMM_WORLD);
/* root scatters matrix Y in 'SIZE' parts to all nodes as the matrix Y1 */
MPI_Scatter(Y,SIZE,MPI_FLOAT,Y1,SIZE,MPI_FLOAT,root,MPI_COMM_WORLD);
/* Z is also scattered to all other nodes from root. Since one element is sent to
all nodes, a scalar variable z is used. */
MPI_Scatter(Z,1,MPI_FLOAT,&z,1,MPI_FLOAT, root,MPI_COMM_WORLD);
/* This step is carried out on all nodes in parallel.*/
for(j=0;j<SIZE;j++){
X1[j] = z*Y1[j];
/* Now rows are added, using MPI_SUM (using recursive halving and doubling algorithm,
internal to the MPI implementation) */
MPI_Reduce(X1,X,SIZE,MPI_FLOAT,MPI_SUM, root,MPI_COMM_WORLD);
if (rank == 0) {
printf("%g\n",X[0]);printf("%g\n",X[1]);printf("%g\n",X[2]);printf("%g\n",X[3]);
MPI_Finalize();
return 0;
性能测试集
群已经构建好,可以执行程序了,接下来需要了解这些程序的执行速度到底有多快。通常我们都认为是处理器的频率决定了性能的高低。对于特定的范围来说,这个
结论是正确的;但是在不同供应商的处理器或相同供应商提供的不同处理器系列之间进行比较,没什么意义,因为不同的处理器在给定的时钟周期内所执行的任务量
是不同的。在 第 1 部分 中对向量和标量处理器进行比较时,这尤其明显。
对性能进行比较的一种更加自然的方法是运行标准测试。随着时间的推移,有一个非常出名的 LINPACK 基准测试已经成为比较性能的标准。它是由 Jack Dongarra 在十年之前开发的,现在仍在由 top500.org 使用(请参阅 参考资料 中的链接)。
这个测试要解包含 N 个线性方程的密集方程组,其中浮点操作的个数是已知的(是 N^3 级别)。这个测试非常适合用来测试那些要运行科学应用程序和模拟的计算机,因为它们都要在某些步骤上试图对线性方程进行求解。
测试的标准单位是每秒执行的浮点操作数量,即 flop 数(在这种情况中,flop 或者是一个 64 位的加法操作,或者是一个 64 位的乘法操作)。这个测试要测量的内容如下:
- Rpeak,flop 的理论峰值。在 2005 年 6 月的报告中,IBM Blue Gene/L 的时钟峰值为 183.5 tflop(万亿 flop)。
- Nmax,得出最高 flop 时所使用的矩阵大小 N。对于 Blue Gene 来说,这个值是 1277951。
- Rmax,Nmax 所达到的最大 flop。对于 Blue Gene 来说,这个值是 136.8 tflop。
为了更好地理解这些数字,请考虑下面这个事实:IBM BlueGene/L 在 1 秒之内可以完成的操作在一台家用计算机上需要执行 5 天。
现在让我们来讨论一下如何对 Linux 集群进行基准测试。除了 LINPACK 之外,其他基准测试还有 HPC Challenge Benchmark 和 NAS benchmark。
对 Linux 集群进行基准测试
要在 Linux 集群上运行 LINPACK 基准测试,我们需要获得一个并行版本的 LINPACK,并对这个集群配置 LINPACK。我们将一步步地介绍整个过程。
警告:下面使用了普通的线性代数库;使用它只是作为一个参考。对于一个真正的测试来说,要使用已经针对自己的环境优化过的库。
从 netlib.org 下载 hpl.tgz,这是 LINPACK 基准测试的并行(MPI)版本(请参阅 参考资料 中的链接)。
从 netlib.org 下载 blas_linux.tgz,这是预先编译好的 BLAS(Basic Linear Algebra
Subprograms)。为了简单起见,可以使用一个为 Linux 准备的预先编译好的 BLAS
参考实现,但是为了能够得到更好的结果,应该使用硬件供应商所提供的 BLAS,或者使用开放源码的 ATLAS 项目进行自动优化。
步骤 3 mkdir /home/linpack ; cd /home/linpack (我们要将所有的东西都安装到 /home 中)。
解压并展开 blas_linux.tgz,这样应该会得到一个名为 blas_linux.a 的文件。如果看到了这个文件,就可以忽略所看到的错误。
解压并展开 hpl.tgz,这样应该会得到一个目录 hpl。
将所有的配置文件(例如 Make.Linux_PII_FBLAS)从 hpl/setup 拷贝到 hpl 目录中,并将 hpl 中的拷贝重命名为 Make.LinuxGeneric。
步骤 7
编辑文件 Make.LinuxGeneric 中下面的内容,并修改为适合您的环境的值:
TOPdir = /home/linpack/hpl
MPdir = /tmp/mpich-1.2.6
LAlib = /home/linpack/blas_linux.a
CC = /tmp/mpich-1.2.6/bin/mpicc
LINKER = /tmp/mpich-1.2.6/bin/mpif77
这 5 个地方指明了步骤 1 中 LINPACK 的顶级目录、MPICH 安装的顶级目录以及步骤 2 中 BLAS 参考实现的位置。
现在编译 HPL:
make arch=LinuxGeneric
如果没有错误,就会得到两个文件 xhpl 和 HPL.dat,它们都在 /home/linpack/hpl/bin/LinuxGeneric 目录中。
在集群上运行 LINPACK 基准测试之前,将整个 /home/linpack 目录拷贝到集群中的所有机器上。(如果使用 OSCAR 创建的集群并配置了 NFS 共享,就可以忽略这个步骤。)
现在 cd 到在步骤 8 中所创建的可执行程序所在的目录,并运行一些测试(例如 /tmp/mpich-1.2.6/bin/mpicc -np 4 xhpl )。应该会看到使用 GFLOP 表示的执行结果。
注:上面的步骤会基于矩阵大小的缺省设置来运行一些标准测试。使用文件 HPL.dat 来对测试进行调优。有关调优的详细信息可以在文件 /home/linpack/hpl/TUNING 中找到。
IBM Blue Gene/L
现在我们已经构建好了集群,接下来快速介绍一下 Blue Gene/L,这是一台基于集群的非常好的超级计算机。Blue Gene/L 是一项大型的工程壮举,对其进行详细介绍显然已经超出了本文的范围。现在我们只是简单介绍一下表面的东西。
三年前,地球模拟器(Earth Simulator)(向量处理器)成为世界上最快的计算机,很多人都预测集群作为一种超级计算机平台已经走向了死亡,向量处理器已经复苏了;这个结论下得太早了。Blue Gene/L 在标准的 LINPACK 基准测试中已经彻底击败了地球模拟器。
Blue Gene/L
并不是使用常用的工作站来构建的,但是它依然使用本系列文章中所讨论的标准集群技术。它使用了一个源自于本文中使用的 MPICH 的 MPI
实现。它还可以运行 700MHz 的标准 32 位 PowerPC CPU(不过这些是基于片上系统或 SoC
技术的),这比该系列中的其他机器更能极大地降低对制冷和电源的需求。
Blue Gene/L 是一个非常大的机器,有 65,536 个计算节点(每个节点都运行一个定制的操作系统),还有 1,024
个专用的 I/O 节点(运行 Linux 内核)。使用如此多的节点,网络就尤其重要了,Blue Gene/L 可以使用 5
种不同类型的网络,每种网络都为一个特定的目的进行了优化。
有关 Blue Gene/L 的更多信息可以在最近一期专门介绍它的 IBM Systems Journal 中找到。在 Blue Gene/L 中,我们看到了一个高度可扩展的 MPP 实现,以及基于集群的计算系统仍然会存在的清晰证据。
化学教学工具 kalzium - chemistry teaching tool for KDE
Kalzium is a program which shows you the Periodic System of Elements (PSE). You can use Kalzium to search for information about the elements or to learn facts about the PSE.
Kalzium provides you with all kinds of information about the PSE. You can look up lots of information about the elements and also use visualisations to show them.
You can visualise the Periodic Table of the Elements by blocks, groups, acidic behavior or different states of matter. You can also plot data for a range of elements (weight, mean weight, density, IE1, IE2, electronegativity), and you can go back in time to see what elements were known at a given date. In addition, on platforms where OCaml supports native code generation, Kalzium includes a chemical equation solver.
This package is part of the official KDE edutainment module.
[22:55] [发表评论]
http://tech.ccidnet.com/art/737/20041208/187015_1.html
监控是集群管理的核心任务。监控数据可用于调度任务、负载平衡、向管理员报告软硬件故障,并
广泛地控制系统使用情况。监控信息必须在不影响集群性能的情况下获得。本文将讨论使用/proc文件系统和Java来获得监控数据的方法。
Java在Linux集群中的应用
Java技术为集群管理开发者提供了许多解决问题的办法。Java是动态、灵活、可移植的,这些不寻常的特征使得它成为了在异构网络及平台上构造集群管理的理想基础。
Java具有广泛的例程库,很容易处理IP协议,如TCP、UDP,并可在multi
-homed主机上进行网络程序设计,用它创建网络连接比用C或C++更容易。通过Java本地接口(JNI),运行在Java
虚拟机(JVM)内的Java代码能够与用其它语言编写的应用及库文件相互操作并汇编。
在构造集群监控和管理时,Java早已是一个可选的语言。然而,Java语言通常只
被用于系统的前端或集群主机部分,而将用C语言编写的守护进程安装在集群结点上。尽管Java程序设计语言提供了许多优点,但是,对于高性能集群监控,
Java能够有效地替换运行在每个结点上的C语言守护进程吗?这将是本文讨论的重点。
高性能监控
监控Linux集群工具传统上以秒为测量频率来提供有限量的数据。而高性能集群监控被
定义为“以intrasecond为测量频率,从结点有效地采集数据的能力”。当涉及较大集群时,监控软件的低效率问题就变得更加严重,这是因为所运行的
应用软件必须互相协调或共享全局资源。
在一个结点上的阻隔冲突(Interference)能影响其它结点上作业的运行。
例如,一个MPI作用需要与所有参与的结点同步。一种解决办法是收集少量的数据,并以小频率传输。然而,如果是高性能监控,这种解决办法是不可接受的,因
为有较重利用率的集群应该被频繁持续地监控。本地作业调度器必须能够基于资源使用情况做快速决策。管理员经常希望收到紧急事件的立即通知,并希望观察到历
史趋势数据,如果集群不能被频繁持续地监控,那么这些要求是不可能实现的。因此,必须采取一些措施,如使用更有效的算法、增加传输的并行性、提高传输协议
及数据格式的效率、减少冗余等。
在跟踪运行中的资源使用情况时,压缩Profiling应用有助于调试程序或优化程
序。对一个给定的应用而言,像存储器、网络、CPU这样动态资源的使用可能快速地改变着,为了能够观察应用是怎样使用这些资源的,一种可能的办法是使用高
频率的监控。
即使用户对高频率监控没有兴趣,如果算法是有效的,不管监控频率是多少,它也将消费
很少的资源。在异构集群中这种效率将更重要,用户的作业可以被分散到较快的及较慢的结点上,慢的结点需要全部CPU来跟上较快的结点并与之同步。一个监控
程序花费在较慢结点上的CPU时间是作业的关键路径。
集群监控主要消耗CPU周期与网络带宽这两个重要资源。然而,资源消费问题与这两个资
源是根本不同的。CPU利用问题对结点而言是完全本地化的问题,可通过创建有效的收集与合并算法来解决。网络带宽是共享资源,是规模问题,可以通过最小化
网络上传输的数据量来解决。
为了解决这两个问题,我们将集群监控分为三个阶段:收集、合并、传输。收集阶段负责
从操作系统装载数据、分析数据值,并存储数据。合并阶段负责将来自多个数据源的数据合在一起,决定数据值是否改变并过滤它们。传输阶段负责压缩并传输数
据。本文集中讨论Linux集群监控的收集阶段。
1.收集阶段 Linux有几种方法来进行系统统计,每种方法都各有其优缺点。 ◆ 使用现有的工具 标准及非标准工具能执行一个或多个收集、合并及传输阶段,如rstatd或SNMP工具,然而标准的rstat后台程序提供的信息是有限的,速度慢而且效率低。 ◆ 内核模块
几个系统监控工程利用内核模块来存取监控数据。一般情况下,这是很有效的收集系统数据的方法。然而这种方法存在的问
题是,当主内核源内有其它改变时,必须保持代码一致性。一个内核模块可能与用户想使用的其它内核模块相冲突。此外,在使用监控系统之前,用户必须获得或申
请模块。 ◆ /proc虚拟文件系统
/proc虚拟文件系统是一个较快的、高效率执行系统监控的方法。使用/proc的主要缺点是必须保持代码分析与/proc
文件格式改变的同步。事实表明,Linux内核的改变比/proc
文件格式的改变要更频繁,所以,用/proc虚拟文件系统比用内核模块存在的问题要少。 ◆ 混合系统 某些监控系统采用混合方式,用内核模块收集数据,用/proc虚拟文件系统作为数据接口。
2.合并阶段 合并阶段的实
现可以在结点上、集群管理的主机上,或者分布在两者上。考虑到效率,我们只采用在结点上的合并。原因在于结点是监控数据的收集器与提供者。两个或多个同时
的数据请求不会引起两次操作系统调用来收集数据,而是将第一次请求获得的数据缓存,并可以提供给第二次请求调用。这种方法减少了操作系统的负担,提高了监
控系统的响应性。合并阶段也可以用于将多个数据源的数据以相互独立的收集速率结合,因为并不是所有的数据都以同样的速度改变,或者需要以同样的速率收集。
使用在结点层上合并的另一个原因是,减少了包括传输在内的信息量。许多/proc文
件既包含动态数据也包含静态数据。删除最近一次传输后没有改变的值,一个结点发送的数据量可以大大地减少。合并不仅除去了不经常改变的动态值的传输,也解
决了从不改变的静态值的传输。
3.传输阶段 监控数据几
乎总是按一个层次结构组织起来。传输阶段的任务就是将层次数据进行有效的编码,形成一种能高效传输的数据格式。Java拥有的文件格式是存储层次数据的有
效方法,并且用提供的Java APIs很容易完成。S-Expressions已经被认为是传输这种数据的另一个有效的方法。
关于传输监控数据普遍讨论的问题是,数据应该按二进制编码还是按文本格式编码。二进
制数据更容易压缩,因此也能更有效地传输。但是,当采用/proc文件系统时,监控数据通常以人们易读的格式存储。在传输之前,将数据转换为二进制格式将
需要更多的处理资源与时间。以文本格式保留收集的数据,结点资源能被用于更多非监控性的相关工作。
采用文本格式的数据将提供如下额外的益处: ◆ 平台独立性 当监控异构集群时,机器之间数据字节指令的配置不是永远相同的。文本格式的使用在代码方面解决了这个问题,而且体系结构独立不会影响更多的处理需求。 ◆ 易读的格式 文本数据能以人们易读的格式进行组织。如果需要的话,这种特征能容易地进行程序调试或允许用户观看数据流。 ◆ 有效压缩 数值数据的文本表示由来自10个字节集中的字符组成,而不是二进制下的256个字节集。它们产生的数字及模式的相对频率允许有效地使用基于压缩算法的字典及熵(平均信息量)。
/proc虚拟文件系统
/proc虚拟文件系统(也叫procfs)是Unix操作系统所使用的虚拟文件系统
的Linux实现,包括Sun
Solaris、LinuxBSD。在/proc开始时,它以一个标准文件系统出现,并包含与正在运行的进程IDs同样名字的文件。然而,在/proc中
的文件不占用磁盘空间,它们存在于工作存储器(内存)中。/proc最初的目的是便于进程信息的存取,但是现在,在Linux中,它可被内核的每一部分使
用来报告某些事情。
在/proc文件系统提供的成百上千的值当中,我们将集中考虑集群监控所需的最小集,它们包括: ◆ /proc/loadavg:包含系统负载平均值; ◆ /proc/meminfo:包含存储管理统计量; ◆ /proc/net/dev:包含网卡度量; ◆ /proc/stat:包含内核统计量; ◆ /proc/uptime:包含总的系统正常工作时间及空闲时间。
每个文件提供的值的数量是不同的。这些文件的完整有效值列表如下。 ◆ /proc/loadavg提供以下数据:
值得注意的是,每次某个/proc被读时,一个句柄函数都被内核或特有模块调用,来产
生数据。数据在运行中产生,不管是读一个字符还是一个大的字块,整个文件都将被重建。这对效率是至关重要的一点,因为使用/proc的任何系统监控器将吞
下整个文件,而不是一点一点地处理它。
Java提供了丰富的文件I/O类集,包括基于类的流、基于类的块设备,以及
J2SDK
1.4提供的新的I/O库。实验表明,一般而言,对基本的块读写文件操作,用RandomAccessFile类进行I/O是最佳的。例如,块读文件操作
本文讨论了如何将Java语言有效地用于Linux集群结点上的高性能监控。在程序设计中,要注意以下方面: ◆ 采用/proc文件系统; ◆ 以块形式读/proc文件,而不是以行或字符形式; ◆ 在读文件期间保持文件打开; ◆ 消除不必要的数据转换; ◆ 在结点上合并数据; ◆ 以压缩形式传输数据; ◆ 注意与性能问题相关的语言或库。
对高性能监控而言,内核模块不是必要条件,这点很重要,因为它在Linux版本和分类
之间提供了很大程度的可移植性,在监控器实现语言上有很多的选择。但是,/proc文件系统的性能却很依赖内核代码的效率,因此,适当地理解有关的机制将
对以任何语言编写的监控器性能有非常大的影响。
[22:55] [发表评论]
This program computes Archimedes' constant Pi to arbitrary precision.
It is extremely fast and the precision is only limited by your machine's
main memory.
[22:55] [发表评论]
set locale="zh_CN"
set charset="gb2312"
set send_charset="us-ascii:iso-8859-1:gb2312:utf-8"
charset-hook .* gb2312
charset-hook !utf-8 gb2312
set to_chars=" +TCFL"
set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s"
mailboxes Mailbox sent-mail
set header=no
auto_view text/html application/msword
set pop_user=MyAccount@mail.ustc.edu.cn
set pop_pass="MyPasswd"
set pop_host="pop://email.ustc.edu.cn"
my_hdr From: MyAccount@mail.ustc.edu.cn
在~/.mailcap中添加
application/msword; wvHtml --charset=gb2312 %s - | lynx --dump -stdin; nametemplate=%s. html; copiousoutput #注意:从application到copiousoutput在一行
text/html; lynx --dump %s; nametemplate=%s.html; copiousoutput
为了直接用Mutt看doc文件,需要安装wv以及lynx包
详细配置可以参考这里。
[22:55] [发表评论]
wcalc 命令行科学计算器
wcalc is a command-line calculator designed to accept all valid mathematical
expressions. It supports all standard mathematical operations, parenthesis,
brackets, trigonometric functions, hyperbolic trig functions, logs, and boolean
operators.
If no mathematical expression is given at the commandline, wcalc enters "inter-
active" mode. Interactive mode has more features. Also, files may be piped to
wcalc, and they will be interpreted.
Variables are supported and may be assigned using the = operator. To assign a
variable use the form: foo = anylegalexpression Thereafter, that variable name
is the same as the literal value it represents. Expressions can be stored in
variables like this: foo = 'anylegalexpression' Expressions stored this way will
be interpreted at evaluation time, rather than assignment-time. Note that these
cannot be recursive.
[22:55] [发表评论]
Cluster简介
http://h50069.www5.hp.com/e-Delivery3/forum/WebUI/Messages/ShowTopic.aspx?RID=24cc0b9b-5248-4a51-acc7-1dac201870bf
This Document is prepared for the customer
who is not very clear to the CLUSTER TECHNOLOGY, and ask we What is
Cluster and Why Cluster? You can selectively pick part of this document to answer their questions.
----Andy Song
Cluster简介
什么是Cluster?
Cluster
(群集)是紧密连接的一组计算机,用来持续性地提供高性能的计算服务。把一组计算机连在一起并非难事,但要让它们获得很高的性能就不那么容易了。
Cluster的初衷在于以没有单点故障的体系结构来达到系统的高可用性和可伸缩性,而且要求采用通用标准的计算机,而不是特殊专用的计算机部件,从而能
以较低的成本获得较好的可伸缩性。Cluster中的计算机应当具有非常好的协同性。如果其中一台发生故障,马上就有另一台去接替它的工作,如果一台计算
机的性能不足以完成某项任务,其他的系统成员就会加入进来,共同执行这项任务。应用实践证明,由通用的计算机部件协同工作,完全可能使其运算能力超过大型
主机、超级计算机和容错系统,而且具有更低的成本。
为什么选Cluster?
评估计算机系统体系结构的优劣的确不是一件容易的事。 SMP
(对称多道处理)、FT(容错)、MPP(海量并行处理)和Cluster(群集)以其各自的特色在市场上占有一席之地。MPP以系统的可伸缩性见长,
FT的可用性比较高,而SMP和Cluster的结构在可伸缩性和可用性之间的兼顾与融合使其成为最成熟、适用范围最广的技术方案,在实际应用中可以满足
绝大多数用户的需求。 可用性是指系统正常运行的比例,最高的理论指标值是100%,而常用的表征方法是“9”的数量。例如“3个9”就是指
99.9%的可用性,“4个9”是指99.99%的可用性。一套具有“3个9”的可用性系统,只有0.1%的时间处于不能正常运行的状态。这看起来似乎不
错,但实际上意味着在一年的时间里有9个小时系统不能正常工作。如果能够让这9个小时的停机时间都安排在非业务高峰时段,也许问题并不十分严重。但是如果
一家零售商场的业务系统在圣诞节前意外停机9个小时,那商场业主来说简直无异于一场噩梦。所以说,用户需要更多的“9”。对于不能停顿的关键业务应用,要
达到更高的可用性就应该选择Cluster。因为即使是在最坏的情况下,严重的系统故障在Cluster之中也只会表现为几分钟内系统性能的略微降低,服
务的反应速度稍微慢一点。 近年来,Cluster和RAS(Reliability、Availability和Serviceability)
等相关领域的进步极大地改善了应用系统的可用性,减少了停机时间。Cluster技术越先进,计算部件成员之间配合就越默契,故障部件的接替与切换就更加
平衡。例如多通道I/O特性使存储或网络控制器发生故障的节点可以方便地切换到其他备用控制器上。 在更先进的Cluster技术中,任何部件发生
故障都不会影响到系统的正常运行,甚至是在备用部件或者系统总线发生故障的情况下,计算节点同样可以通过远程方式利用其他节点的存储控制器继续执行自己的
任务。在各个计算节点都正常的情况下,也可以自动均衡所有计算资源上的负载,使整个系统的运行性能达到最佳状态。而且,与分别管理相同数量的独立单机相
比,对于Cluster之中的节点进行管理要容易得多。
真正的Cluster减少系统停机时间,高可用性自然是功不可没。通过将单个
的服务器连接成Cluster,有可能获得3个、4个甚至5个“9”的可用性,但同时又面临着一大堆复杂的技术细节问题--设备驱动程序、磁盘卷标、IP
地址、故障接替路径、服务定义和控制脚本等等。随着Cluster中节点数量的增加,这类问题就会越来越复杂,常常使系统管理员望而生畏。事实上,有不少
用户由于追求可用性而选择Cluster,但又由于系统的复杂性和管理上的困难而导致Cluster远远没有发挥其应有的效益。 所以说,
Cluster要想凭借其高性能、高可用性和高可伸缩性而在当今的商业应用中担当重任,就必须改善自身在部署和维护方面的简便程度,让人们感到它并非高深
莫测。负载平衡、多路故障接替、多通道I/O和管理集中化等功能应当成为操作系统理所应当的普通功能,这才是真正具有实用意义的Cluster。
Alpha主机上的CLUSTER技术
ALPHA主机支持两种CLUSTER技术,即OPENVMS CLUSTER和TRU64 UNIX CLUSTER。TRU64 UNIX CLUSTER是运行在TRU64 UNIX系统上的CLUSTER系统,其功能和特点如下。
COMPAQ
CLUSTER技术用于双机热备份,由两台主机组成一个ASE(Available Server
Environments可用服务器环境),两台主机通过公共的SCSI总线来连接共享磁盘阵列,主机之间则通过网络(ETHERNET,FDDI,
等)传递信息。两台主机各有自己的本地操作系统,而将数据放在共享盘上。可以对共享盘定义磁盘服务,挂在一台主机系统的目录下,另一台主机上看不到它并可
以给ASE中盘服务设置一个IP地址,远端客户可用这个公共的IP地址透明地访问主机系统,不需要知道自己连接的是哪台主机。当共享盘所挂的主机发生故障
时,该节点所运行的应用软件系统如数据库系统等自动被关闭,盘服务便切换到另一台主机上,应用软件系统也重新启动,客户端只需重新连接即可。ASE中的一
台主机始终处于热后备状态,并可以运行其他软件。两台主机可以定义成互为备份模式。
COMPAQ
的TRUCLUSTER可以配置高速的内存通道互连,提供近于SMP的速度,比传统的网络互连方式减少了100倍的信息时延。TRUCLUSTER具有分
布式锁管理(DLM)能力,DLM(Distributed Lock
Manager)同步对共享信息的访问,保证共享数据的完整性,为那些高度并行的应用如OPS(ORACLE PARALLEL
SERVER)提供服务。COMPAQ
的TruCluster技术可以提供双机并行工作方式,即由两台或多台主机组成一个ASE系统,各主机通过公共的SCSI总线连接共享的数据盘,每台主机
都有自己的本地操作系统和本地数据库系统,共享盘上只存放应用数据。正常情况下,每台主机上的数据库并行工作,通过分布式锁管理对共享盘上的数据进行
I/O操作,系统管理员可以根据实际情况人为的将客户分担到每台主机,也可以在ASE中设置一个有公共IP地址的用户自定义登录服务,把客户对数据库的操
作平衡地分布在两台主机上以提高系统性能。
CLUSTER的故障检测方式是用“心跳”机制,通过多种途径用多种协议检测节点是否死机。集群软件能够检测应用故障并采取相应的恢复措施,它支持人工故障恢复,支持故障节点重启动恢复,可以定义故障节点故障恢复后自动成为备份节点或主节点,以接管故障前承担的任务。
TruCluster Server V5.0 UNIX集群软件系统
COMPAQ
电脑公司自1992年推出世界上第一台64位的Alpha服务器及第一个64位的UNIX操作系统Tru64 UNIX(原OSF/1,Digital
UNIX),现已过去7年多了。Alpha服务器系统及Tru64
UNIX操作系统在具有其先进功能的同时,也全面走向成熟。尤其是1999年4月份发布的第五版本Tru64 UNIX V5.0操作系统及Tru
Cluster Server
V5.0集群软件,使COMPAQ公司在64位UNIX计算环境的高可用性,高可靠性,高服务性及资源共享方面达到世界先进水平。很多功能是其它任何
UNIX厂商今天所无法提供的,成为IT行业的一枝独秀。
美国著名的IT公司 Illuminata
Inc发表了题为“Stainless
Steel"即“不锈钢”的研究报告,在报告中说:“虽然COMPAQ公司将其V5.0称为钢,我们认为不锈钢更能表达它在TruCluster
V5.0集群上的实用性,对故障错误的容忍性和实际应用中的优越性。”
1983年,COMPAQ(原DEC)公司成功推出VMS
Cluster集群。16年来,VMS集群的功能一直被IT界做为集群的标准。而且在此之前,没有一个UNIX
厂商的所谓的“UNIX集群”(实际上只是高可用性的故障的切换环境)可以与VMS集群相媲美。然而,TruCluster Server
V5.0集群的发布,从此改变了这一局面,成为目前世界上唯一达到VMS集群水平的UNIX集群环境。
Cluster要想凭借其高性
能、高可用性和高可伸缩性而在当今的商业应用中担当重任,就必须改善自身在部署和维护方面的简便程度,让人们感到它并非高深莫测。负载平衡、多路故障接
替、多通道I/O和管理集中化等功能应当成为操作系统理所应当的普通功能,这才是真正具有实用意义的Cluster。
Tru64 Unix以及其中的TruCluster服务器就是以上述要求为目标进行设计开发的,你会在其中看到多道处理、多线程、磁盘卷管理、日志系统、多通道I/0、扩展TCP/IP联网以及其他许多符合开放标准的新特性。 TruCluster
已经面世多年了,最新的版本仍然沿用了这个名字,但实现方法却截然不同了--Cluster功能已经成为Tru64
Unix之中不可分割的一个核心功能。这就是说,任何一套单独的Tru64
Unix软件,只要安装起来就已经在以Cluster的方式运行了。单一节点的Cluster本身虽然没有什么意义,但它的确使得这种技术一点也不神秘了
-Cluster就在你的系统之中。用户不需要专门对系统任何重新配置,只要把第二套系统以Memory
Channel的方式连接进来,系统中的两个节点就会自动探测和识别对方,并开始以Cluster的方式运行,一套真正的、完整的Cluster就自然而
然地诞生了。虽然系统管理员仍然需要说明网络拓扑结构和其他一些细节,但大多数管理工作都是自动完成的。这就是Tru64Unix的设计理念:“最好的管
理就是不必管理”。
TruCluster Server V5.0有哪些特点?
单一系统形象(SSI:Single System Image) 其它厂商的UNIX集群中,各节点有自己的操作系统,所有的应用,工具,系统设置,系统配置,集群软件的安装……等都需要在每个节点上重复进行。因此随着集群节点数目的增加,集群管理的难度超线性增长,这大大增加了集群管理负担。
而TruCluster
Server
V5.0集群是将一台至八台Alpha服务器由内存通道互连组成的,虽然物理上各节点是独立的,但在逻辑上和管理上,用户看到的是一台大的虚拟机一样。它
们可共享同一个操作系统磁盘,共享任何文件系统,从同一个界面(SMS)管理所有的集群节点。所有的软件,包括操作系统,应用软件,集群软件只需安装一
次,全集群范围内即可运行。它完全达到了单一系统形象的标准。极大地减少了UNIX集群的维护管理负担。它是目前世界上唯一达到此标准的UNIX集群。
集群文件系统(CFS) TruCluster Server
V5.0集群是目前世界上唯一可共享文件系统的UNIX集群。各节点可共享目录,共享所文件系统。这给用户的应用环境带来极大的方便,各节点上的应用可同
时访问同一个文件系统,而保证数据的完整性,一致性。集群文件系统的使用,也使集群范围有统一的安全性,增强了集群的安全性。集群文件系统也改进了高可用
性的概念,它不再是单纯采用“停止故障机器上的服务,卸载相关的文件系统。而是提供了并行服务的机制。如C编译的,Forturm编译的,及ASU软件
等,可在各节点机上并行运行。当一个节点发生故障时,客户端的请示可自动提交到正常机器上,而实现了快速故障切换。
共用Cluster地址 系
统中的任何服务请求都要通过IP地址提交给特定的服务资源。在以往的Cluster系统之中,如果系统管理员要改变其中某些节点的任务,就必须对其中各个
部件的IP地址了如指掌。TurCluster服务器为其中所有的节点提供一个共用地址,服务请求可经由Memory
Channel转变给运行相应服务的节点,负载分配也是由操作系统自动完成的。管理员不再面对众多的IP地址,管理工作显得轻松多了。除了简化负载管理,
TruCluster共用Cluster地址的特性还使负载平衡机制成为系统之中与生俱来的功能,而不像别的系统那样把它作为一个特殊的选件来提供。
集群别名 TruCluster Server V5.0支持集群别名,别名可以用于识别整个集群,或集群的一部分。这样客户机联接时,只需用集群别名来访问整个集群中任何可提供服务的节点,而不必关心究竟是哪个节点提供服务。完全实现了客户端透明的访问。
快速故障切换负载均衡 TruCluster
Server
v5.0集群中提供了三种类型的高可用性的应用环境,一是Single-Instance,二是Multi-Instance,三是Cluster-
aware。Single-Instance应用的高可用性是通过故障切换,重新启动应用实现的。Multi-Instance应用的高可用性是通过不同
节点上并行运行的应用实现的。Cluster-Aware的应用的高可用性,如ORACLE的OPS并行数据库服务器是通过分布式并行运行实现的。在第
二、三两种应用环境下,根据不需要故障切换,而且可负载均衡,增加对客户端的服务响应。
统一的集群管理 TruCluster
Server
V5.0软件为系统管理员提供了Cluster全局视图和完整的控制手段,管理员可以选用自己喜欢的方式来访问系统信息、执行管理系统。可用统一的方式、
统一的平台、统一的界面,在集群各个节点上看同样详细的管理信息和同样的管理功能,来管理集群就象管理单机一样。这也是目前其它UNIX厂商所没有的。
结论 从最简单的双节点故障接替系统到多节点的Cluster系统,用户对于可用性的追求产生了多种不同的体系结构。我们已经看到,先进的Cluster系统具有负载均衡、资源共享、管理集中化和互连性能优化等新特性。 对
于不可间断的业务系统,更高的可用性是必不可少的,但又是不够的。有些用户的Cluster系统应用不够理想,常常是因为缺乏简单、直接的管理使用方法。
如今,康柏已经把更好的解决方案放在您的面前,可伸缩性、可靠性和可管理性已经深深地埴入UNIX的核心,这就是带有TruCluster服务器的Tru
UNIX。选择Tru64 UNIX,真正的Cluster就在你浑然不觉之中与生俱来了。
[22:55] [发表评论]
http://wiki.debian.org/DiskLess
diskless helps an administrator to manage a cluster of client machines running NFS root, that is, which mount their root filesystem from a server at boot time. In most cases, the client machines also NetBoot (load their kernel from the server at boot time), so all you need to do to start a client is set the BIOS to boot from the network, then just turn it on.
This simplifies administration of any cluster of machines, from a DebianBeowulf to a set of user workstations, since all package management can be done right on the server. But it can lead to high network traffic and CPU load and storage requirement on the server.
Scroll down for a description of the package and its NFS management utilities, then a basic HOWTO in "Getting Started".
The Package
This package provides tools for managing NFS images for a cluster. An image is a directory on the server which will serve as the root directory for client machines. Fortunately, most of the files will be shared among all of the machines, so we do not need to create a separate entire image for each machine. Instead, we create a single image with all of the common files, then separate host sub-images with the /etc, /var and /tmp directories for each host. Since the clients share the same Debian packages, we can save further disk space by sharing /var/lib/dpkg as well.
When a client machine boots, it (usually) gets its kernel from the server, which then boots and mounts the main image as its root filesystem. It then runs the /sbin/init command, which in the diskless image is a special script which mounts that machine's /etc, /var and /tmp directories, and the global /var/lib/dpkg. The diskless init script then runs the standard init script, continuing the boot process as usual.
Getting Started
To set up management of "diskless" NFS-root machines:
1. Install the following packages on the server:
diskless
nfs-kernel-server
dhcp, dhcp3-server or rarpd
mknbi+
tftpd+
+ only needed if you want the clients to NetBoot by getting their kernel from the server as well as the NFS root filesystem.
2. Debian no longer ships base.tgz files with the contents of all of the base packages, so you will need to create one using diskless-createbasetgz, e.g.:
% mkdir /tmp/diskless
% mkdir /var/lib/diskless
% mkdir /var/lib/diskless/default
% diskless-createbasetgz /tmp/diskless sarge \
http://http.us.debian.org/debian /var/lib/diskless/default/base.tgz
This downloads from http.us.debian.org all of the Debian packages which make up the base files of the "sarge" (a.k.a. 3.1) release of Debian, installs them into temporary storage space in /tmp/diskless (which must be empty, so don't use /tmp), and creates a compressed tarball base.tgz in directory /var/lib/diskless/default from the scratch storage.
3. Download one of the diskless-image packages to the /var/lib/diskless/default directory, but DO NOT INSTALL IT!
4. Use the diskless-newimage program to create the NFS root image for your client machines from the existing base.tgz and diskless-image-*.deb file, e.g.:
% cd /var/lib/diskless/default (where base.tgz and the diskless-image .deb are)
% diskless-newimage /var/lib/diskless/default/root
In the course of creating the image, you will be asked several questions, which will require that you know the IP adress by which the clients will reach the server, the name server, the mail server (likely localhost since exim is installed), and whether you want to use devfs for the /dev directory of the clients.
5. Install and remove packages from the image, e.g.:
% cp /etc/apt/sources.list /var/lib/diskless/default/root/etc/apt/sources.list
% cp /etc/resolv.conf /var/lib/diskless/default/root/etc/resolv.conf
% cp /etc/kernel-img.conf /var/lib/diskless/default/root/etc/kernel-img.conf
% chroot /var/lib/diskless/default/root
% mount -t proc /proc proc
% dselect
I recommend getting rid of lilo (since it could otherwise corrupt your server's boot record!!) and pcmcia-cs, and adding anacron. This is a convenient time to install any other packages which you know you will want on the clients.
6. Set up the "host" sub-images' /etc, /var and /tmp directories using diskless-newhost, e.g.:
% diskless-newhost /var/lib/diskless/default/root
If 192.168.0.2 is in your /etc/hosts, then the default hostname and mailname will be set according to that file. Note that diskless-newhost can set up a host sub-image, or update an existing one.
If you have UpdateCluster installed, and have populated the cluster.xml file (using update-cluster-add), then you can use the script diskless-rebuild-hosts to create/update all of the host sub-images automatically.
(This script is at http://lyre.mit.edu/~powell/cluster/diskless.updatelist and will be added to the diskless package at some point.)
7. Modify /etc/exports to allow clients to mount the image and their respective /etc, /var and /tmp directories. For example:
#diskless node's root directory
/var/lib/diskless/default/root 10.0.0.0/255.255.255.0(ro)
#diskless nodes directories
/var/lib/diskless/default/10.0.0.2 10.0.0.2(rw,no_root_squash)
/var/lib/diskless/default/10.0.0.3 10.0.0.3(rw,no_root_squash)
/var/lib/diskless/default/10.0.0.4 10.0.0.4(rw,no_root_squash)
With this setup, node 10.0.0.2 will mount /var/lib/diskless/default/root as root, /var/lib/diskless/default/10.0.0.2/var as /var (likewise for /etc and /tmp), then /var/lib/diskless/default/root/var/lib/dpkg as /var/lib/dpkg.
8. Build a client kernel with NFS-root support, or setup a NFSRootInitrd. At a minimum, this means the following options must be set:
Networking options:
CONFIG_IP_PNP=Y (IP: kernel level autoconfiguration)
CONFIG_IP_PNP_DHCP=Y, or _BOOTP or _RARP
File systems:
CONFIG_NFS_FS=Y (NFS file system support)
CONFIG_ROOT_NFS=Y (Root file system on NFS)
Also, make sure the network device is built in (=Y), not a module!
9. Set up DHCP, BOOTP or RARP on the server to give an IP address to the client machines.
10. Boot clients using this kernel, either via floppy, CD, lilo/grub MBR on local hard drive, or NetBoot.
(2005-12-23 16:46:01由fimbulvetr编辑)
[22:55] [发表评论]
http://www.linuxsir.org/bbs/showthread.php?t=35732
TCSH shell不同于其他的shell,因为控制结构更符合程序设计语言的格式.例如TCSH的test条件的控制结构是表达式,而不是linux命令,得到的值是逻辑值true或false,TCSH的表达式与C语言中的表达式基本相同.
一,TCSH shell变量,脚本,参数
用户可以在shell中定义变量,为变量赋值以及引用脚本参数.TCSH使用set,@,setenv定义一变量,也可以用相同的方法定义数值变量和数组,用户通过@命令定义的数值变量来进行算术运算,用户使用圆括号()和方括号[]定义和引用数组.脚本也可以用相同的方法操作,但是有个例外,尽管可以用echo命令输出提示符,但没有read命令处理输入,相反,必须重定向到一个变量里.
二,脚本输入和脚本输出: $ <
用户能够在脚本范围中定义和使用变量.在下例中,使用文本编辑器把赋值操作和echo之类的linux命令放在一个文件中.然后, 可以产生可执行文件并像其他命令一样在命令行中执行它,要记住添加可执行权限,必须使用带u+x参数的chmod命令或者带绝对参数700的chmod命令.在脚本中,可以使用echo命令去输出数据,但是,必须通过重定向标准输入把输入读入变量.在TCSH中没有linux read命令的比较版本.记住TCSH全部的脚本文件的第一行的第一个字符必须是"#"字符.
#display "hello"
set string="hello"
echo The value of string is $string
set命令和重定向符号结合$<将用户输入的任何数据读入标准的输入中.下例中,把用户输入读入string变量中.
%set string=$<
%echo $string
能够把提示符放置到相同的行用作echo的输入.TCSH使用一个特殊的选项-n,将消除输出字符串中的回车符.光标将保留在输出字符串的结尾处.
%echo -n "please enter a string"
%cat hello
echo -n "please enter a string:"
set string=$<
echo "the value of string is $string"
%chmod u+x hello
%hello
please enter a string:hello
the value of string is hello
三,操作符
TCSH有一系列标准的赋值,算术和关系运算以及重定向和后台操作等函数
赋值运算符 功能说明
= 赋值操作
+= 先加再赋值
-= 先减再赋值
*= 先乘再赋值
/= 先除再赋值
%= 取余再赋值
++ 自增量1
-- 自减量1
算术运算符 说明
- 负号
+ 加法
- 减法
* 乘法
/ 除法
% 取余
关系运算符 说明
>= 大于等于
<= 小于等于
!= 不等于
== 等于
重定向和管道符
TCSH支持标准输入和标准输出的重定向和管道操作.如果设置了noclobber特征,要用重定向操作重写当前文件,需要用符号>!代替>
四,控制结构
同其他shell一样,TCSH也有一系列的控制结构控制脚本的命令的执行.while和if控制结构是最常用的控制结构.switch和foreach是更专用的控制结构.switch是if条件的限定形式,检查数值是否等于一系列可能的数值中的一个数值.foreach是循环结构的限定形式.浏览数值列表,给变量赋新的数值.
TCSH不同的控制结构列表:
条件控制结构; 功能
if (expression) then 如果expression为真,则执行commands
commands
endif
if (expression) then 如果expression为真,则执行command1,否则执行
command1 command2.
command2
endif
switch (string) 允许在几条替换命令中选择,string为不同的模式
case pattern:
commands
breaksw
default:
commands
endsw
循环控制结构: 功能
while (expression) 只要expression为真,则重复执行commands,
commands 直到expression为假时跳出循环
foreach variable (argument-list)迭代循环获得和argument-list中一样多的参数
commands (每次循环variable被设置为列表的下一个参数;
end 操作方式同BSH)
TCSH中的控制结构有别于其他的shell,因为它更接近编程语言(C).TCSH的条件表达式的值为true/false.BASH和TCSH主要区别在于TCSH的结构不可重定向或进行管道输出.
五,测试表达式;()
if和while控制结构把表达式用作测试.表达式测试的结果为非零(1)表示真,而零(0)表示假(跟BASH相反).测试表达式可由算术/字符串比较,但是字符串只能作相等和不相等的比较.而且表达式必须要在()括号内.
if (expression) then
command
endif
TCSH有一系列的运算符来分别对字符串进行测试比较.正则表达式可以包含shell脚本的指令的字符串.如:
if ( $var =~[Hh]* ) then #如果变量$var以字母是大写/小写Hh开头,的字符串
echo information #执行命令
endif #结束
有很多测试文件的操作与BASH完全相同.如:
if ( -r myfile ) then #测试myfile是否可读
echo info
endif
测试表达式的基本操作:
字符串比较: 功能
== 是否相等,若相等返回真
!= 是否不等,若不等返回真
=~ 字符串和模式进行测试是否相等(模式为任意正则表达式)
!~ 字符串和模式测试是否不等(模式为任意正则表达式)
文件测试: 功能
-e 测试文件是否存在
-r 测试文件是否可读
-w 测试文件是否可写
-x 测试文件是否可执行
-d 测试文件名是否为目录
-f 测试文件是否为普通文件
-o 测试文件是否被用户所拥有
-z 测试文件是否为空
逻辑运算符: 功能
&& 与运算,两个条件同时蛮族
|| 或运算,有一个条件满足
! 取反
六,TCSH内建命令
1,数字变量:@
在TCSH中,用@命令代替set命令来声明数字变量,然后进行算术,关系和位操作,数字和字符串变量是两个不同的对象,需要用不同的方法管理,不能把set用于数值变量的设置@命令由关键词,变量名,赋值运算符和表达式构成.如:
%@ num=10 #注意空格
%@ sum=2 * ($num + 3)
%echo $sum
2,alias
格式:alias [name[command]]
关键词alias 别名name 引用的命令command
alias list ls
alias list 'ls -l'
3,argv
当脚本被执行时,命令行中的单词被分析并放入argv数组中.argv[0],argv[1]...argv[n],其中argv[0]保存命令名,argv[1]保存命令的第一个参数,argv[n]命令的第n个参数.argv数组元素可缩写元素号码,前面加$.如:$argv[1]写为$1.$argv[*]写为$*.#argv参数标识符包含输入在命令行中的参数号码,可检查$#argv变量.如:
arglist
echo "The number of arguments entered is $#argv"
echo "The list of arguments is : $argv[*]"
%tcsh arglist a b c
The number of arguments entered is 3
The list of arguments is : a b c
argv变量列表:
命令行参数 说明
$argv[0]或$0 命令名
$argv[n]或$n 从1($1-$)开始的第n个命令行参数
$argv[*]或$* 从1开始的所有命令行参数
$#argv或$# 命令行参数的计数
格式:bg [%job]
bg命令把指定的任务放入后台.如果此任务已经停止,则继续执行,如果没有参数,将当前任务放入后台.(详细用法与BASH相同此处略)
5,break
格式:break
break命令用于退出最接近的foreach/while循环过程.执行同一行中其他的命令.
6,breaksw
格式:breaksw
可以从switch语句处中断,在endsw后继续执行.
7,builtins
列出全部shell的内建命令表.
格式:cd [-p][-l][-nl -v][name]
如果给出目录名,此命令把name设置为当前目录,如果命令中没有name,当前目录自动设置成用户主目录.用于name的"-"引用上一级目录,如果参数name没有给出子目录,或不是全路径,或使用./或../引用当前目录及父目录,那么就检查在cdpath shell变量中列出的目录来寻找该目录名.如果此操作失败,将检查shell变量中是否保存着的目录路径名.用-p选项,linux显示目录列表, 用-l,-n,-v选项与用在dirs命令中的选项完全相同.默认选项-p.
9,continue
此命令继续执行最靠近while/foreach语句.当前行其余的命令被执行.
10,dirs
格式:dirs [-l][-n|-v]
dirs -S|-L [filename]
dir -c
如果不带参数,dirs将显示目录列表,列表开头被列在作侧,第一个目录是当前目录.带-l选项,用户主目录中的全部子目录被展开,输入项在到达屏幕边缘时,-n选项隐藏输入项,-v选项显示每一行的输入项入口,-c选项将清除目录列表,-S选项可以把目录列表作为一系列的cd和pushed命令保存在文件中,-L选项可以从指定的文件中将cd和pushed命令读入,该文件包含-S选项所存储的cd和pushed命令.如果没有指定的文件名,将使用赋值到dirsfile shell变量中的文件名.如果没有设置dirsfile,将使用~/.cshdirs,在启动时注册shell将对dirs -L求值,如果设置了savedirs,退出前使用 dirs -S,由于在~/.cshdirs之前,仅仅~/.tcshrc是正常来源,dirsfile应该以~/.tcshrc设置而不是以~/.login设置.
11,echo
格式:echo [-n] word/string
此命令把每个单词或字符串写入shell的标准输出.可设置echostyle shell变量来仿真选项以及BSD的换码序列或者echo的System V版本.
12,eval
格式:eval argument...
此命令把参数作为shell的输入,执行当前shell的上下文中的结果命令,由于分析发声在替换前,所以该命令通常用于执行命令或变量替代所产生的命令.
13,exec
格式:exec command
此命令代替当前的shell执行指定的命令,并退出终端.
14,exit
格式: exit [expression]
shell可以带指定的表达式的值退出,如果没有包含表达式,也可带状态变量值退出.
15,fg
格式:fg [%job...]
把指定的任务带到前台,如果任务在终止状态,在带到前台的同时使他运行.job参数是使用任务号或者下列字符串之一的任务引用:' % + -
16,foreach
格式:foreach variable(list of values)
commands
foreach结构被设置为顺序引用数值列表,它类似BASH shell的for in 结构.foreach结构产生两个操作数:一个变量和一组包含在()中的数值列表.将列表中的值赋值到结构中的变量中.循环体的结尾由语句end构成.下例中脚本list输出由项目和foreach循环读取每一项当前的日期构成的一行信息,列表中的每一项被连续赋值到变量object
set tdate=`date +%D`
foreach object(milk cookies apples cheese)
echo $object $tdate
%tcsh list
milk 04/26/03
cookies 04/26/03
apples 04/26/03
cheese 04/26/03
使用foreach循环有助于管理文件,可以模式中的shell特定字符来产生用作数值列表的文件名列表,然后所产生的文件名列表就成为foreach结构引用的列表.如果在列表中不带任何变量,可以使用命令行参数实现循环.
#set tdate=`date +D%`
foreach object($argv[*])
echo "$object $tdate"
%tcsh list a b c
a 04/26/03
b 04/26/03
c 04/26/03
使用argv[*]特殊参数变量,可以直接引用命令行参数.下例中,当调用shell脚本cbackuparg时,在命令行下输入C程序文件的列表,在foreach循环中,argv[*]引用命令行中的所有参数,将按顺序把各个参数赋值给变量backfile,变量argnum用于引用每个参数.显示参数和backfile的值来说明它们两个是相同的.
cbackuparg
@ argnum=1
foreach backfile ($argv[*])
cp $backfile sourcebak/$backfile
echo "$backfile $argv[$argnum]"
@ argnum=$argnum+1
%cbackuparg main.c lib.c io.c
main.c main.c
lib.c lib.c
io.c io.c
17,history
history [-hr][n]
history -S|-L|M [filename]
history -c如果history没有任何参数,将显示开行号的历史命令列表.用作参数的号码将列出行的最后号码.如果没有任何选项参数,她将用作历史文件名;否则,将使用hisfile变量值.
用-h选项,将以注释的形式显示不带行号的历史文件列表
用-r选项,将反向显示,以最近的列表开始
用-c选项,则清除历史列表
如果用-S选项,可以把历史列表存入文件,如果savehist shell变量的第一个单词被设置为数值,历史文件将被保存为最大的行数,如果第二单词为'merge',历史列表将被合并到当前的历史文件中,而不替代历史列表,时间图章排序历史列表.
如果用-L选项,shell将从存储的历史列表文件中读取历史列表并把她追加到当前历史列表中.
如果用-M选项,将从历史文件读取历史列表信息,但用当前历史列表信息合并,排序历史列表.
如果没有用这些选项给出文件名,那么,就使用赋值到histfile shell变量的文件名,如果没有设置histfile,就使用~/.history.
18,hup
hup [command]
如果带有括起来的command参数,hup运行command,根据停机信号退出.当shell退出时,hup安排shell发出停机信号.注意:命令也许设置自己的停机响应,重写hup,如果没有参数(只有在shell脚本中才允许),hup使shell根据脚本的余项的停机信号退出.
19,if-then
if (expression) then
command
endif
if-then结构把条件放入几个linux命令,该条件是expression,如果expression得出非零的数值,那么expression为真,执行if结构内的命令,如果expression得出零值那么expression为假,就不执行if结构内的命令.
if-then结构以if关键词开始,expression表达式用()括起来,关键词then后可以跟任意数量的linux命令,以关键词endif结束if命令.注意:在TCSH中,if (expressiong)和then必须在同一行!
echo -n "Please enter option:"
set option=$<
if ($option=="s") then
echo List files by size
ls -s
endif
%tcsh ifls
Please enter option: S
List files by size
total 2
1 monday 2 today
20,if-then-else
if (expressiong) then
command
command
endif
用户需要经常需要根据expression是真还是假来进行选择.关键词else允许if结构在两者之间选择,如果expression为真,那么执行第一个command,否则,执行第二个就是else后面的command.
elsels
echo Enter s to list file sizes
echo otherwise all file information is listed
echo -n "please enter option:"
set option=$<
if ($option=="s") then
ls -s
ls -l
endif
echo Good-bey
(结果略)
21,jobs
jobs [-l]
此命令列出所有活动的任务,如果带-l选项,将列出进程号,以及正常的信息.
22,kill
kill [-signal] %job\pid...
kill -l
此命令用于终止进程或者任务,如果带-signal选项,应该指定要发送的信号,默认发送的信号是SIGTERM,如果带有-l选项,则列出信号名,对于带-l选项提供的信号数,将列出与其相关的信号名.
23,logout
此命令用于终止注册shell,如果设置了ignoreeof,它将非常有用.
24,nice
nice [+ number][command]
此命令设置shell调整优先为number,如果没有设置number,调整优先设置为4,带有指定的command,nice适当的优先运行command,number值越大,进程获得的CPU的时间就越少.
25,nohup
nohup [command]
如果不带command参数,nohup指示shell忽略任何停机信号,如果带command参数,将执行此命令并忽略执行中的任何停机信号.
26,notify
格式:notify [%job...]
Linux执行命令后,如果有后台任务在执行,系统将通知到目前为止已经完成的后台任务,该系统不会中断如编辑这样的操作来通知用户关于完成的任务,当某任务完成时,如果想马上知道,无论系统在作什么,可以使用notify命令指令系统通知用户,它的参数作为任务号,当任务完成时,系统将中断当前命令并通知用户任务已经完成,如:
%notify %2
当2号任务完成时,告诉系统通知用户.
27,onintr
格式 onintr [-|label]
此命令控制shell在中断时的动作,不带任何参数,将回复shell中断默认的动作,将终止shell脚本或返回输入级的终止符,如果带-参数,则忽略全部的中断,当接受中断或当子进程终止时,带label的命令将使shell执行goto标号.
28.popd
格式 popd [-p][-l][-n|-v][+n]
此命令从目录列表中删除一个目录,不带参数的命令从列表中删除顶层目录,+n删除从左起的第n层的目录.然后popd显示最终的目录列表.pushdsilent shell变量可以设置为支持此特性,-p选项可以重写pushdsilent.
29.printenv
printenv [name]
此命令显示环境变量的名和值,如果带name参数,仅仅显示环境变量name的值.
30.pushd
pushd [-p][-l][-n|-v][name|+n]
此命令把目录添加到存储的目录列表中,然后显示目录列表,如不带参数,除非目录为空,pushd交换顶层的两个目录,并返回0.+n旋转列表以便使第n个目录(从左起)列与顶端,但是,如果设置了dextract,pushd +n将展开第n个目录,把它压入堆栈顶层.-n旋转堆栈以便第n个目录(从右起)列于顶端,dir把dir添加到顶端的目录列表,使它成为新的当前目录.如果设置了pushtohome,不带参数的pushd命令执行pushd ~的功能,像cd的功能一样,如果dunique被设置,pushd在压入堆栈之前从堆栈中删除任何的name历程,可以设置pushdsilent shell变量来取消目录列表的显示,然后可以使用-p选项重写pushdsilent.
31,repeat
repeat count command
此命令重复执行command指定的次数count.
32,set
set name ...
set name = value ...
set name = (wordlist)...
set name[index] = word ...
set -r
set -r name ...
set -r name = value ...
set -r name = (wordlist) ...
不带任何参数的set命令将显示全部的shell变量值,包含许多单词的变量作为放在括号中的词列出,带name参数的set命令定义一个变量并为它赋值null串,带有name和=符号分隔的值,set定义变量并给它赋值,要把wordlist作为值赋值给name变量,把列表中的词作为要赋的值放在括号中,为了将数值赋值给数组元素,,使用方括号[]指定元素的index,但是该元素必须已经存在.
-r选项常用于引用只读变量,仅仅带-r选项的set命令将列出只读变量,与变量名一起使用,set将使此变量设置为只读,与赋值的变量一起使用,将初始化该变量,并使该变量成为不能被修改的只读变量.在TCSH中,用户必须在使用变量之前首先声明它,使用加变量名的set命令声明变量.
变量名可以是任何字母字符包括下划线_,也可以含有数字,但是变量名不能以数字为首字符!
33,setenv
setenv [name[value]]
setenv常用于定义有特定值的环境变量.如没有带value选项,setenv设置name变量为null串,如果没有带任何参数,将显示全部环境变量的名称和值.TCSH有两种类型的变量:局部变量和环境变量.局域变量是在shell内部声明的;环境变量是全局域的变量.使用setenv可以定义环境变量,使用setenv命令,变量名,以及被赋值的值,就可给环境变量赋值.其中,没有赋值运算符,如:
%setenv greeting hello
greeting环境变量被赋值为hello
无论何时调用shell脚本,都将产生自己的shell,如果shell脚本被另外一个shell脚本执行,它将使自己的shell从第一脚本的shell中分离.现在有两个shell,属于第一个脚本的父shell和当执行第二个脚本是产生的子shell.在其他的shell内部执行脚本时,这个shell是第一个脚本的子shell,原来的脚本的shell是它的父shell.每个shell都拥有自己的变量,子shell不能引用父shell中的局域变量,但是能引用环境变量.子shell可以引用父shell中声明的任何环境变量.
34,shift
shift [variable]
没有参数的shift命令向左移动argv数值,即argv[1]的数值被argv[2]所代替,如果argv没有被设置或者数值少于一个词时将发声错误.带有其数值为列表或数组的variable,该命令将列表和数组的数值向左移动.
35,source
source [-h] name [argument...]
source读出并执行以name命名的命令,通常是shell脚本(不能把这些命令放在历史列表中).把任何参数输入argv中.用-h选项,命令被放入历史列表但是不立即执行.
36.stop
stop %job\ job...
stop命令停止指定的任务或在后台执行的进程.也可以用一个数字或字符串引用一个任务,如果不存在默认的任务,那么仅仅stop不能停止当前的任务.
37,switch
switch (test-string)
case pattern:
commands
breaksw
case pattern:
commands
breaksw
default:
commands
breaksw
endsw
switch结构在几个可能的选项中进行选择.此结构与BASH中的case结构非常类似通过把字符串与几个可能的模式进行选择,每个可能的模式都与一系列命令相关联,如果没有相匹配的项,则执行相关的命令,.switch结构以关键词switch和放在圆括号中的test-string开始,字符串常由变量求值导出,然后是一系列的模式,每个模式pattern前是关键词case,以冒号:结束,冒号后列出与选择有关的commands,以breaksw终止command,在所有被列出的模式之后,关键词endsw结束switch结构,注意,每个测试表达式的命令组的最后一个命令是breaksw,每个测试表达式被逐一测试,直到找到相匹配的内容,如果没有找到相匹配的项,则执行默认项default.用关键词
default表示默认选择,default项是可选的.但是它有助于通知用户没有匹配的测试字符串.举例:
lschoice
echo s.List sizes
echo l.List files infomation
echo c.List C files
echo -n "Please enter choice:"
set choice=$<
switch ($choice)
case s:
ls -s
breaksw
case l:
ls -l
breaksw
case c:
ls *.c
breaksw
default:
echo Invalid Option
breaksw
endsw
(输出略)
38,time
time [command]
如果没有参数,此命令显示当前shell的时间累计,用一条命令作为参数,它执行命令并显示时间累计.
39,umask
umask [value]
此命令指定用户文件建立掩码,掩码用八进制表示.
40,unalias
unalias pattern
此命令删除其名称与pattern匹配的所有别名.
41,unset
格式:unset pattern
此命令取消定义shell变量,名称可能是匹配了几个变量的pattern(尽量避免用unset *,因为它将取消所有的变量)
42,unsetenv
unsetenv pattern
此命令取消定义环境变量,名称可能是匹配几个变量的pattern,也尽量避免用unsetenv *,因为它将删除所有的环境变量.
43,wait
此命令指示shell等待全部的后台任务的完成,在一个交互的shell环境中,可中断一个wait操作,并显示剩余的任务.
44,where
格式:where command
此命令报告所有已知的命令历程,包括别名,内建和可执行的路径.
45,which
which command
此命令显示shell要执行的指定的任务.
46,while
while(expression)
command
此循环重复执行命令,以关键词while开始,接着是圆括号括起来的表达式expression以end结束循环.
while循环很容易与switch结构结合,构成菜单的驱动程序.举例:
lschoicesw
set again=yes
while ($again==yes)
echo "1.List sizes"
echo "2.List files information"
echo "3.List C files"
echo "4.Quit"
echo -n "Please enter choice:"
set choice=$<
switch ($choice)
case 1:
ls -s
breaksw
case 2:
ls -l
breaksw
case 3:
ls *.c
breaksw
case 4:
set again=no
echo good-bey
breaksw
default:
echo Invalid Option
endsw
(输出略)
TCSH配置
TCSHshell可以使用户使用shell配置变量和特征配置自己的shell.也可以使用set命令设置特征.TCSH也有注册,注消以及何时进入TCSHshell的配置文件.
一,TCSH shell 特征
TCSH有几个特征,允许控制不同的shell操作的方法.TCSH shell特征不仅包括许多它自己的特征,而且还包括KSH/BASH shell中的特征,如,TCSH中有一个noclobber,防止重定向重写文件,,一些更常用的特征为:echo,noclobber,ignoreeof和noglob.
通过定义和取消定义与该特性相关的变量,打开/关闭TCSH shell特征,为每个特征命名变量.例如,通过定义noclobber变量,打开noclobber特征.使用set命令定义变量,而使用unset命令取消定义变量.为了运行noclobber特征,使用set noclobber,为了关闭它,使用unset noclobber.如:
set variable 定义变量
unset variable 取消变量
由于这些变量常用于打开/关闭特征,所以有时也被叫做双态切换.
1,echo
在echo被执行之前,设置echo启动显示命令的特征.
set echo 打开echo特征
unset echo 关闭echo特征
2,ignoreeof
设置ignoreeof启动防止用户使用CTRL+D注消用户shell的特征,它用于防止突发性的注消操作,如果此特征关闭,可以用CTRL+D注消过程.由于在标准输入中CTRL+D是结束用户输入的操作,所以很容易造成突发注消shell进程.因此,ignoreeof特征就能防止这种突发的注消,当此特征被设置后,用户必须用logout命令明确注消.
3,noclobber
设置noclobber启动预防现有文件不被重定向输出的特征,借助此特征,如果把输出重定向到已经存在的文件中,就不用标准的输出重写文件.原文件被保存.也许会发生这种情况:把现有文件名用作保存被重定向的输入的文件名.因此,noclobber特征使用户不会意外的重写原文件.
%set noclobber
%cat oldfile > newfile
newfile: file exist
有时,用户想用重定向输出重写某个文件,那么就可在重定向符号操作符之后放置惊叹号!实现重写操作.这将重写noclobber特性,用标准的输出代替文件内容.
%cat oldfile >!newfile
4,noglob
设置noglob使某特性有效,该特征禁止用户shell中的某些字符.字符 * ? [ ] ~将不再扩展为匹配的文件名.如:
%set noglob
%ls myfile?*
myfile?*
附录:常用的TCSH shell特征:
特征 功能
set 打开shell特征
unset 关闭shell特征
echo 执行命令前显示该命令
ignoreeof 禁止用CTRL+D注消
noclobber 不必通过重新定向重写文件
noglob 禁止特殊字符用于文件名扩展:* ? ~ [ ]
notify 当完成后台任务时立即通知用户
verbose 历史命令引用后显示命令
二,TCSH shell变量
正如在BASH shell中一样,也可在TCSH shell中使用特殊shell变量来匹配自己的系统.一些变量在系统初始化中定义,也可以在shell中用新的值重新定义变量,有些必须在系统初始化时定义,如最常用的特殊变量prompt变量,它允许建立自己的命令行提示符
另外一个是history变量,该变量确定保存了多少历史命令/事件. 在TCSH shell中,许多特殊变量的名称与函数都与BASH/ZSH shell中的变量名称和函数类似.一些必须用大写表示,但是大多数用小写表示.某些特殊变量起类似的作用,但是具有完全不同的实现方法,如mail变量保存的信息与BASH shell的MAIL,MAILPATH,MAILCHECK变量保存的信息完全相同.
1,prompt prompt2 prompt3
这三个变量为命令行保存提示符.用户可以设置自己想要的符号/字符串作为提示符.为了设置命令行提示符,可以用
%set prompt="+"
这样提示符就变成了+号.也可以使用预定义的一组代码使得配置提示符更容易,在每个代码前加个%号,例如,用%/表示当前的工作目录,%t表示时间,%n表示用户名,%!表示下一个历史事件的号码,如:
%set prompt="%/"
/home/dirname
代码列表:
代码 说明
%/ 当前运行目录
%h,%!,! 当前历史号码
%t 当天时间
%n 用户名称
%d 日期
%w 当前月份
%y 当前年份
当命令分为若干行输入时,变量prompt2被用于特殊情况,为需要输入改命令而增加的行显示prompt2,prompt3提示符用于检查拼写特征是否被激活.
2,cdpath
cdpath变量保持目录的路径名,用cd搜索特定的子目录,这些路径名形成一个数组,就像赋值给TCSH shell的path变量的路径名数组一样,注意在路径名之间要求有空格.
%set cdpath=(/usr/bin /var/bin /home/username)
3,history和savehist
正如前面了解的那样,history变量常用于确定要保存的历史事件的数量,只需给该变量赋值history应该记录的事件的最大的数值.当达到最大值时,计数器从1开始.但是当注消时,savehist变量保存存储在.history文件中事件的数量,当再次注册时,这些事件
就成为初始化历史事件.如:
%set history=20
%set savehist=5
当注册时,历史列表中将记录20个事件,但是当注消后,仅仅最后5个事件被保存在.history文件中,下一次注册时,历史列表将由以前的最后5个命令组成.
4,mail
在TCSH shell中,mail变量综合了BASH和ZSH shell中的MAIL,MAILCHECK,MAILPATH变量的特征.TCSH shell mail变量值是一个数组,该数组的元素既包括检查电子邮件的时间间隔,又包括检查电子邮箱文件的路径.要给这些元素赋值,可以把赋值的数组赋值给mail变量,用圆括号括起来,空格分割的一系列指定数组的新值.第一个值是再次检查电子邮件前设置等待的秒数,它类似BASH shell的MAILCHECK变量保存的数组.其余的值由电子邮箱文件的路径构成,检查该文件获取邮件.注意,这些变量保存了BASH和ZSH shell MAIL,MAILPATH变量的功能. 如:
%set mail ( 1200 /usr/mail/user)
mail变量被设置成每1200秒检查一次电子邮件,被检查的电子邮箱文件在/usr/mail/user目录中.
%set mail (1200 /usr/mail/user /home/userdir)
也可以容易的给mail数组添加更多的邮箱文件路径,注意每个元素之间的空格.
附常用的TCSH shell配置变量:
变量 说明
home 用户主目录的路径名
user 注册名
pwd 当前运行目录的路径名
shell 用于注册过程的程序路径名
prompt 主提示符
path 目录路径名列表,搜寻目录获取可执行命令
mail mail实用程序检查该变量来获取接受信息的邮件文件名
cdpath cd命令搜索该变量获取子目录的目录路径名
history 历史列表中命令数量
savehist 为下一个注册存储历史列表中的命令数量
EXINIT EX/vi编辑器的初始化命令
TERM 终端名
三,TCSH shell初始化文件
TCSH shell有3个初始化文件: .login .tcshrc .logout,.login文件是每次注册时执行的注册初始化文件, .tcshrc文件是每次进入TCSH shell时执行的shell初始化文件, 该文件在注册时执行或者用tcsh命令直接从另一个shell进入TCSH shell时执行,每次注消时执行.logout文件
1, .login
TCSH shell有自己注册初始化login,该文件用于配置用户shell的shell命令和特殊变量定义, .login文件相当于BASH和ZSH shell中使用的.profile文件..login文件包含setenv命令,给TERM之类的特殊环境变量赋值,可以用任何标准的编辑器编辑它,改变这些值,也可添加新的值.但是要记住:在TCSH shell中,为环境变量赋值的命令是setenv,如:
%setenv EXINIT 'set nu ai'
定义EXINIT变量并设置vi编辑器行计数和自动缩排的功能.
当编辑.login文件时要十分小心,不经意的编辑可能造成错误的变量设置或者根本没有设置变量,因此,编辑之前最好备份.login文件.如果更改了.login文件,想让这些变化在当前注册期间生效,需要使用source命令重新执行该文件,source命令实际上可执行任何初始化文件,其中包括.tcshrc文件和.logout文件,如:
%source .login
2, .tcshrc
每当进入TCSH shell或产生任何子shell时,就执行.tcshrc初始化文件,如果TCSHshell是用户注册的shell,那么当用户注册时, .tcshrc文件和.login文件一起运行,如果从另外一个shell进入TCSH shell, .tcshrc文件被自动执行,文件中包含的变量和别名被定义.
实际上,每当产生一个shell时,如运行shell脚本,就执行.tcshrc文件,也就是说,每当创建一个shell时,就执行.tcshrc文件,这允许在.tcshrc中定义局部变量,在某种意义上说,局部变量可以进入任何子shell,即时像history这样的用户定义的变量也是局部变量,但要为每个产生的子shell定义特殊变量,这样,为每个子shell变量设置history,但是,每个子shell都有自己的局部history变量,用户甚至可在不影响其他子shell的变量的情况下改变一个子shell的局部history变量,在shell初始化文件中定义特殊变量可以看做是BASH shell导出变量,在BASH shell和ZSH shell中的导出变量只把自己的拷贝传送给子shell,改变拷贝不会影响原始定义..tchsrc文件也可包含别名变量和用于打开shell特征的特征变量,别名变量和特征变量是局部变量,限定于shell内部.但是.tcshrc文件在每个shell中都将定义这些变量.因此, .tcshrc文件通常保存各种命令定义的别名,如:
.tcshrc
set shell=/usr/bin/csh
set path=$PATH (/bin /usr/bin .)
set cdpath=(/home/dirname/filename /home/dirname/files)
set prompt="!$pwd>"
set history=20
set ignoreeof
set noclobber
alias rm 'rm -i'
alias mv 'mv -i'
alias cp 'cp -i'
与环境变量不同,局部变量用set命令定义,在.tcshrc文件中的局部变量应该使用set命令定义,用setenv命令定义的环境变量是放在.login文件中的,请记住:当改变path或cdpath的路径名时,数组中包含这些路径名,数组中的每个元素要用空格分开,如果添加新的路径名时,必须保证用空格把它和其他的路径名分开.如果已经改变了.tcshrc文件,希望这些变化在当前注册中立即生效,别忘了用source命令重复执行.tcshrc文件.
3, .logout
.logout文件也是初始化文件,只不过它在注消时执行,用户可以设置.logout文件以使其完成任何在注消时想要完成的操作,文件中没有定义变量,常包括关闭进程的shell命令.可以向.logout文件中添加自己的shell命令,如:
.logout
clear
echo "Good-bye..."
现在关于BASH的资料,在网上很多,我(KornLee)一直没有找到关于TCSH编程的入门资料,因此,特从我的书中摘抄下来,终于打完啦~~,请喜欢tcsh编程的兄弟们多提意见,:)
[22:55] [发表评论]
Qalculate!
一个功能非常强大的计算器,不仅仅是计算器,竟然可以解决二元方程、积分、调用gnuplot绘图、携带元素周期表、科学常数等,比以前喜欢的rcalc更加强大多了!还有一个命令行下的版本qalc,但没这个强大。
Debian自带此包: apt-get install qalculate即可
参看更多抓图
Qalculate! is not your regular software replication of the cheapest available calculator. Qalculate! aims to make full use of the superior interface, power and flexibility of modern computers.
The center of attention in Qalculate! is the expression entry, Instead of entering each number in a mathematical expression separately, you can directly write the whole expression and later modify it. Just enter an expression as you would write it on paper, press Enter and voila!
The interpretation of expressions is flexible and fault tolerant, and if you nevertheless do something wrong, Qalculate! will tell you so. Not fully solvable expressions are however not errors. Qalculate! will simplify as far as it can and answer with an expression.
In addition to numbers and arithmetic operators, an expression may contain any combination of variables, units, and functions. These are immediately accessible from the user interface — the menu bar, the managers, the calculator keypad, and automatic completion.
Qalculate! also has some special tools to increase your efficiency, including a number base conversion dialog and a simple plotting interface.
Although use of Qalculate! for simple calculations should be natural and self-explanatory, reading the rest of the manual can help you maximize your productivity and discover some maybe unexpected features. More advanced users should read on and discover a large number of customization options and the ability to create and modify your own variables, functions and units directly from the user interface.
[22:55] [发表评论]
编写并行程序:多语言指南介绍
http://softwarecommunity-zho.intel.com/articles/zho/1252.htm?cid=sw:prccsd111
编写并行程序:多语言指南介绍
发布日期: 2007年4月12日 | 最后修改日期: 2008年1月8日
并行编程曾一度是顶级编程人员面临大型超级计算问题困扰时的唯一关注点。但是,随着面向主流应用的多核处理器的出现,并行编程现已成为所有专业软件开发人员都必须了解和掌握的一项技术。
并行编程也许会很难,但事实上,它只是“不一样”而已,并非“很难”。它不仅具有更为传统的串行编程的所有特点,还包含三个定义完备的附加步骤:
识别并发:分析问题,以识别能够同时执行的任务。
揭露并发:重新构建一个问题,确保高效完成任务。此步骤通常需要确定任务本身与组织源代码之间的依赖程度,以便任务得到高效管理。
表达并发:在源代码中使用并行编程符号来表示并行算法。
以上的每一步都很重要。前两步在最近一本关于并行编程设计模式的书中有详细介绍 [mattson05]。本文将重点介绍第三步:在源代码中使用并行编程符号来表示并行算法。这种符号可以是并行编程语言,也可以是通过程序库界面实施的应用编程接口 (API),或是添加到现有序列语言的语言扩展。
选择一种独特的并行编程符号绝非易事。这些符号的学习难度参差不齐,而且极其耗时。因此,掌握几种符号并从中选择一种进行运用的做法是不切实际的。编程人员所需的是一种能够充分详细地了解不同符号的“优势”,以及各项高级特征的快捷方法,以便明智地决定学习哪种符号。
在本文中,我们将对几种不同的并行编程符号进行高度全面概述,重点介绍其主要使用方法,并对它们的特殊优势和缺陷进行分析。我们将具体介绍以下几种符号:
OpenMP:针对简单并行编程的编译器指示
MPI:支持超高性能便携性的程序库例程
Java:基于领先对象的编程语言并行
为了使我们的讨论尽可能地具体详实,我们在每种情况下都部署了一款知名的 π 程序的并行版本。这是一种利用梯形法则(其中被积函数和积分极限被选中)来运算的简单数值积分,因此从数学角度讲,正确的答案为 π。很多人都将它视为并行编程中最为基本的程序。在本文最后,我们还将简单介绍如何选择一款并行编程符号来使用并掌握。
π 程序:并行梯形积分
在微积分研究中,我们了解到一个积分在几何上可以表示为曲线下面积。也就是说,积分的近似值可以通过计算得出。我们先将积分面积划分为许多的梯级,并在每一梯级内画出一个矩形,并让它的高等于该梯级中心的被积函数值。那么这样,每个矩形面积的和就约等于该积分。
如图 1所示:梯形积分----每一竖条都拥有固定宽度的“梯级”。每个竖条的高度便是被积函数的值。将所有竖条的面积加在一起便得出曲线下面积的近似值,即被积函数的值。
我们可以选择一个被积函数及积分极限,那么该积分在数值上便等于 π。这样便可更加直接地进行程序正确性检验。下面我们向您展示了一个执行该算法的简单的 C 程序:
static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=0;i<= num_steps; i++){ x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; }
OpenMP
OpenMP [omp] 是一款为共享内存计算机来编写并行应用程序的行业标准 API。OpenMP 的主要目的,是使高性能计算中常见的循环导向型程序更加易于编写。OpenMP 中的各种结构可支持 SPMD、Master worker、管线,以及大多数其他并行算法 [Mattson05]。
OpenMP 是一款非常成功的并行语言。市面上每款共享内存计算机均支持它的运行。最近,英特尔在 OpenMP 上创建了一个变量,从而实现了对集群的支持。OpenMP 还能逐步添加并行的编程方式,因此现有的顺序程序可发展为并行程序。但是,这一优势却也成了OpenMP 的最大缺陷。那是因为通过使用逐步并行,编程人员可能会错过某一程序的大规模重建,从而失去获得最大性能的机会。
OpenMP 的标准仍在不断演进。为此,一家名为“OpenMP 体系结构评审委员会 (OpenMP Architecture Review Board)”的行业团体定期举行会晤,共同开发该语言的全新扩展。OpenMP 的下一版本(3.0 版)将包含一种任务队列能力。这将支持 OpenMP 处理更广泛的控制结构,以及更多的一般递归算法。
OpenMP 简介
OpenMP 基于 fork-join 的编程模式而设计。OpenMP 程序起初以一条单线程的形式开始运行。如果编程人员希望在程序中利用并行,那么就需将额外的线程进行分支,以创建线程组。这些线程在称为“并行区域”的代码区域内并行执行。在并行区域末尾,将等待所有线程全部完成工作,并将其重新结合在一起。那时,最初线程或“主”线程将继续执行,直至遇到下一个并行区域(或程序结束)。
OpenMP 的语言结构根据编译器指示而定义,可为编译器布置任务,以实施理想的并行。在 C 和 C++ 中,这些指示根据制导语句来定义。
OpenMP 制导语句在任何情况下的形式都相同
#pragma omp construct_name one_or_more_clauses
其中“construct_name”规定了编程人员希望执行的并行动作,而“clauses”则对该动作进行修改,或对线程所见的数据环境进行控制。
OpenMP 是一种显式的并行编程语言。一旦线程创建,或者工作已经映射到该线程上,那么编程人员必须对希望执行的动作加以详述。因此,即使是 OpenMP 这样简单的 API 也有诸多结构和子句需要编程人员学习。所幸的是,仅利用整个 OpenMP 语言的一小部分子集,便可完成大量上述工作。
可利用“parallel”结构在 OpenMP 中创建线程。
#pragma omp parallel { …. A block of statements }
独自使用时(没有修改任何子句),程序可创建出一系列线程供运行时环境选择(这些线程通常与处理器或内核的数量相等)。每条线程都将根据并行制导语句来执行语句块。该语句块可以是 C 中的任意合法语句组,但是唯一例外的是:您不能分支到并行语句块之中或之外。您只要稍微思考一下就能明白。如果线程要全面执行语句组,并且该程序的继发行为还要有意义,那么您便不能随意将线程分支到并行区域内的结构之中或之外。这是 OpenMP 的一项公共约束。我们将这种缺乏某些分支的语句块称为“结构块”。
您可以令所有线程执行相同的语句,从而进行大量的并行编程。但是要体验 OpenMP 的全部功能,我们要做的就不止这些。我们需要在多条线程之间共享执行语句集的工作。我们将这种方式称为“工作共享”。最常见的工作分享结构是循环结构,在 C 中即为“for”循环
#pragma omp for
但是,这一结构仅对具有规范形式的简单循环起作用
for(i=lower_limit; i<upper_limit; inc_exp)
“for”结构执行循环的迭代,并将其打包至那些利用并行结构创建的早期线程组中。循环极限和循环索引 (inc_exp) 的递增表达式需在编译时完全确定,并且这些符号中使用的任何恒量都必须在线程组中保持相同。您只要思考一下就能明白。系统需要得出循环的迭代数量,然后将其映射到能够分发至线程组的集上。如果所有线程均计算相同的索引集,那么上述工作只有通过持续稳定的方式才能实现。
请注意,“for”结构并不能创建线程,您只能借助并行结构来做到这点。为了简捷起见,您可以将并行结构和“for”结构放在一个制导语句中。
#pragma omp parallel for
此举可创建一个线程组,以便执行紧随其后的循环迭代。
该循环迭代必须是独立的,因此不论迭代的执行顺序如何,或是究竟由哪些线程执行循环的哪些迭代部分,循环结果都将相同。如果一条线程写入变量,另一条线程读取变量,那么将产生循环传递相关性 (loop-carried dependence),程序也将生成错误的结果。编程人员必须仔细分析循环体,以确保没有任何循环传递相关性的发生。在很多情况下,循环传递相关性来源于保存中间结果(用于指定的循环迭代)的变量。在此情况下,您可以通过声明每条线程都将具有自己的变量值,以除去循环传递相关性。这可通过私有子句来实现。例如,如果循环使用名为“tmp”的变量来保存临时值,那么您可将以下子句添加到 OpenMP 结构中,这样它便可用于循环体内部,而不会造成任何循环传递相关性。
private(tmp)
另一种常见情况是循环内出现变量,并用于从每个迭代中累积数值。例如,您可以利用循环将某项计算的所有结果进行求和,得出一个数值。这在并行编程中十分常见,通常被称为“规约”。在 OpenMP 中,我们的规约子句表示为
reduction(+:sum)
同私有子句一样,该子句可添加到 OpenMP 结构中,用以提示编译器等待规约。这时,程序便会创建一个临时私有变量,以便为每条线程计算累积操作的部分结果。当该结构运行到最后时,每条线程的值将结合起来产生最终答案。用于该规约的操作在子句中同样进行了详细说明。在这种情况下,此操作为“+”。根据对遭受质疑的数学操作进行特性识别,OpenMP可定义用于规约的私有变量值。例如,对于“+”来说,该值为零。
当然,OpenMP 还有更为复杂的情况,但是借助这两个结构和两个子句,我们便能够解释如何并行 π 程序。
OpenMP π 程序
为了简单起见,我们将统一规范所需的步骤,并且只使用默认数量的线程进行工作。在串行 π 程序中,还有一个需要并行的单循环。除因变量“x”和累积变量“sum”之外,该循环的迭代完全独立。请注意,“x”在此用于计算一个循环迭代内的临时存储。因此,我们可以通过一个私有子句将该变量定位到每条线程,以便对其进行处理
private(x)
从技术层面上讲,循环控制索引可创建一个循环传递相关性。但是,OpenMP 却认为该循环控制索引需要定位到每条线程之中,以使其自动实现对所有线程的私有化。
累积变量“sum”用于计算总和。这是一个经典规约,因此我们可以使用规约子句:
reduction(+:sum)
将这些子句添加到“parallel for”结构中,我们便借助 OpenMP 完成了 π 程序的并行。
#include <omp.h> static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; #pragma omp parallel for private(x) reduction(+:sum) for (i=0;i<= num_steps; i++){ x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; }
请注意,我们的 OpenMP 中同样包括标准的 include file
#include <omp.h>
这规定了编程人员有时需要的 OpenMP 类型和运行时程序库例程。请注意,在此程序中,我们虽没有利用该语言的这些特性,但是将 OpenMP include file 包括在内却是一个很好的想法,以避免日后在程序需要时进行修改。
MPI,或者讯息传递界面(Message Passing Interface)是我们当今使用的一种最久的并行编程 API。MPI 程序作为一系列独立进程,主要通过收发讯息实现互动。MPI 的一大优势便是它只占用并行计算机中的极少部分硬件。它的唯一要求,便是处理器或内核共享同一简单网络,从而在任何进程组间充分地路由讯息。这也支持 MPI 在任何通用并行系统上运行----不论从对称多处理器到分布内存,还是从大规模并行超级计算机到各种集群。
MPI 诞生于 20 世纪 90 年代早期,那时集群刚刚兴起,大规模并行处理器(MPP)占据着高性能计算的大壁江山。每个 MPP 厂商都有自己的讯息传递符号。厂商很乐意看到这种状况,因为这样可以将用户锁定在自己的产品线内,但这却让编程人员大伤脑筋。因为软件的寿命远比硬件要长。再者,由于没有一种可移植性符号,所以,每次在研发新电脑时,应用编程人员都不得不将其软件从一种讯息传递符号转换为另一种,耗费了大量精力。
MPI 并不是第一款可移植性讯息传递库,但却是第一款由行业/国家实验室/学术人员联合创建的程序库。MPI 的创建过程集合了几乎所有的业内主要力量,并迅速成为高性能计算领域的标准讯息传递界面。现在,MPI 已走过了大约 15 个春秋,但它仍是高性能计算领域并行编程应用中应用最为常用的符号。
目前,大多数 MPI 程序均使用单程序多数据或 SPMD 模式 [mattson05]。它的原理非常简单:所有处理单元(PE)运行同一程序。并且它们都具有一个独特的整数 ID,以确定其在处理单元集内的排序。这样,程序便可利用该排序分配工作,并决定由哪个 PE 处理哪部分工作。换句话说,程序只有一个,但是由于根据 ID 所做的选择多种多样,因而,PE 间的数据也就有可能不同;即“单程序,多数据”模式。
MPI 概述
MPI 是一个可靠实用的讯息传递系统,它专为支持广泛的硬件而设计,并可支持带有完整模块化设计的复杂软件架构。
MPI 的设计理念基于通信子(communicator)。在创建一套进程时,它们可以定义群组。这样,进程组便可共享通信环境,从而更好地进行通信。这种进程组与通信环境的结合,可以定义一个独特的通信子。当您考虑在程序中使用程序库时,这一概念的力量就会凸现出来。如果程序员不细心,那么程序库开发人员创建的信息便可能与程序中用来调用程序库的信息发生干扰。但是通过通信子,程序库开发人员便可创建自己的通信环境,并确保就通过系统传递的相关信息而言,程序库的内部活动不会对其造成干扰。
当 MPI 程序启动时,将创建默认的通信子 MPI_COMM_WORLD。该通信子作为第一个参数被传递到每个 MPI 例程中。其它的参数则用来定义信息来源,以及定义保存信息的缓冲。在这种情况下,MPI 例程就会返回一个整数值作为错误参数,以查询例程执行期间出现的所有问题。
MPI 程序通常在靠近开始的位置上设置三个例程的调用,以设置 MPI 的使用方式。
int my_id, numprocs;
MPI_Init(&argc, &argv) ;
MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;
MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;
第一个例程(MPI_Init)用来输入任何 C 程序人员都熟悉的命令行参数,并初始化 MPI 环境。后两个例程用作输入 MPI 通信子(本例中为默认的通信子),并返回调用的进程排序(rank)和进程总数。这里,排序作为该进程的唯一标识符,可从 0 一直排到进程数量减去 1。
关于创建多少进程以及它们将在哪些处理器上运行的详细信息,都被置于 MPI 应用编程接口之外。由于支持 MPI 的平台各异,所以需要使用不同的方法。在大多数情况下,会有一个主机文件按名称顺序列出每颗处理器的信息。这些信息将传递给可用于大多数 MPI 平台的常见 shell script(称为 mpirun),以启动 MPI 程序。鉴于这一简单进程的详情在不同平台上表现各异,我们在这里就不进行讨论了。
在每个 MPI 程序的最后都应该有一个例程来关闭环境。此函数将返回整数值错误代码。
int MPI_Finalize();
MPI 程序运行于这些例程之间。程序的大部分都是由规则的串行代码组成,并以您所选择的语言来表示。正如上文所述,虽然每个进程都在执行相同的代码,但是程序行为却视进程排序而有所不同。并且在进程间需要通信或其它交互的点上,还插入了 MPI 例程。MPI 的第一版上即有超过 120 个例程,最新版本(MPI 2.0)的例程数量更为庞大。但是,大多数程序仅使用 MPI 函数中一个很小的子集。因此,我们只讨论一个程序;一个执行规约并将最终规约结果返回组中各进程的例程。
int MPI_Reduce(void* sendbuf, void* recvbuf,
int count, MPI_Datatype datatype, MPI_OP op,
int root, MPI_COMM comm.)
此函数采用缓冲“sendbuf”中类型为“datatype”的“count”值,并用“op”操作来累积每个进程的结果,最后将结果置于排序为“root”的进程的“recvbuf”缓冲中。借此,MPI_Datatype 和 MPI_OP 就可直观地获得期望的数值,如“MPI_DOUBLE”或“MPI_SUM”。
此外,借助MPI 广播讯息(MPI_Bcast)中的其它常用例程,还可定义“barrier”同步点(MPI_Barrier)、发送讯息(MPI_Send)或接收讯息(MPI_Recv)。您可以通过在线方式,或在 [mpi] 及 [mattson05] 中了解有关 MPI 的更多详情。
MPI π 程序
MPI π 程序是对最初串行代码进行的直接修改。为了简便起见,我们将继续在程序本身中设定步骤数量,而不是输入数值然后广播其它进程。
程序以 MPI include 文件开始,以定义 MPI 中的数据类型、常量以及各种例程。在此之后,我们添置了标准的 3 个例程,以初始化 MPI 环境并将基本参数(进程的数量和排序)用于程序中。
#include <mpi.h> static long num_steps = 100000; void main (int argc, char *argv[]) { int i, my_id, numprocs; double x, pi, step, sum = 0.0 ; step = 1.0/(double) num_steps ; MPI_Init(&argc, &argv) ; MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ; MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ; my_steps = num_steps/numprocs ; for (i=my_id; i<num_steps; i+numprocs) { x = (i+0.5)*step; sum += 4.0/(1.0+x*x); } sum *= step ; MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD) ; MPI_Finalize(ierr); }
最后,我们利用一种常用技巧将进程集合中的循环迭代进行划分。请注意,这里的循环极限已经改变,它从运行每个进程的 ID,变为了随着组中进程数量而递增的迭代数量。这是由于 MPI 中被定义的排序用作了 ID,并且排序数量可以从 0 一直到进程数量减去 1。本质上,这种简单的转换是以循环方式将循环迭代加以分配,就像我们将一副纸牌分配到不同进程中一样。
每个进程完成后,部分总和会把得到的部分结果纳入变量“sum”中,这种规约主要包含在以下调用中:
MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD) ;
相比我们上文所讨论的 MPI_Reduce 定义,这里每个参数的意义应该更加清晰。我们正在使用的部分和中,“sum”作为发送缓冲,变量“pi”作为接收缓冲。根据 MPI_Reduce 例程的第六个参数,这一数值将到达排序为“0”的进程中。“发送缓冲”包含一个带有附加累积操作(即 MPI_SUM)的 MPI_DOUBLE类型数值。最后,涉及到这一规约操作的进程会使用通信子 MPI_COMM_WORLD进行运作。
Java 线程概述
Java 语言在设计之初便内置了多线程支持。作为Java 技术的一个重要组成部分,线程在语言(语法)级别和 Java 虚拟机,以及类别库(class library)级别上均能够得到支持。Java 线程与 POSIX pthread有很多相似之处。Java 类别库提供的线程类别可以支持丰富的方法集,用以启动、运行或停止线程,并检查线程的状态。
Java 的线程支持包括一套复杂的基于监控和条件变量的同步原语。在语言级别上,类别库或声明为同步的代码块中的方法并不同时运行。这种方法或模块在监控器的控制下运行,有助于确保在这些方法或模块中存取的数据能够始终处于一致状态。所有的 Java 对象都有自己的监控器,通常在第一次使用时由 JVM 展示并激活。监控器的作用非常类似于 pthread 中定义的条件变量对和 mutex。但是与 for pthread 不同的是,Java 线程处于等待状态时可能被打断,例如当它等待事件通知或在 I/O 调用过程中被拦截时就时常会发生这种情况。
在这一简单的范例中,我们展示了如何借助“简单”Java 线程编写并行版 π 程序:
public class PI1 { static long num_steps = 100000; static double step; static double sum = 0.0; static int part_step; static class PITask extends Thread { int part_number; double x = 0.0; double sum = 0.0; public PITask(int part_number) { this.part_number = part_number; } public void run() { for (int i = part_number; i < num_steps; i += part_step) { x = (i + 0.5) * step; sum += 4.0 / (1.0 + x * x); } } } public static void main(String[] args) { int i; double pi; step = 1.0 / (double) num_steps; part_step = Runtime.getRuntime().availableProcessors(); PITask[] part_sums = new PITask[part_step]; for (i = 0; i < part_step; i++) { (part_sums[i] = new PITask(i)).start(); } for (i = 0; i < part_step; i++) { try { part_sums[i].join(); } catch (InterruptedException e) { } sum += part_sums[i].sum; } pi = step * sum; System.out.println(pi); } }
在 Java 中启动全新线程时,我们通常会将 Thread 类细分,并定义一个定制的 run() 方法,以保证主要工作能够并行完成。在我们的范例中,此项工作可在 PITask 类的 run() 方法中实施。出于性能原因,整个积分范围被分为 part_step 片断,这些片段的数量等于可用处理器的数量。PITask 对象通过 part_number(代表积分范围中的一个片断)实现参数化;这样,run() 的主体就在选定的积分附属范围内计算部分和。当调用 start() 方法时,实际的线程同时开始启动并并发执行。我们可在面向所有附属范围的循环中进行此项工作。然后,我们运行第二个循环,通过调用其 join() 方法,等待每条衍生线程 (spawned thread) 的完成,并接着对每条线程得出的结果进行总结。在本例中,每个积分范围都明确地映射到一条单独的 Java 线程中。
本例为我们明确创建了 Java 线程,因而,我们不得不将积分范围分成多个部分,以便在线程之间手动进行工作分区。也许人们认为这样做非常繁琐,但是如果不用这种方法,而去创建与积分范围中的步骤数量相同的线程,那么我们将会发现程序的表现实在让人无法接受。这是因为通常情况下,创建 Java 线程是一项非常昂贵的工程。
上文中所提到的“简单”Java 线程只是 Java 多线程支持的最低级别;还有很多更高级别的线程库,旨在增强 Java 多线程功能性的基本水平,并为一些常用任务增添解决方案。从 Java 标准 1.5起便开始提供的 java.util.concurrent 程序包是一个值得我们注意的范例。该程序包包括针对基本 Java 线程的诸多增强特性,如线程池支持、atomic 变量,以及复杂的同步原语等。但是,util.concurrent 程序包的一些片断不符合 J2SE 标准,因而它仍旧只能作为独立程序库使用(称为 EDU.oswego.cs.dl.util.concurrent)。在此之中,最重要的遗失部分就是 FJTask 框架,它针对Java采用了一种 fork-join 并行概念,旨在对定积分或矩阵乘法运算等计算密集型计算实现并行处理。FJTask 是对 Thread简单的直接模拟。它通常是指“基于任务的”并行,而不是“基于线程的”并行。FJTasks 往往在同一个 Java 线程池上执行。它还支持 Thread 等级中许多最为常见的方法,包括 start()、yield() 和 join()。
FJTask 不支持优先控制(priority control)等一些 Java 线程方法。因而,它的主要经济优势就在于它不支持任何类型的拦截操作。没有任何因素能够阻止 FJTask 中的拦截,并且极其短暂的等待/拦截也能执行得非常好。FJTask 并非设计用于支持任意同步,因为一旦开始执行,就没有任何方式能够暂挂和恢复独立任务的执行。在持续运行期间,FJTasks 也应该是有限的,而且不应该包含无限循环。FJTask 应顺利地完成运行,不应要求等待或运行阻拦式 IO。因而FJTask 和 Thread 之间存在着很大的成本差距。至少运行于 JVM 上时,FJTask可以在高性能垃圾回收(所有 FJTask 迅速成为垃圾)和良好的本地线程支持下,比 Thread 快 2 至 3 个数量级。
在以下范例中,我们展示了如何在 FJTask 框架的帮助下编写 PI 程序:
import EDU.oswego.cs.dl.util.concurrent.FJTask; import EDU.oswego.cs.dl.util.concurrent.FJTaskRunnerGroup; public class PI2 { static int num_steps = 100000; static double step; static double sum = 0.0; static int part_step; static class PITask extends FJTask { int i = 0; double sum = 0.0; public PITask(int i) { this.i = i; } public void run() { double x = (i + 0.5) * step; sum += 4.0 / (1.0 + x * x); } } public static void main(String[] args) { int i; double pi; step = 1.0 / (double) num_steps; try { FJTaskRunnerGroup g = new FJTaskRunnerGroup(Runtime.getRuntime() .availableProcessors()); PITask[] tasks = new PITask[num_steps]; for (i = 0; i < num_steps; i++) { tasks[i] = new PITask(i); } g.invoke(new FJTask.Par(tasks)); for (i = 0; i < num_steps; i++) { sum += tasks[i].sum; } pi = step * sum; System.out.println(pi); System.out.println(Math.PI); } catch (InterruptedException ie) { } } }
首先,与上一范例中的做法类似,我们为 PITask 类设立一个 run() 方法。但是这样,PITask 仅会计算出对应 i-th 步骤的单一值 x,而不是积分附属范围的部分和。随后,我们创建了 PITask 对象阵列,使用 FJTask.Par 对象进行打包,并通过调用 FJTaskRunnerGroup 对象上的 invoke() 加以执行。使用 FJtask.Par 对象进行打包,可指导框架并行执行线程池上的基本任务阵列(我们已将该线程池的线程数量设置为处理器的数量)。此范例中的 invoke() 方法必须等到完成阵列中的所有任务时才可使用。这就使得我们能够通过每个具体任务中所得出的独立和数值,来立即计算出总和。
请注意:本 Java π 程序小修订版不会明确创建任何线程,也不会在线程与任务之间划分任何的工作分区。然而,大家可能已注意到,即使与上文我们在线程之间进行明确工作分区的范例相比,它的执行情况仍然非常好。这是因为所有全新 FJtask 的创建与异步执行几乎都能像调用一种方法那样快速。但是,为了获得最佳性能,我们仍然建议您为每个 FJTask 对象适当分配大量工作,以确保这些对象数量的可管理性。这将有助于减少 JVM 内垃圾收集器(garbage collector)的压力。
在本文中,我们已经谈及了众多并行编程的常用符号。文中使用的程序非常简单----甚至可能过于简单了。但是,我们希望您能从如此简单的举例中很好地了解所有的并行编程符号。
这些并行编程符号在复杂性、变更时需要的原始串行程序数量、以及共同使用时可能发生的错误等方面各不相同。鉴于您所倾向使用的并行算法类型的特性,建议您将所有这些因素都考虑在内。此外,您还需考虑:
可移植性:您需要支持哪些平台?MPI 如此流行的原因之一就是它在哪里都能够运行。但是如果您只计划支持具有共享地址空间的硬件,那么基于线程的符号也许更加合适。
性能:可管理的运行时和高级运行时环境大大减轻了程序员的负担。由于创建和维护软件需要较高成本,因此这些优势对您来说非常重要。但是这些优势也是需要成本的。由于低级 API (如 windows 线程、Pthreads 或 MPI)中的硬件直接面向程序员,所以需要更细致的优化。如果所有可用的内核都需要扩充,那么这样的优化就非常重要。
串行与并行产品发布:软件拥有较长的使用周期。成功的软件开发人员所支持的产品都会拥有较长的使用期限。因此,将软件的串行和并行版本保存在一个源代码树中就会显得十分重要。如果并行编程符号需要对软件进行大量改写以支持并行,那么这就很难做到。
熟悉程度:学习一门新的语言是非常困难的。此外,当多位开发人员学习一门不熟悉的语言时,成本也可能会非常昂贵。因此,如果并行符号是一种熟悉的串行语言的扩展,意义就会非常重大。
测试:软件产品必须进行广泛的测试。在专业开发环境中,测试的成本很容易在最初便超过创建软件的成本。这就是递增策略在并行编程(通常使用 OpenMP)中的优势所在。借助递增并行,每当添加一个结构时,开发人员便可测试结果,并确保结果仍然与最初的串行代码保持一致。
[omp] OpenMP 应用编程接口 2.5 版,www.openmp.org ,2005 年
[Mattson05] Timothy G. Mattson、Beverly A. Sanders、Berna L. Massingill,《并行编程模式》,Addison Wesley 出版社,2005 年
[mpi] William Gropp、Ewing Lusk、Anthony Skjellum,“使用 MPI”,麻省理工学院出版社,1994 年
[JLS] Java 语言规范,http://java.sun.com/docs/books/jls
[JVMS] Java 虚拟机规范,http://java.sun.com/docs/books/jvms/
[JavaAPI] java.lang.Thread 规范,http://java.sun.com/javase/6/docs/api/java/lang/Thread.html
[JSR166] Doug Lea 的 util.concurrent Fork-Join 任务框架,http://gee.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/FJTask.html
Tim Mattson 是一位并行程序员。在过去 20 年中,他曾利用并行计算机来制造化学反应、重新组合蛋白质、寻找石油、分析基因,以及解决众多其它科学问题。Tim 还决心在当前应用编程人员大都编写并行软件之时,开发一种比较少见的串行软件。多年来,他始终坚信寻找正确的并行编程环境是解决问题的关键所在。他尝试了无数种并行编程环境,并自行创建了一些新的环境(包括 OpenMP)。当这种方法被证实并没有他所期望的那样有效时,他迅速转换方式,并决定在人们被语言和软件工具困扰之前,帮助我们意识到需要了解专业程序员对并行编程的思考方式。为了解决这个问题,Tim 花了五年多的时间,与他人合作,共同为并行编程开发设计模式语言(《并行编程模式》,Addison Wesley 出版社,2004 年)。Tim 目前效力于英特尔,并在英特尔企业技术事业部的应用研究实验室中继续进行着并行应用编程问题的研究。
Andrey Y Chernyshev 是英特尔公司企业解决方案软件部门的一名软件工程师。他目前在俄罗斯工作,联系方式为:andrey.y.chernyshev@intel.com。
http://www.rsinc.com/idl/
美国RSI公司的旗帜产品IDL(InteractiveDataLanguage),交互式数据语言是进行数据分析、可视化表达与跨平台应用开发的理想工具。作为语法简单的第四代计算机语言,IDL面向矩阵、拥有丰富的分析工具包,采用高速的图形显示技术,是集可视化、交互分析、大型商业开发为一体的高级开发环境,让您的科学研究和商用开发真正做到快捷高效。
RSI公司在向用户提供完善的数据分析和可视化软件、以及根据用户需求定制应。IDL用户涵盖NASA、ESA、NOAA、Siemens、GEMedical、ArmyCorpsofEngineers、MacDonaldDettwiler等大公司及研究机构。从辅助Hubble空间望远镜进行宇宙起源探察到帮助保时捷公司的工程师进行世界顶级汽车的设计,IDL还参与了2004年火星探测计划的测试和传感器设计,JPL的科学家利用IDL对“勇气号”和“机遇号”的数据进行数据分析和图像处理。目前,IDL已经广泛应用到海洋学、气象学、医学、空间物理、地球科学、教育、天文学和商业等各个研究领域。世界上数十万的科学家、研究人员、工程师、管理者和商务人员依靠IDL加快探索进程,发布科研成果和进行软件的快速开发。
IDL最初的设计理念就旨在为使用者节省时间。IDL支持各种格式数据源、各种类型和大小的数据,使您可以将精力集中在工作上,而无需过多考虑如何处理数据。IDL能高效处理海量多维数据的能力,更加速了您的分析和研究工作的进程。某些工具如iTools(IDLIntelligentToolsTM),为您的数据处理提供了直接的、交互式的数据分析和可视化环境,使您远离编写代码的烦恼。
IDL的卓越之处在为通过内建的大量数据可视化和分析函数及成熟完备的的开发环境,使科研用户和商业开发人员用最少的时间和资源实现预定开发目标。IDL应用程序具有跨平台性,您的一次性开发成果可以被应用到多种操作系统的计算环境当中(Windows/Linux/UNIX/Mac),保障了硬件资源和软件成果的充分利用。IDL还可以与其他先进技术,如COM和JAVA,实现嵌套应用。
IDL提供了包括创建、修改、编译、调试和工程发布等功能在内的理想开发环境IDLDE。同时提供整套控件化GUI工具包,可按照符合编程人员习惯的方式快速进行程序界面设计。
IDL的开发环境
IDLDE是用户进行快速IDL代码编辑、编译、调试、运行和发布的集成开发环境,用户可以在该环境中采用命令行或编程两种方式进行方便灵活的科学数据分析和应用开发。
界面系统是一个应用程序成功与否的关键,IDL提供了一整套包含完整GUI控件的跨平台工具包,使用IDLGUIBuilder,您无需熟悉IDL控件编程知识就可以快速地完成程序设计,并以拖放式创建跨平台的图形用户界面。作为IDLDE的重要组成部分,IDLGUIBuilder还可方便地输出工程(project),并生成可执行文件。
灵活的数据输入输出
IDL支持多种数据源、数据格式、数据类型和数据大小,能够处理任何有格式或无格式数据,它还支持通用文本及图像数据(JPEG,GIF,DXF,PNG,TIF等),在NASA、TPT、NOAA等机构中大量使用的HDF、CDF和netCDF等科学数据,及医学扫描设备的标准DICOM格式数据。IDL采用动态的变量形式,您可以灵活掌握数据的精度类型,这样您就不必担心数据占用更多的内存。
从数据中获取有用信息
IDL语言面向矩阵的特性带来了快速分析超大规模数据的能力,它所具有的高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速功能、集成数学分析与统计软件包、完善的信号处理和图像处理功能、灵活的数据输入输出方式、跨平台图形用户界面工具包、连接ODBC兼容数据库及多种外部程序连接工具能将对您的数据进行快速展现和分析,即使是从未应用过IDL进行开发的初学者,IDL简单的语法、丰富的数据类型和面向数组的操作过程都能够让他们应用自如。
高效灵活的图形可视化方式
IDL是专为可视化大型而复杂的数据集而设计的语言。从简单的2D绘图和图像显示,到利用OpenGL硬件加速功能进行交互式的3D图形设计,以及利用支持多处理器快速渲染的功能进行体数据显示,您可以轻松地获得丰富的可视化效果。
IDL还提供了两套图形系统——直接图形和对象图形,可根据您的需要灵活选择。
强大的数据分析工具包
IDL具有强大的数据分析能力,IDL带有完善的的数学分析和统计软件包,提供强大的科学计算模型。它的图像处理软件包提供了大量方便的分析工具、地图投影及转换软件包,使您开发GIS易如反掌。
IDL提供了可缩放的TrueType字体,可以注记中文,能将结果存为标准图像格式或PostScript格式,并尽可能地使图像质量最优化。
iTools智能工具包使IDL变得更简单
iTools是针对不同数据类型、集成一系列交互式功能的智能工具包,它包括iContour、iPlot、iImage、iMap、iSurface和iVolume等多种类型,给使用者提供了无需编程便能交互式分析各种数据类型的独立工具包,IDL的使用者可以利用其进行快速简单的数据分析、可视化,生成高质量显示效果的图形等。iTools定制简单,并可嵌入到您可开发的IDL应用程序中。
与其它编程语言整合
通过IDL链接外部程序,或者将IDL作为其他语言的外部程序或图形引擎,IDL可以成为您现有开发工具的强有力补充。IDL开放性的、通用性的、跨平台的计算环境,可以整合您现有的软硬件技术并保护和利用您过去的、现有的和将来的资源。
您可以从IDL调用其它语言编写的程序或算法,也可以从其他语言调用IDL的子程序。IDL既是ActiveX控件,又是ActiveX容器。利用ActiveX技术,您可以将IDL的图形嵌入到VB,VC++等Windows程序中。利用IDL支持JAVA,网络和第三方的功能,您可以从IDL编码访问JAVA对象。您还可以通过动态链接库方式通过IDL调用C和Fortran。
科研人员使用IDL
IDL已变得不可缺少,因为它能快速准确的估算和显示出现的近点角。。。采用IDL我们在三年项目进展中减少了超过一年的工作量。
PaulScowen NASA哈勃望远镜修正小组成员
把更多的时间用在科学研究上
IDL内建有丰富的算法库,包括已经被验证的图像处理、数学、统计以及分析程序等的运算法则,这些对研究工作的完成起到了推动作用.
通过IDL强大且快速的可视化工具可以查看数据中的隐藏信息.
快速查看结果.IDL是一种基于矩阵的语言,你可以迅速发布单独命令,速度可以与优化的C语言相比.
达到两全其美的效果.IDL方便应用程序的管理和并具有一定的灵活性.
IDL可以管理你的数据.IDL支持任意格式、类型和大小的数据,这样你就可以把精力集中在数据挖掘上而不是如何读取.
分享你的工作成果
和使用IDL的你的同行分享代码.IDL可以方便地用于产品在全球范围内的研究与开发.
与全球范围内的任何一个人分享IDL生产的图像、动画、三维VRML场景.
通过ION(IDLOntheNet)分享数据和交互式应用程序.
达到更快的速率
我们提供了全球范围内特定区域的培训,包括在您所在地区进行的定制培训.我们的专业讲师会为您提供专门技术让你提高速率并把精力主要集中在科学研究上.
您可以信赖RSI的技术支持.我们有超过60%的技术支持人员拥有硕士或以上学位,你可以从专业人员那里得到技术支持.在这个行业里,我们的客户满意度是最高的.
工程师使用IDL
"ActiveX界面允许将IDL无缝结合到我的基于LabVIEW的管理和数据分析系统中去。IDL带来的图形增强功能会随着海量数据的增长而变得重要。”
DavidMoor MooreGoodIdeas 美国国家仪器有限公司(NI)合作伙伴
把更多的时间用在科学研究上
在获取数据的过程中利用可视化工具优化你的数据质量.
用IDL进行三维可视化的生成和管理并挖掘隐藏在您的数据中的信息.
通过定制影像处理过程及体积分析将生数据(rawdata)快速转化为有用的成果.
结合LabVIEW和IDL的力量来缩短测试和图形化的时间.
增强已有的IDL应用程序
IDL强大的内嵌影像处理、运算、统计和分析程序和应用程序库使你能够快速增强、扩展以及定制LabVIEW分析功能.
分管理海量数据
通过执行作为LabVIEWVI网络的一部分的IDL原代码以On-the-Fly方式处理大批输入数据.
用IDL和LabVIEW来为大型可视化项目管理海量数据,已逐渐成为科学技术分析的一部分.
实现跨平台功能
在Windows系统上,你可以用ActiveX控件建立一个统一的用户指令以实现IDL和LabVIEW之间的无缝结合.
利用IDL和LabVIEW套接字功能,IDL提供了在Windows,UNIX,LINUX和MACOSX系统上可视化分析解决方案.
计算机能够在不同的平台上用LabVIEW获取数据,用IDL实时的显示数据.
开发者使用IDL
“我用IDL完成工作所需要写的代码比用c或者FORTRAN所写的代码要少20%。”
RobertVelthuisan 莫非·李癌症中心(H.LeeMoffittCancerCenter)美国南佛罗里达大学(ResearchInstitute)
节省你的开发时间
对你的应用程序进行快速建模。IDL是解释型语言(InterpretedLanguage),你能在页面上写出独立的命令并立即看到命令运行结果。IDL缩短了设计-编译-运行的周期。
IDL程序库包含丰富的关于影像处理、波段运算、统计以及分析的算法,借助这些算法能够快速完成你的应用程序。
用IDL可快速进行可视化。IDL是一种专为大型复杂数据表进行可视化的语言,IDL为您提供从简单的二维图到OpenGL-accelerated三维图的工具。
为你的终端用户建立理想的界面,利用IDL自带的完整UI工具包以及方便的拖放式GUIbuilder快速实现你的界面设计。
一次写程序,多平台调用.
IDL能处理你提供的数据。IDL实际上能读取和写入任何格式、类型以及大小的数据,缩减了你处理输入输出文件的时间。
授权您的用户执行IDL
借助一个更快的解释程序和面向数组的建构方法,IDL在进行数组运算时像优化后的C语言一样运行。
从海量数据库中使用一个文本文件来定制集成程序以便有效的开发程序。借助内嵌的多线程算法,大量的计算能够在多个处理器系统上实现。
享受IDL的灵活性
尽量利用已有代码。从IDL中调用以其他语言写得程序以及程序库,或者从其他语言中把IDL作为一个子程序调用。
结合其他技术。IDL不仅是ActiveX控件也是ActiveX容器。将IDL图形嵌入到VB,VC++以及其他Windows应用程序中去,或者在Windows.上将某些要素例如电子程序表(spreadsheets)嵌入到IDL中去。
通过ION(IDLOntheNet)在网上和别人分享交互式应用的成果,用IDL的分析和图形功能增强client/serverJava应用程序。
轻松的让您的应用程序传遍海内外。我们能满足您的需要。
让我们的技术为您的工作出力
想要尽快掌握IDL?我们提供了遍布全球的各种培训,包括为了您的方便在您的单位进行的培训课程。我们专业的培训讲师能帮您尽快掌握IDL,节省您的时间和金钱。
没有时间或开发者?我们的咨询师可以给你很详细的关于部分或者全部应用程序的开发时间和预算的论述。
你可以信赖RSI的技术支持团队。我们60%的技术支持工程师拥有硕士学位或者更高的学位,所以你可以依靠这些技术人员的支持。我们的顾客满意度在工业领域是最高的。
支持鼠标滚轮,支持中文标签
下载地址:ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0/enu/AdobeReader_enu-7.0.0-1.i386.rpm
中文字体设置:
下载http://linuxfire.dhis.org/~easthero/CMap.tar.gz 解压替换掉/usr/local/Adobe/Acrobat7.0/Resource/CMap目录
下载http://linuxfire.dhis.org/~easthero/Font.tar.gz 解压替换掉/usr/local/Adobe/Acrobat7.0/Resource/Font目录
[22:55] [发表评论]
下载 ntfs-3g:
# wget
http://flomertens.keo.in/debian/ntfs-3g/binary-i386/ntfs-3g_20070714-BETA-1_i
386.deb
安装 ntfs-3g:
# dpkg -i ntfs-3g_20070714-BETA-1_i386.deb
编辑 /etc/fstab(其中 hda1 是 ntfs 分区,设定只允许 root 帐户写):
/dev/hda1 /mnt/win ntfs-3g
silent,umask=0222,iocharset=cp936,locale=zh_CN.GBK 0
添加 fuse 模块:
# echo fuse >>/etc/modules
# modprobe fuse
卸载 ntfs 分区:
# umount /mnt/win
重新挂载 ntfs 分区:
# mount /mnt/win
解决W: GPG error
升级的时候出现W: GPG error: ftp://debian.ustc.edu.cn unstable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1D53D8C4F368D5D
W: You may want to run apt-get update to correct these problems
Merging Available information
这是由于apt版本不对应造成的,以前用过experience版本,现在降级到unstable,解决办法
apt-get install apt/unstable
[22:55] [发表评论]
http://bbs.lasg.ac.cn/cgi-bin/forum/topic.cgi?forum=7&topic=9
在ultraedit-32中,我们用view菜单下view as(highlighting file type)可选择高亮显示c/c++文件、vb、html、perl、php、java、xml等多种文件的关键字,为编程和阅读带来方便。但软件没有为我们设置fortran语言关键字的高亮显示,十分不便。现在,将以下代码粘贴到ultraedit-32目录下的wordfile.txt文件中,即可高亮显示fortran语言关键字,喜欢用ultraedit-32的可以试试:
/L9"Fortran" FORTRAN_LANG File Extensions = FOR FTN F F90
/C1"Keywords"
access assign accept
backspace block black byte
complex complex* character character* close call common complex continue case
double dimension data do direct default deleter
err end endif enddo else elseif endfile entry equivalence external exit
file form function format fmt find
goto go
integer integer* if iostat implicit inquire intrinsic include
logical logical*
open options
parameter pause precision print program public
real real* read rec recl return rewind rewrite
status save stop subroutine save select
then to type
unit use unlock
write
/C2"FORTRAN FUNCTION"
abs acos aimag aint alog alog10 amax0 amax1 amin0 amin1 amod anint asin atan atan2
cabs ccos char clog cmplx conjg cos cosh csin csqrt
dabs dacos dasin datan datan2 dble dcos dcosh ddim dexp dim dint dlog dlog10 dmax1 dmin1 dmod dnint dprod dreal dsign dsin dsinh dsqrt dtan dtanh
float
iabs ichar idim idint idnint ifix index int isign
len lge lgt lle llt log log10
max max0 max1 min min0 min1 mod
sign sin sinh sngl sqrt
tan tanh
/C3"C/C++ Keywords"
case char const catch class const_cast
default defined dllexport dllimport
enum extern export
float for false friend
mutable
new namespace naked
operator
private protected public
register reinterpret_cast
short signed sizeof static struct switch static_cast
typedef template this throw true try typeid typename thread
union unsigned using uuid
void volatile virtual
while wchar_t
__asm __based __cdecl __declspec __except __far __fastcall __finally __fortran __huge __inline __int16 __int32 __int64 __int8 __interrupt __leave __loadds __near __pascal __saveregs __segment __segname __self __stdcall __try __uuidof __multiple_inheritance __single_inheritance __virtual_inheritance
#define #error #include #elif #if #line #else #ifdef #pragma #endif #ifndef #undef
好用的话,就赶紧用吧,不好用的话也不要想打我。(这一行不必粘贴,切切,切切!)
[22:55] [发表评论]
gtkterm 访问串口设备的终端
gtkterm is a simple GTK+ terminal used to communicate with the serial port.
Its features :
Serial port terminal window
Serial port setup (speed, parity, bits, stopbits, flow control)
Using the termios API
Possible to send a file (only RAW data, no protocol)
End of line delay while sending a file
Special character wait before next line while sending a file
Possible to toggle control lines manually (DTR, CTS)
Also reads the state of control lines (RTS, CD, DSR, RI)
Author: Julien Schmitt
Homepage: http://www.jls-info.com/julien/linux/
#cd mpich2-1.0.1
#export F90=ifort F77=ifort
#./configure --prefix=/usr/local/mpich --enable-f90 --enable-f77
#make
#make install
在/etc/bash_profile中添加:
- export MPICH=/usr/local/mpich"
- export PATH=$MPICH/bin:$PATH
个人配置:
- $echo "secretword=<YouSecretWord>" > ~/.mpd.conf
- $chmod 600 ~/.mpd.conf #各人用户目录下需要设置这个文件,并设置权限为别人禁止读写,启动mpi程序前要保证mpd已经运行,否则执行mpd &
编译运行:
- $mpif90 program.f90
- $mpiexec -np 2 /path/a.out #这里好像需要绝对路径,也许设置一下可以用当前路径
http://news.csdn.net/n/20070118/100777.html
外电消息,1月16日,Sun表示正计划推出一种称为“Fortress”的全新程序设计语言。
Sun日前悄悄把原型Fortress"解译器"(interpreter)发布为开放源代码软件。解译器是一种程序设计工具,用来逐行执行Fortress程序。
Sun希望以Fortress取代50年前在IBM诞生的Fortran程序设计语言。Fortran至今仍活用于高效能计算机运算任务,例如气象预报。
尽管Fortress脱胎自美国国防部的超级计算机赞助计划,但也处理主流的运算问题--更轻易地促使多核处理器内的新型处理器引擎提高性能。
Sun公司表示,随着多核运算对一般桌面系统的重要性提高,程序设计师必须转用 Fortress这类语言,以便利用硬件性能。
Fortress试图以智能方法存储数据,以便数据在需要使用时可就近在处理器附近获取。Sun认为,这对由独立服务器通过高速网络组成的大型计算机集群(clusters)而言,尤其有用。
Sun的Fortress解译器根据开原码BSD授权发布。但正式版Fortress的控制权仍掌握在Sun手中,所以,至少目前外部程序人员必须把他们贡献的程序交由Sun控制。
Fortress目前只初具雏形。Sun去年9月发布alpha版Fortress语言格式,但尚未拍板定案。而且,解译程序也在初步阶段。
未来,Sun希望除了打造解译器之外,也打造编译器(compiler),以便事先把软件译成某种计算机能解读的形式。编译软件通常执行速度比解译器快。
另外,Sun希望将来也推出最佳化的编译器(optimizing compiler),此技术可在软件执行时调整软件的编译版,以便改善效能。
[22:55] [发表评论]
GNU科学计算函数库GSL(GNU Scientific Library)是一个强大的C/C++数值计算函数库,它是一个自由软件,是GNU项目软件的一个部分,遵循GPL协议。目前GSL的最新版本是1.5,发布于2004年6月25日。
常见的LINUX发行版一般不带GSL,用户可以下载安装,安装比较简单,只要按照安装说明安装即可。
函数库提供了大量的数值计算程序,如随机函数、特殊函数和拟合函数等等。整个函数库大约有1000多个函数,几乎涵盖了科学计算的各个方面。以下是整个函数库的目录:
Complex Numbers
Roots of Polynomials
Special Functions
Vectors and Matrices
Permutations
Sorting
BLAS Support , BLAS(Basic Linear Algebra Subprograms)
Linear Algebra
Eigensystems
Fast Fourier Transforms
Quadrature
Random Numbers
Quasi-Random Sequences
Random Distributions
Statistics
Histograms
N-Tuples
Monte Carlo Integration
Simulated Annealing
Differential Equations
Interpolation
Numerical Differentiation
Chebyshev Approximation
Series Acceleration
Discrete Hankel Transforms
Root-Finding
Minimization
Least-Squares Fitting
Physical Constants
IEEE Floating-Point
GSL主页上有完整的GSL参考手册,里面有详细的函数介绍。参考手册有GSL Reference Manual - HTML、GSL Reference Manual - Gzipped Postscript 、GNU Scientific Library Reference Manual 。内容都是一样的,电子书有600多页,文档非常详细,书的作者也是这些函数库的开发设计者。涵盖GSL使用的方方面面。
GSL函数库的设计者都是一些经验丰富的科学家和程序员。它是面向对象设计的,C和C++程序可以非常容易的调用,而且下载的安装源码里包含有所有程序的具体算法,用户可以参考,而且也可以对此提出改进。
GSL里面还包含完整的数学物理常数,有专门的头文件包含。
下面举一个简单的例子sample.c:
#include <stdio .h>
#include <gsl /gsl_sf_bessel.h>
int main (void)
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf ("J0(%g) = %.18en", x, y);
return 0;
gcc sample.c -o sample -lgsl
运行输出:
J0(5) = 143382920e-01
有兴趣的可以详细阅读一下GSL Reference Manual 。
[22:55] [发表评论]
Description: filesystem client based on SSH File Transfer Protocol
sshfs is a filesystem client based on the SSH File Transfer Protocol.
Since most SSH servers already support this protocol it is very easy
to set up: i.e. on the server side there's nothing to do. On the
client side mounting the filesystem is as easy as logging into the
server with ssh.
sshfs is based on FUSE (userspace filesystem framework for Linux),
thus you will have to prepare fuse kernel module to be able to use it.
Homepage: http://fuse.sourceforge.net/
Tag: admin::filesystem, interface::shell, role::sw:client, security::cryptography
[22:55] [发表评论]
2006.06.14 来自:存储在线
Network Appliance 公司目前正在推出其功能强大的新型 Data ONTAP GX 操作系统,为采用高性能计算(HPC)应用的用户带来极高的生产效率和空前的灵活性,使NetApp变得更加简便而可靠,这些都是目前市场上其它同类产品无法媲拟的。Data ONTAP GX 是历时两年多战略设计工作的成果,它将SpinOS(被 NetApp 在收购 Spinnaker Networks 时收购)的全球命名空间功能与 Data ONTAP 7G关键的数据管理、性能和高可用性特性结合在一起。 虽然 Data ONTAP 7G在性能、特性和功能方面都已经能很好地满足 NetApp 企业级用户的需求,能源(地震处理应用)、娱乐(电影内容制作与视觉效果渲染)和电子设计自动化(芯片设计与模拟)领域的高性能计算客户对性能的追求却永无止境。Data ONTAP GX 能够满足这些用户的需求并且通过统一的全球命名空间将多个结点作为一个单一的系统提交给应用程序,在存储结点或层次之间对数据进行透明移动,简化数据检索与管理。通过新的 FAS6070 和/或 FAS3050 系统,HPC 客户可充分发挥Data ONTAP GX 自带的集群文件系统技术的优势,它能够跨越多个结点对个别文件或数据集进行等量划分,实现传统存储系统所无法实现的性能。举例来说,Data ONTAP GX 与新的 FAS6070 结合之后,性能可提升至6PB,实现行业内前所未有的每秒100万次以上基于 SPEC SFS 基准的运算。 索尼图形图像运作公司研发部高级系统工程师 Steve Kowalski 表示,“作为Data ONTAP GX β版的测试者,我们对其性能和稳定性印象非常深刻,我们在图像领域的技术是企业基础架构与高性能计算的结晶。Data ONTAP GX from NetApp 目前实现了很高的性能,我们希望通过 Data ONTAP GX 能够实现企业所需的特色。” Industrial Light & Magic 公司高级系统工程师 Michael Thompson 表示,“NetApp 并没有要求我牺牲管理的方便性和系统的可靠性来换取大规模的向外扩展与性能提升,Data ONTAP GX 留给人们的印象非常深刻,其数据吞吐量非常大,单个全球命名空间可扩展至数百万兆字节,无需客户端软件,数据在控制器和/或存储层之间的移动非常方便。所有这些使我最终相信它的确是目前最好的 HPC 存储解决方案。” IDC 公司 HPC 研究主管 Addison Snell表示,“很明显,性能对 HPC 来说是一个重要标准,但不是唯一标准,HPC 客户将管理的方便性、可扩展性和数据保护功能看成是采购决策中的关键因素。存储供应商从更广的方面了解 HPC 客户的需求,发现自己能够更加轻松地解决客户所有的这些担心。” Data ONTAP GX 与同类竞争者之间的主要区别如下: - 性能突破。Data ONTAP GX 具有无限的线性扩展能力。最近的一项 SPEC SFS 测试证明其每秒计算能力在 100万次以上,较排名第二的竞争对手要快3倍以上。
- 线性扩展能力。从小到大各种规模的模块化扩展能力,可以灵活地选择对某些卷进行等量划分,在单个文件上实现大规模吞吐。
- 简洁又方便的管理。系统可以在单一全球命名空间下扩展至数百万兆字节。无需客户端软件,而且可以在控制器和存储层与应用程序之间方便而透明地移动数据。
- 高可靠性。NetApp WAFL文件系统是 Data ONTAP GX 的核心并且经过全球60,000多套实际安装的检验。RAID-DP具有对多个并发磁盘故障的容错能力,而且 Data ONTAP GX 系统没有单点故障。
NetApp产品及合作伙伴副总裁Patrick Rogers 表示,“直到现在,存储解决方案对 HPC 客户仍然存在很大的计算集群制约,通过Data ONTAP GX,NetApp 能够让 HPC 客户充分发挥其 Linux 计算集群的价值,在进一步简化 HPC 管理环境的同时提高其性能。” Data ONTAP GX目前可立即向 HPC 环境下的用户供货。定价可以向 NetApp 销售和销售合作伙伴索取。
[22:55] [发表评论]
src2tex 源代码变为TeX代码
A converter from source program files to TeX format files src2tex [resp. src2latex] is a sort of text converter from BASIC, C, C++, OBJECTIVE-C, COBOL, FORTRAN, HTML, JAVA, LISP, MAKE, PASCAL, PERL, SCHEME, SHELL, TCL/TK and ASIR, MACSYMA, MAPLE, MATHEMATICA, MATLAB, MAXIMA, MuPAD, OCTAVE, REDUCE to TeX [resp. LaTeX]. However, it is not a simple pretty-printer; actually, it is designed to fulfill the following desires:
- We want to write mathematical formulae in comment area of source program.
- We would like to patch PS or EPS figures upon source program.
- We need a simple and easy-to-use tool which enables to combine documentation and manual with source program.
- We often have to translate our program from text format to TeX format when we want to quote our own program in research report, lecture note, etc. That is quite time consuming, so it should be automated.
数据包转发采用LVS-DR方式,也就是说客户端的请求通过director转发给相应的
real server处理之后,请求的结果将由real server直接返回给客户,而不需要再
通过director,这种方式的吞吐量相对于LVS-NAT方式较高。
下面,将介绍director及real server上需要安装的软件以及相关设置:
在director上:
1、启动ip转发功能。在/etc/sysctl.conf中添加一行net.ipv4.ip_forward=1(在2.6.5内核中该行已经存在,但默认情况下为0,因此只需要将其改为1即可),然后运行sysctl -p使其生效。
2、配置LVS
ipvsadm -A -t 192.168.16.100:80
ipvsadm -a -t 192.168.16.100:80 -r 192.168.16.11:80 -g
ipvsadm -a -t 192.168.16.100:80 -r 192.168.16.22:80 -g
3、配置ldirectord.cf,它是用于监控后台的real server状态的,能够动态的添加和
删除真实服务器,然后修改LVS核心的虚拟服务表。
4、配置heartbeat,主要是3个配置文件:authkeys,ha.cf,haresources
real server上:
1、启动环回接口上的ip:ifconfig lo:1 192.168.16.100 netmask 255.255.255.255
2、解决ARP问题:因为DR方式下,director和RS都有一个相同的本地IP地址,而且在同一网段内,这样会带来ARP问题。我们只希望director响应该vip所对应的arp报文。而让其它的RS不进行响应。在2.6.5内核中,已经提供了arp_ignore,arp_announce来解决该问题
修改/etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
[22:55] [发表评论]
http://mlsx.xplore.cn/read.php/270.htm
[不指定 2006/03/01 16:38 | by mlsx ]
mozilla的bugzilla网站有一个讨论thunderbird支持中文附件的bug列表,给出了为什么thunderbird1.5后,发出的中文附件基本上不被foxmail,kmail,outlook,outlook express等其他邮件客户端识别。
原因是这个版本在附件编码的时候遵循了一个较新的RFC2231,这个RFC涉及到了附件名编码时多行编码的处理,但是由于这个RFC比较新,大部分邮件客户端包括outlook并不支持,而大部分的webmail系统同样不支持这个解码,因此导致tb1.5发出的中文名附件到了其他系统或客户端上后变得不可辨识(例如ATT00xxx.xxx这样的)。
修改mime的编码值,如果是Linux,进入TB后,依次选择:编辑--首先项--高级--配置编辑器
如果是Windows,进入TB后依次选择:工具->选项->高级->配置编辑器。
在过滤器中写入:
mail.strictly_mime.parm_folding
把过滤出来的这行默认值2修改为0,就可以解决这个问题了。
这次这个改动开来有点曲高和寡了,但是反过来想,如果是微软做这件事情,那也许就是另外一个情况,指不定马上所有的邮件客户端都考虑这个问题,随叫它依然还只是mozilla的产品呢?
当然这天能早点来到。
[22:55] [发表评论]
学习使用准备毕业答辩幻灯片中,推荐
http://prosper.sourceforge.net
Prosper is a LaTeX class for writing transparencies. It is written on top of the seminar class by Timothy Van Zandt. It aims at offering an environment for easily creating slides for both presentations with an overhead projector and a video projector. Slides prepared for a presentation with a computer and a video projector may integrate animation effects, incremental display, and such.
[22:55] [发表评论]
http://www.sina.com.cn 2007年03月20日 14:58 新浪科技
新浪科技讯 北京时间3月20日消息,据《纽约时报》报道,Fortran创始人约翰·巴库斯(John W. Backus)上周六在美国俄勒冈州的家中去世,享年82岁。Fortran由巴库斯领导的IBM团队开发完成,是第一门广泛应用的程序语言。从某种意义上讲,Fortran的出现打开了现代计算的大门。
巴库斯的女儿卡伦·巴库斯(Karen Backus)公布了父亲去世的消息。著名计算机历史学家简·李(J.A.N. Lee)表示,1957年发布的Fortran堪称是软件行业的转折点,就像微处理器对硬件行业一样重要。Fortran改变了人机通信的方式,使得程序语言更容易被用户理解和接受。因此,Fortran一直被认为是首款大获成功的高级语言。
上世纪50年代,巴库斯领导一个年轻的团队开发出了一门新型程序语言。从表面看来,它就像是英语速记和代数的结合。事实上,Fortran就是公式转换器(Formula Translator)的简称,同工程师及科学家日常使用的代数公式有很多相似之处。经过一段时间培训,他们就可以十分轻松地将科学和工程问题转化为计算机能够“理解”的语言。Unix
操作系统开发者之一的肯·汤普森(Ken Thompson)几年前表示,如果没有Fortran,早期阶段将有95%的程序员无法正常工作。
另一方面,Fortran的效率非常高,大大缩小了程序开发人员之间的水平差距,这在Fortran出现之前几乎无法想象。Fortran的高效率主要源于编译器的设计,它可以准确地“捕捉”开发人员的意图,并将其转化为计算机可以处理的方式。在Fortran项目中,巴库斯解决了两个基本问题:如何让程序语言更容易被用户掌握,以及如何构造底层代码。在整个工作生涯中,他一直在积极应对这两大挑战。IBM退休研究员弗朗西斯·阿伦 (rances Allen)表示:“巴库斯做出了巨大的贡献,影响了很多人的工作,包括我在内。”
早在青少年时期,巴库斯就是一个特立独行的人。他出生在特拉华州一个富裕的家庭,父亲是一名
股票经纪人。但是,他同家人的关系并不好,而且还是一名任性的学生。从弗吉尼亚大学退学后,巴库斯于1943年应征入伍。但由于在军队能力测试中表现优异,他被派遣到三所大学学习,内容包括工程和医学。
二战结束后,巴库斯对数学产生了浓厚的兴趣,并于1950年获得了哥伦比亚大学硕士学位。最终,他成为了IBM的一员。(马丁)
[22:55] [发表评论]
一个用knoppix改的,直接在windows下面运行的debian ,绝对绿色,只50M大小。
w5676:http://www.linuxsir.org/bbs/showthread.php?t=195148
本软件包专门是为那些想尝试一下linux,但却不方便安装linux的朋友使用。本软件包不需要安装绝对绿色只要解压后,运行linux.bat这个文件就可以了。qume是一个虚拟机软件。
下载地址:
http://cyber.86bb.com/soft/linux-tr127.zip
dsl.iso是一个极其精减但又不缺乏应用的linux livecd映像(damn small linux)。尽管这个操作系统软件包很小不能体现出linux操作系统极其强大的功能,但麻雀虽小五脏俱全,它是一个完整的操作系统。这也恰恰体现出在linux高效的特性,也绝对能让习惯windows的用户尝一下鲜。
hiweed:作者没有讲清楚,其实他就是把 Damn Small Linux拿过来了。
[22:55] [发表评论]
http://www.chedong.com/blog/archives/001121.html
mindmap:思维导图。是去年学到的一种整理思路的方法:将思路按照树状的结构进行线索的清理。FreeMind就是一个专门用于画mindmap的一个免费的桌面画图工具。
下载:FreeMind是用Java写成的,需要有Java 1.4 也有Windows下的安装工具。
http://sourceforge.net/project/showfiles.php?group_id=7118
使用:个人感觉FreeMind的几个优点
0 开源,免费,程序速度快;
1 画思路图最重要的一点就是随心所欲,而FreeMind的操作:包括节点的创建等大部分操作可以通过键盘操作,可以在思路不受任何干扰的情况下进行节点的扩展操作;
2 而完成后的思路树整理,也可以通过节点的托拽进行;
3 新版的增加了 undo 和各种图标操作;
更新:2月18日 被Solidot了一把;
以下是SF对FreeMind开发人员采访的:部分摘录
Why do you think your project has been so well received? 项目为什么成功
Juan: It is easy to use, intuitive, and powerful.
Dan: It fills an important gap, and in doing so, it has or at least had virtually no free or open source competition. Though it's multi-platform by means of Java, it is fast.
Christian: The usability is the most important goal of our software. FreeMind is intuitive to use and can be controlled nearly entirely by the keyboard. Thus, you can enter your thoughts quickly and then concentrate on the map itself. But for the times that the ideas slow down, there are enough little features to discover or to play with.
可用性是软件的关键,FreeMind初衷是完全通过键盘操作,这样你旧可以快速思考并完全关注在思路图本身上。但现在这个原则已经弱化一些,这样有很多更新奇的功能可以使用。
Where do you see your project going? 项目的发展方向
Dan: I imagine the project going toward an office suite, as strange as it may seem. But that does not prevent addition of features in the mind-mapping direction, like library of graphics or more visual aids.
Christian: My main goal is the usability. As Eclipse is the master of usability, I'd like to introduce more of its spirit into FreeMind.
我的目标是可用性,向Eclipse学习
What's on your project wish list? 项目的需求
Dan: FreeMind's wish list includes pasting of Rich Text Format into FreeMind, WYSIWYG editing of rich text including mathematical formulas, export to and import from more formats including presentation software like Microsoft PowerPoint and OpenOffice.org Impress, more searching options, and inclusion of bitmap images directly in mind maps (currently, images are linked only).
可视化的编辑器:可以编辑公式之类的,可以轻松的导入/导出到PowerPoint或者OpenOffice里,更多的搜索选项,直接包含图片,目前图片只能通过链接方式。
Cristian: My wish list contains scripting plus spreadsheet functionality and a good collaboration mode. But FreeMind has to remain easy and fast.
我的目标是增加幻灯片模式和更好的协同写作模式,FreeMind仍保持短小/快速。
Juan: More expressiveness (types of links, clouds, backgrounds, etc.), new icons, and better interaction.
What are you most proud of? 项目最自豪的一面
Dan: I'm most proud of the simplicity and elegance of the user interface. I am also proud to hear that the software has changed people's lives. It has changed my life for sure.
Juan: The software is easy to use.
Christian: My recent developments: undo and the plugin mechanisms, both via Design Patterns.
设计模式中学习到的“取消”和插件模式。
How do you coordinate the project? 如何协同开发
Our team consists of only a few people, so everybody knows what to do. We do not assign bugs. We use email and the main open discussion forum, and patches.
Do you work on the project full-time, or do you have another job? 花多少时间在项目上
We all work on it part-time.
If you work on the project part-time, how much time would you say you spend, per week, on it?
It varies between two or three to 12 to 20, depending on the week.
What is your development environment like? 开发环境
Christian: Mainly I develop using Debian Etch under x86 with Eclipse. On the road, I use my Powerbook running Mac OS X 10.3.
Dan: I run Microsoft Windows 98 and XP, using the standard Java compiler, no debugger, and XEmacs for source code editing.
Dimitri: 866MHz Intel Pentium III, 512MB RAM, Windows 2000, Eclipse 3.0, Java SDK 1.4.2 and 1.5.0, YourKit Java Profiler 4.0.1.
Juan: Eclipse with MTASC, Flashout, and ASDT.
Eclipse :)
Milestones: 里程碑
* 0.8.0 (2005-09-06)
* 0.7.1 (2004-02-15)
* 0.6.1 (2003-02-08)
* 0.5 (2002-08-24)
* 0.4 (2001-07-06)
Future Plans
* Add custom attributes
* Add filtering of nodes based on icons, texts, and values of custom attributes
* Add WYSIWYG HTML editing of long text nodes by means of Kafenio Java editor
* Add custom icons
How can others contribute?
Others can contribute suggestions and visual ideas. We need help testing the applications and reporting the results to the forums. We urgently need more documentation: tutorials and manuals. We can also use a Flash introduction, and patches that implement functions requested in Requests for Enhancements. Java developers are invited to discuss their enhancements in our Open Discussion forum. Anyone wanting to help in development is welcome.
[22:55] [发表评论]
安装后打开/usr/share/bookmarks/bookmarks.html即可
This package is a large collection of web links (more than 1,400), and shall constantly be updated and improved with your help. The German link collection for example is already very complete.
The numerous links are most useful to everybody, but of course especially for newbies to find their way to the vast Internet resources. Although this bookmark collection lists all kind of resources (e.g. search engines, links to online dictionaries, etc.), the majority of them are still computer and Linux oriented.
This package also includes the Perl script bookmarks-convert that can convert different bookmark formats (netscape, lynx, html).
[22:55] [发表评论]
sdcv 命令行的stardict
sdcv is simple, cross-platform text-base utility for work with dictionaries in StarDict's format.
Homepage: http://sdcv.sourceforge.net/
[22:55] [发表评论]
- HP-UX:B.11.23 U ia64 0368872039
- f90:HP F90 v2.8
- cc:HP aC++/ANSI C B3910B A.05.52 [Sep 05 2003]
因为安装脚本首先找gcc以及g++等,需要按照下面方式安装:
CC='cc +DD64' CXX='aCC +DD64' F9X='f90 +DD64 +noppu' ./configure --enable-fortran --enable-cxx --enable-hdf5v1_2
如果不加+noppu,则出现类似ld: Unsatisfied symbol "h5sset_extent_none_c_"错误,其原因在于cc -c时编译后函数接口名(比如h5sset_extent_none_c)没有添加_,但在f90编译的时候寻找的是添加_的函数接口,因此需要在cc或f90编译的时候添加编译参数解决。
查资料显示cc添加-Dextname会使得自动对每个函数接口添加_,但实际上没成功
man f90:
+[no]ppu Postpend [do not postpend] underscores at the end
of definitions of and references to externally
visible symbols (+ppu). The default is +noppu for
PA-RISC 32-bit object files and +ppu for PA-RISC
64-bit object files. The default is +ppu for
Itanium(R) processor family architecture 32-bit
and 64-bit object files.
A simple jotter (outline processor) for X11/gtk-gnome
gjots2 is a fairly simple jotter (outline processor) application for your
desktop.
You can use gjots2 to organize your jottings into a tree structure, adding
thoughts and miscellany as you go. You can get it to spit out HTML, XML,
postscript, pdf, man etc etc if you want (see the online manual for an example
of the HTML conversion).
I use it for all my notes on Unix, my personal bits and pieces, recipes and
even PINs and passwords (encrypted with ccrypt(1), openssl(1) or gpg(1)).
I also use it to write DOCBOOK XML documents.
You can use it to "mind-map" your compositions - write down all your thoughts
and then start organizing them into a tree. By manipulating the tree you can
easily reorder your thoughts and structure them appropriately.
It's a bit like the KDE program kjots but it uses the GTK-2 library.
Homepage: http://bhepple.freeshell.org/gjots/
[22:55] [发表评论]
第一次安装Unix,结果CDE登录不进去:
the deskdop messsafing system could not start.
1:choose ok to the login screen
!2:selecet failsafe session from the login screen's option menu and login
3:check to see that the desktop is properly installed ,the hostname is correct (/etc/hosts)and that the network is properly configured
原因是配置默认域名后,将hostname变为hostname.domain.com等,造成ping hostname不通。
解决办法:
创建/etc/nsswitch.conf内容为(如果没有则:cp nsswitch.file nsswitch.conf):
hosts: files [NOTFOUND=continue] dns
另外还要保证nsswitch.conf普通用户至少有读的权限
如果还想继续用dns解析,清修改dns服务器的配置:
编辑/etc/hosts文件,加入你机器的ip,hostname.domain,aliase
然后执行hosts_to_named -f param
在执行sig_named restart.
参见:http://h50069.www5.hp.com/e-Delivery3/Forum/WebUI/Messages/ShowTopic.aspx?RID=b476029e-7251-4abc-a0e8-e0ff652b073d
[22:55] [发表评论]
http://www.linuxsir.org/bbs/showthread.php?t=237516
http://rlehy.free.fr/
http://blog.bs2.to/post/EdwardLee/4321
给 Ubuntu 的 deb 包在这儿 http://rlehy.free.fr/eqe_1.2.0-1_all.deb
eqe: Linux LaTeX equation editor
This is a simple clone of the excellent LaTeX equation editor you can find on MacOS X. There's a zone to type LaTeX input, and it generates an image to represent it (color, font, and size are customisable). You can drag the image to other applications (like OpenOffice Impress, Mozilla, the Gimp). It also exports to any image format ImageMagick supports. It is free software, released under the GPL.
It is composed of two parts: eqedit, which is a command line tool that generates images from LaTeX input, and eqe which wraps eqedit into a graphical user interface.
The current version is 1.2.0. Since 1.1.1, the code and documentation have been cleaned, and an ability to customise the LaTeX template eqe/eqedit use has been added. You can consult the current README, FAQ, changelog, TODO, and copyright.
On the following screenshot, I'm in the process of dragging an equation (with transparent background) to an OpenOffice Impress presentation.
[22:55] [发表评论]
extract data from scanned graphs
g3data is used for extracting data from graphs. For example, graphs
are typically published in scientific journals without tables of the
actual data; g3data makes the process of extracting these data easy.
http://www.acclab.helsinki.fi/~frantz/software/g3data.php
UNIX 工作站上的数学工具
http://www.ibm.com/developerworks/cn/aix/library/au-unixmath.html?S_TACT=105AGX52&S_CMP=techcsdn
数学是科学之王
级别: 中级 William B. Zimmerly (bill@zimmerly.com), 自由撰稿人和知识工程师, Author
2007 年 5 月 08 日 UNIX 有许多工具可供使用,它们可以满足您的数学启蒙要求。其中有些工具是内置的;大多数则是下载保存的。本文将向您展示 UNIX 工作站上通往数学殿堂之路。
谈到数学,并不缺乏相关的计算机软件包。数学是程序员和分析人员的流行主题,从而导致了大量不同的工具可供选择。
数学是科学之王。数学工作站的商业使用群体非常庞大:从基础工程到设计创意,从基因治疗到天体导航,数学统治着整个世界。帮助人们解决他们所选领域的数学问题的计算机程序并不缺乏。本文的剩余部分将描述几个商业和开放源代码系统,它们在您所从事的领域可能证明是有价值的。所描述的所有系统都有专用于它们的网页,并包括在本文的参考资料部分。
数字计算器
UNIX 工作站中存在的最常用数学工具以计算器和更高级的电子表格程序(如 GNU Calc)的形式出现。算术规则非常简单,所有这些工具都忠实地遵守它们。几乎每个全功能的窗口管理工具包都至少突出体现了一个计算器,有时还有多个版本的计算器。
GNU 项目还提供了可供下载的计算工具。其中包括 GNU Calc、GNU Plot、ATLAS、Choose 和 4,000 多个其他面向数学的程序。请参见参考资料部分以获得指向完整列表的链接。
正如您在学校中级课程中所学习到的,数学所涉及的远不只是对数字的简单运算。数字占位符的符号表示形式——诸如 x、y 和 z 等变量、笛卡儿坐标、因素分解原理以及积分和微分世界——是一个丰富和多样性领域的一部分,该领域要求提供同样丰富和多样性的计算机资源。为这些任务而设计的程序领域的最常用名称是“计算机代数系统”(Computer Algebraic Systems,CAS)。同时存在商业和开放源代码 CAS 程序可供使用,下面将描述其中一些最常用程序。
但是,能够操作符号在大多数情况下还不足够。与原始坐标点值清单所能提供的信息相比,图形可以告诉我们更多信息。可用于计算机代数的大多数系统还突出体现了某种绘图机制,允许您可视化所标绘的数据。
可以使用许多计算机程序来帮助您解决数字和符号数学问题,但是还有些程序可以帮助您学习数学。MetaMath 系列程序就是一个理想的起点(请参见参考资料部分)。对于初学者或通常认为自己无意从事该领域的读者,本文描述的数学和程序也是引人入胜的。只需下载和试验其中一些程序就可能会激发您成为某方面的专家,从而比任何计算机游戏都更能充实您的生活。
商业软件包
下面是一些最常用商业 CAS 系统的简要概述。如果您对其中任何系统感兴趣,可以通过浏览它们的网站来找到更多信息,参考资料部分列出了所有这些网站。
Derive。Software Warehouse 是创建旨在运行于早期工作站计算机上的数学软件的最早先行者之一。该公司设立于 1979,当时 PC 革命刚起步,计算机代数系统还仅在使用分时终端的大型计算机系统上可用,该公司设计了一款名为 muMATH 的程序,以便 PC 用户能够超越简单的计算器,从而在有限的小型计算机硬件上处理符号数学问题。后来 muMATH 系统停止了使用,并被远远更高级的 Derive 系统所取代。Derive 是使用 Lisp 语言编写的,Lisp 是一种公共编程语言,尤其适合基于规则的处理,该处理是将一个抽象数学表达式变换为另一个表达式所必需的。
Fermat。这个专有共享软件计算机代数系统是为纪念已故最著名数学家之一 Pierre de Fermat 而命名的。它在各种各样的计算机系统上运行,尤其擅长于涉及任意长度整数和小数、图、矩阵和多项式代数的算术。Fermat 运行得非常快。据该公司的广告宣称,如果您需要计算 Q 上的 400 x 400 矩阵的特征多项式,那么您就需要 Fermat。
Maple。 Maple 数学软件包由 Waterloo Maple Inc. (Maplesoft) 开发并销售,最初由加拿大安大略省沃特卢的沃特卢大学的 Symbolic Computation Group 于 1981 年创建。Maple 是一款给人印象深刻的软件包,尤其擅长于三维绘图和以课本形式显示数学公式。它在一个动态工具中组合了界面和编程语言,可同时用于数字和符号问题的解答。许多大学已将 Maple 作为教授数学概念的标准工具;该公司提供此软件的学生版和专业版。
MathCAD。 PTC 是一家工程设施公司,于 2006 年收购了 MathCAD 的股权。MathCAD 在简单性方面与 Maple 类似,具有允许工程师在屏幕上输入和显示各种公式以及图形和文本的界面。MathCAD 组合了一个庞大的功能库,包括微积分、拉普拉斯变换、贝塞尔函数、统计和财务函数。
Mathematica。 Stephen Wolfram 的公司 Wolfram Research 于 20 世纪 80 年代晚期开发了 Mathematica,并重点强调了该工具的编程方面。它提供了过程式和函数式编程的灵活组合,并引入了自动重新编写公式的非确定性方法。它是一个强大的软件包,带有一个大型的多样性功能库,并提供了解决问题的独特多范例方法。
Reduce。 Reduce 是另一个通用计算机代数系统,是由许多科学家以协作方式开发完成的。该系统于 20 世纪 60 年代由 Anthony Hearn 创建。Reduce 现已成为科学界许多人的最爱。它以收取成本回收费用的方式进行分发,并且分发版中通常包括源代码。
开放源代码软件包
本部分研究开放源代码的世界。下面是一些最常用的开放源代码 CAS 系统的简要概述,这些系统的源代码在常用开放源代码许可证之一下授予许可。如果您对其中任何系统感兴趣,可以通过浏览它们的网站来找到更多信息,参考资料部分列出了所有这些网站。
Axiom。这个称为 Axiom 的开放源代码计算机代数系统是在修改后的 Berkeley Software Distribution (BSD) 许可证下发布的,它对于探索不同的数学算法非常有用。其突出特性是强类型的数学对象层次结构和对对象进行分组和控制的常用编程数据结构。Axiom 是使用自定义 A# 编程语言来编写的,对于有意探索算法设计的人来说是值得的工具。
CoCoA。 Computations in Commutative Algebra (CoCoA) 是另一个免费计算机代数系统,用于处理超大型整数、有理数和多项式。它为自定义 C++ 程序提供了有用的数学功能库。
Dcas。计算机代数领域几乎为数学研究的每个方面提供了丰富多彩的方法。存在许多在程序中表示数学对象的方法,而 Martin Johansen 的 Dcas 系统则证明了这些方法可以如何的千差万别。Dcas 突出体现了一种使用标识作为规则来操作代数表达式的方法。Dcas 非常值得一试;您可能会发现它是处理您所在领域问题的理想方法。
DoCon。 称作 Haskell 的函数式编程语言展示了一个用于符号数学的程序,名为 DoCon。按照该公司网站(请参见参考资料部分)上的文档,DoCon 实现了线性代数、多项式最大公约数、因素分解、Grobner 基,并支持域上的结构(constructions on domains)——分数、多项式、留数环,等等。它是开放源代码的,可能就是用于您正打算要编写的应用程序的恰当工具。
Eigenmath。Eigenmath 是由 George 使用 C 语言来编写的,是一个简单易用的计算机代数系统。由于有源代码可用,它成了刚开始探索计算机代数系统的学生的有用工具。
GiNaC。 GiNaC 与大多数其他计算机代数系统不同,它没有提供用于输入表达式的图形用户界面 (GUI),而是选择让用户以本机 C++(其实现语言)来输入表达式。它使用运算符重载这种本机 C++ 面向对象技术来实现代数语法。在这个由许多陌生名称所主宰的领域,它还具有一个比较陌生的名称!
Jscience。Jscience 软件包是一个强大的基于 Java的物理和数学函数库,它通过提供单个用于所有开发的体系结构,旨在帮助跨不同科学领域构建协同作用。至少可以这样说,这是个非常崇高的目标,但是也不排除该公司能够实现该目标。
Macaulay。Macaulay 计算机代数系统对于多项式计算非常有用,并重点强调 Grobner 基计算。它旨在解决具有简单语法并且已描述为代数机器语言 (algebraic machine language) 的问题。
Magma. Magma 在成本回收许可证下进行分发,是一个旨在解决代数问题的高性能系统。它突出体现了用于群论的功能以及群数据库、用于整数和多项式算术的渐近快速算法和几个用于高级运算的前沿库。
Mathomatic。此程序没有内置的编程功能,旨在用作简单的符号数学计算器。它可以在任何系统上使用 C 编译器、标准 C 库和 UNIX make 实用程序进行编译。
Maxima。与大多数计算机代数系统一样,Maxima 是使用 Lisp 语言编写的。Maxima 基于商业软件包 Macsyma,并包括一种完整的 ALGOL 风格的编程语言,对于教授计算机代数方面的编程概念最有用。它提供了任意精度的算术,使得整数和有理数的大小仅受到系统可用内存的限制。
PARI/GP。PARI 是快速运行的符号函数 C 语言库,用于因素分解、代数数论、椭圆曲线、矩阵和超越函数。GP 是交互式的 Shell,用于提供对 PARI 函数的访问。通过使用 gp2c 编译器,可以为问题域创建快速运行的程序。
SAGE。Software for Algebra and Geometry Experimentation (SAGE) 是使用 Python 语言编写的,并使用交互式的 Python Shell 作为其用户界面。SAGE 的独特之处在于,它能够用作其他各种计算机代数系统的集成器,从而允许用户利用不同软件包的各自强项。
SINGULAR。对于交换代数、代数几何和奇点理论,SINGULAR 计算机代数系统在软件包内核以及共享库中提供了大量的算法。它还包括详尽的文档。SINGULAR 是个值得一试的系统,如果您对奇点理论感兴趣则尤其如此。
Yacas。Yet Another Computer Algebra System (Yacas) 具有漂亮的用户界面和开放源代码软件的所有其他强项。该系统的输入可以是 ASCII 或 OpenMath;该程序还具有批处理模式。
数学是科学之王,帮助解决您在特定领域所面对的数学问题的工具并不缺乏。无论您是处理保险单定价的保险精算师,还是确定飞向冥王星的宇宙飞船最优路线的天体导航员,都有相关程序可帮助回答您的问题。
参考资料 学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- 检查以下数学资源:
FSF/UNESCO Free Software Directory
Axiom 主页
CoCoA 主页
Dcas 主页
Derive 页面
DoCon 主页
Eigenmath 主页
Fermat 主页
Jscience 主页
Macaulay 主页
Magma 主页
Maplesoft
Wolfram Research
Mathomatic 主页
Maxima 主页
MetaMath 主页
PARI/GP 主页
Reduce 主页
SAGE 主页
SINGULAR 网站
Yacas 主页
http和ftp方式都支持。每天早上7点自动更新
镜像来源于debian.ustc.edu.cn,只作了i386的镜像。
http://www.linuxsir.org/bbs/showthread.php?t=186683
俺们山东也有了,哈哈!
[22:55] [发表评论]
IDL> help,/device
Available Graphics Devices: CGM HP LJ NULL PCL PRINTER PS REGIS TEK X Z
Current graphics device: X
Segmentation fault
IDL> plot,findgen(100)
Segmentation fault
ati显卡驱动问题,安装fglrx-driver fglrx-control并重新配置xserver-xorg后正常工作
[22:55] [发表评论]
作者:W. Borgert
翻译:eTony
转载请注明源于www.linuxsir.org http://www.linuxsir.org/bbs/showthread.php?t=187074
最新版本请见:http://211.92.88.40/~tony/Blog/show.php?id=95
1. 获取帮助
man page 或 man bash:
读取每个命令的联机帮助 或 多数配置文件.
command [--help, -h]:
大多数命令的简要帮助.
/usr/share/doc/[package-name/]:
在这里查找所有文档, 以及包含具体选项的 README.Debian 文件
Web documentation
参考, 手册, FAQ, HOWTO, 等. http://www.debian.org/doc/
http://lists.debian.org 处的邮件列表
社区通常是非常用于的, 用于用户查询.
2. 安装
Installer
在http://www.debian.org/devel/debian-installer/ 处可以找到它的所有信息.
CD images
可以从 http://people.debian.org/cdimage/testing/ 处下载
boot: expert
例如, 设置DHCP, 或用LILO来代替GRUB
boot: linux26 或 boot:export26
安装时使用 2.6 内核
3. 错误
http://bugs.debian.org/处的错误跟踪
有关所有已经存在和修复的错误
特定软件包
查看 http://bugs.debian.org/package-name/, 使用 wnpp 查询新的软件包
reportbug
使用电子邮件提交一个错误
Reporting
在 http://www.debian.org/Bugs/Reporting 处提供教程
4. 配置
/etc/
所有的系统配置文件都在 /etc/ 目录下
nano files
默认的文本编辑器, 也可能是 emacs ,vi, joe
https://hostname:10000 处的 webmin
用于系统配置的浏览器接口, 其访问在 /etc/webmin/miniserv.conf 处定义
http://hostname:631 处的 CUPS
打印系统的浏览器接口
dpkg-reconfigure package-name 重新配置软件包, 例如console-common(键盘), locales(本地化)
update-alternatives options 设定默认启动命令
update-grub
在安装了新内核以后的操作
make-kpkg --initrd --version=2:my.1.0 --rootcmd fakeroot --uc --us kernel_image
当需要定制内核时, 从源码构建一个内核包, 需要安装 kernel-package
m-a a-i module kernel_image
创建并安装第三方模块(nvidia...), 需要安装 module-assistant
5. 守护进程和系统
/etc/init.d/file restart
重启一项服务, 系统守护进程
/etc/init.d/file stop
停止一项服务, 系统守护进程
/etc/init.d/file start
启动一项服务, 系统守护进程
halt, reboot, poweroff
停止, 重启, 关闭系统
/var/log/
所有的日志文件都在这个目录下
/etc/default/
一些守护进程和服务的默认值
6. 重要的shell命令
cat files 在屏幕上显示文件内容
cd directort
cp files dest 复制文件和目录
echo string 将字符串回显至屏幕
gzip, bzip2 [-d] files 压缩, 解压 文件
less files 显示文件的内容
ls files 显示文件列表
mkdir directory-names 创建目录
mv file1 file2 移动, 重命名文件
rm files 删除文件
rmdir dirs
删除空目录
tar [c] [x] [t] [z] [j] -f file.tar [files]
创建, 解压, 列出归档文件的内容, z,j 是针对 .gz 和 .bz2 的
find directories expressions
查找文件, 如 -name name or -size +1000, 等
grep search-string files
在文件中, 搜索匹配字符串
kill [-9] number
对进程发送信号(例如, 终止它)
ln -s file link
为一个文件建立一个符号连接
ps [options]
显示当前进程
su -[username]
变成另一用户, 如 root
sudo command
普通用户以root的身份执行一个命令, 参阅 /etc/sudoers
command >file
将命令的输出以覆盖的方式输出到文件
command >>file
将命令的输出添加到文件的尾部
cmd1 |cmd2
把命令1的输出作为命令2的输入
command <file
把文件的内容作为命令的输入
7. APT
apt-get update
从 /etc/apt/source.list 中源的更新软件包列表, 当源的内容改变或不能确定时,运行
apt-cache search search-string 查找描述如 search-string 的软件包
apt-cache policy package-name 显示软件包的版本和优先级
apt-cache show package-name
显示文件的描述信息
apt-cache showpkg package-name 显示软件包的依赖关系
apt-get install package-name
从源安装软件包及其所有依赖包
apt-get upgrade
将当前安装的软件包更新到最新
apt-get dist-upgrade
如 apt-get upgrade, 但是自动解决冲突
apt-get remove package-names
删除软件包, 及其所有依赖它的包
apt-cache depends package-names
列出指定包的所有依赖包
apt-cache rdepends package-names
列出依赖于给定包的所有软件包
apt-file upgrade
从源更新内容列表, 详见 apt-get upgrade
apt-file search file-name
查找包含文件的然件包
apt-file search package-name
列出软件包的内容
auto-apt
如果需要可以自动安装软件包, 可以替代 apt-file, 需要安装 auto-apt.
aptitude
APT 的控制台接口, 需要安装 aptitude
synaptic
APT的GUI接口, 需要安装synaptic
8. DPKG
dpkg -l [names]
列出软件包
dpkg -I pkg.deb
显示软件包相关信息
dpkg -c pkg.deb
列出软件包的内容
dpkg -S filename
显示哪个包包含这个文件
dpkg -i pkg.deb
安装软件包
deborphan
显示没有被依赖(孤儿)的软件包, 需要安装deborphan
debsums
审计安装的软件报, 需要安装debsums
dpkg-divert [option] file
重写一个软件包的版本
dpkg --compare-versions v1 gt v2
比较版本, 用 echo $? 检查
dpkg-query -W --showformat=format
查询已安装软件包, 格式 例如'$ $ $\n'.
dpkg --get-selections <file
将选择的软件包写入一个文件
dpkg --set-selection <file
从文件读取软件包选择
9. 网络
/sbin/ifconfig
配置网络接口
/etc/network/
网络配置文件, 多数与接口有关.
ifup, ifdown device
启动,停止网络接口, 根据上边的文件
ssh -X user@host
登入别的机器
scp files user@host:path
将文件复制到别的机器上
catior IOR
View components of stringified CORBA IOR.
nameclt list[context]
列出CORBA名称服务器上的上下文和对象
10. WEB服务器(Apache2)
/etc/apache2/
/etc/apache2/sites-enabled/default
定义默认虚拟主机
/etc/apache2/mods-available/
包含有效的模块文件. 若要启用一个模块, 在 /etc/apache2/mods-available/创建符号连接
11. 数据库(postgreSQL)
createdb
创建一个新数据库
dropdb
删除一个数据库
createuser
创建一个数据库用户
dropuser
删除一个数据库用户
/etc/postgresql/pg_hba.conf
客户端访问配置文件
ALTER USER name WITH PASSWORD 'password';
通过SQL控制台 psql 来修改密码
12. 文件和打印服务器(SAMBA)
/etc/samba/smb.conf
主配置文件
smbclient
浏览 SMB 网络资源, 例如, 下载, 上载文件
[22:55] [发表评论]
退出 Thunderbird,然后修改 prefs.js,在
user_pref("mail.server.server2.hostname", "mail.YourImapProvider.com");
行后面添加 user_pref("mail.server.server6.trash_folder_name", "IMAP 服务器上正确的名字");
比如在科大服务器上为 Junk,详见:http://kb.mozillazine.org/IMAP_Trash_folder
By default Thunderbird (and the Mozilla Suite) assume that your Trash folder is called "Trash" and not some other name, such as "Deleted Items". This can sometimes be a problem with IMAP accounts, if your IMAP server uses a different name for the dedicated Trash folder. In such cases, Thunderbird will likely create its own Trash folder (named "Trash"), while your mail server will still be using the other folder (e.g., "Deleted Items"), and you may see both at the same time in the Thunderbird folders pane.
To specify a different Trash folder for an IMAP account in Thunderbird:
1. Completely exit Thunderbird if it is running.
2. Make a temporary backup copy of your profile folder (or at least these files inside it: "prefs.js" and, if it exists, "user.js").
3. Open your "prefs.js" file with a text editor such as Notepad to find the server# used to represent your IMAP account. It could be "server2", "server5", "server7", or some other number depending on your own individual account setup. Look for a line similar to this, corresponding to your own IMAP acccount:
user_pref("mail.server.server2.hostname", "mail.YourImapProvider.com");
4. Insert a line like the following into "user.js", with the correct server# and correct name for the Trash folder:
user_pref("mail.server.server#.trash_folder_name", "<correct Trash name>");
For example:
user_pref("mail.server.server2.trash_folder_name", "Deleted Items");
If you want to use "Geloscht" (German for Trash) you would have to write it in the user_pref as "Gel&APY-scht", since the German Umlaute has to be encoded differently.
5. Restart Thunderbird. You should now see the new Trash folder (e.g., "Deleted Items") showing the trash can icon. (If not, exit and restart Thunderbird.) If the old Trash folder is still showing, you should now be able to delete it. If you can't delete it through Thunderbird, then delete it though the account's webmail interface.
6. If you deleted the Trash folder in the web frontend of your mail provider, you may need to cancel the IMAP folder subscriptions, too. It may take a while for the subscription changes to take effect.
- 在/etc/hosts中添加客户端主机的主机名和地址,取消反查
- 置空/etc/resolv.conf,取消用DNS服务器反查
- 在/etc/resolv.conf中设定正确的DNS服务器
- 在/etc/ssh/sshd_config中增加一行:UseDNS no,取消反查
利用 EasyWine 安装 Internet Explorer6 成功
由于某些网站(比如工行)必须用 IE 才成,被逼无奈,只好用 wine 模拟,安装 IE6 非常简单,参见:http://www.easywine.org/
中文输入法:
它使用xim输入法没问题
GTK_IM_MODULE="xim" ; export GTK_IM_MODULE
QT_IM_MODULE="xim" ; export QT_IM_MODULE
export XIM=SCIM
export XIM_PROGRAM=SCIM
export QT_IM_MODULE="xim"
export XMODIFIERS="@im=SCIM"
export GTK_IM_MODULE="scim"
scim -f x11 -d&
虽然wine 很久之前就已经支持xim 中文输入,但是我一直都不能使用。 一直到现在的w
ine 0.9.11 都不行,后来google 了一下,找到只要在scim 的输入法设定中,把「介面
」->「 全域设定」->「在输入法客户端视窗嵌入预先编辑字串」关闭即可
[22:55] [发表评论]
或者在vim的runtimepath中添加/usr/share/vim/addons
比如在~/.vimrc中:
set runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim71,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after,/usr/share/vim/addons
参见:/usr/share/doc/vim-common/changelog.Debian.gz
debian/runtime/debian.vim.in
- removing /usr/share/vim/addons/{,after/} from the vim runtimepath:
according to the VIM policy addons should not be enabled per default,
but manually using vim-addon-manager
# 1、此脚本适用于debian系统,测试版本10.0.025下不包含ide的ifort、icc、idb成功
# 2、解压缩编译器包之后到data目录下用root权限执行:脚本名 rpm包名
# 3、主要作用:
# a、利用alien安装rpm
# b、修改编译命令及环境设置脚本,并将原始文件备份为对应的.bak文件
# c、设置/etc/profile,最后调用vim确认修改/etc/profile
MOD( )
FILE=$INSTALLDIR/bin/$1
cp $FILE $FILE.bak
chmod 644 $FILE.bak
sed -i -e "1a INSTALLDIR=$INSTALLDIR" -e 's//$INSTALLDIR/g' $FILE
if [ $# != "1" ]
echo "Usage : install-intel-compiler "
exit 1
elif [ $1 = "-h" ]
echo "Usage : install-intel-compiler "
exit 0
if [ ! -f $1 ]; then
echo "$1 does not exist."
exit 2
if [ ${1##*.} != rpm ]; then
echo "$1 is not a rpm file"
exit 3
alien -i $1
VERSION=`echo $1 | awk -F- '{print $3}'`
for i in cc ifort idb
echo $1 | grep $i >/dev/null
if [ $? = 0 ]
if [ $i = ifort ]
COMP=fc
COMP=$i
break
INSTALLDIR=/opt/intel/$COMP/$VERSION
case $COMP in
CMD=ifort
MOD $CMD
MOD ${CMD}vars.sh
MOD ${CMD}vars.csh
CMD=icpc
MOD $CMD
CMD=icc
MOD $CMD
MOD ${CMD}vars.sh
MOD ${CMD}vars.csh
CMD=idb
MOD ${CMD}vars.sh
MOD ${CMD}vars.csh
echo ". $INSTALLDIR/bin/${CMD}vars.sh" >>/etc/profile
vim /etc/profile
发信人: oseen (七是日期的期), 信区: TeX
标 题: Debian teTeX3.0 字体配置新工具tex-cjkfonts
发信站: 水木社区 (Tue Mar 7 13:19:28 2006), 站内
两天加两个晚上的工作,呵呵
写这个脚本的缘起就是上边的文章,在这里就不重复了。
由CJK字体生成相应的用于teTeX3.0的配置文件,使之可用于latex / dvipdfm /
dvipdfmx / xdvi / pdflatex等. 其中pdflatex/dvipdfm/xdvi使用type1字
体,dvipdfmx使用truetype字体
当前支持的编码是utf8和gbk
1.(强烈推荐)先安装好dvipdfmx
2.下载附件,执行dpkg -i tex-cjkfonts_0.3-1_i386.deb
可能会提示缺包,按提示逐一apt-get装上
3.主要的命令是make-fpkg和make-fpkg-sys,不带任何参数执行可输出调用方法
这个取名仿照了debian的make-jpkg/make-kpkg命令,取意"make font
package", make-fpkg用于生成用户主目录下的配置文件,make-fpkg-sys用于
生成系统texmf下的配置文件
4.make-fpkg在当前目录下生成一个tar.gz压缩包,解压到$HOME后执行
mktexlsr;
update-updmap;
updmap;
即可使用字体
5.make-fpkg-sys在当前目录下生成一个deb包,用dpkg -i 安装这个deb包即可
为中易公司(zhongyi)的simsun.ttf生成gbk编码的,名称为song的个人配置文件:
make-fpkg /usr/share/fonts/truetype/simsun.ttf gbk song zhongyi
为方正公司(founder)的fzkai.ttf生成utf8编码的,名称为kai的系统级配置文件:
make-fpkg-sys /usr/share/fonts/truetype/fzkai.ttf utf8 kai founder
值得提一下的是,最后一个参数是字体的制造商名字,虽然并非很有用,但加上了可严
格符合TDS 1.1标准
希望debian的tex用户可以帮我测试一下,尤其是使用gbk编码的用户. bug报告可以
直接发到我的smth邮箱里
已知的bug(汗一下,还真不少)
1. latex-dvips-ps2pdf乱码,原因可能在ttf2pt1,查找中
2. latex-dvipdfm无法显示斜体
3. latex-dvipdfmx生成的pdf在windows下用adobe reader 可以正常显示。
在linux下用adobe reader 7.0有时不能显示字体(编码正确,文字虽然不能
看见但可复制出来)。
推荐的pdf生成方法:
latex -> dvipdfmx, 文件体积小,在windows下显示效果很好,可复制粘贴
pdflatex, 加上ccmap包后也可以复制粘贴
参考了李果正, sk8er, intron的若干脚本,谨表谢意^_^
[22:55] [发表评论]
http://www.linuxaid.com.cn/infos/1/8/187251750.shtml
上周五,安全专家报出Linux和Unix中广泛应用的一种压缩格式中存在一个很重要的漏洞,黑客可以利用此漏洞进入机器。虽然针对zlib库的补丁目前还没有,但几个Linux和BSD发行商已经推出了他们自己的解决办法。
这个bug影响zlib当前的版本,1.2.2。根据丹麦的 Secunia安全公司发出的警告,黑客可以利用这个bug制造DoS (Denial-of-Service,拒绝服务)攻击,而DoS攻击利用这个库可能摧毁任何应用程序,或者允许攻击者远程种植恶意代码。Secunia 公司定级zlib漏洞为“非常关键”级别,是该公司第二最严重级别。
这个漏洞是由Gentoo Linux的一位研究员在上周三发现的,他在自己公司的网站上贴出了一则警告。因为开源zlib计划不能给出任何补丁,Linux的商业卖主都已经按版本不同分别升级了自己发布的系统。Debian、FreeBSD、Gentoo、OpenBSD、RedHat和SuSE都发布了各自的补丁。
p>2004年的8月在zlib压缩格式中也发现了一个类似的(虽然不如这个危险)DoS漏洞,1.2.2版的补丁在10月才发布。
[22:55] [发表评论]
Fortran 编程人员经常需要维护一种以上的代码版本,或者在各种环境下运行代码。对于编程人员来说,最容易的解决办法是保留单个源文件,而所有代码变更均相互穿插在该文件中,这样就可以轻松地提取出任何版本。这样对应用到所有版本的修改只需执行一次即可。
源代码预处理程序很早以前就被用于提供这些功能。它们允许用户在源代码中插入指令语句来影响预处理程序的输出。
通常,这些特殊指令可能作为编译器的注释行出现。一般情况下,源代码预处理程序允许用户定义特殊变量和逻辑构造来有条件地控制文件中哪些源代码行将被传送给编译器,哪些行将被略过。此外,预处理程序的源代码行编辑功能允许用户根据所定义的字符串变量的值来指定如何更改源代码。
在历史上,曾经将标准 C 编译器的源代码预处理程序 cpp 用于向 Fortran 编程人员提供这些功能。然而,cpp 受到 C 语言语法和源代码行格式的紧密束缚,以致于没有详细审查就不能使用。建议的 Fortran 预处理程序 fpp 将提供特定于 Fortran 的源代码功能(C 编程人员曾经期望在 UNIX 环境下实现这些功能)。
fpp 的某些功能可能会重新应用到其他工具中。fpp 的一个实现必须解析和分析 Fortran 源代码、对 Fortran 表达式求值并生成 Fortran 输出。如果其他工具需要提供一个增强型 Fortran 程序开发环境,这些功能将是这些工具的构件。
以下部分更详细地描述了 fpp 的功能。有关完整的详细信息,请参见 fpp(1) 手册页。
fpp 输入源代码
fpp 输入源代码是散布着预处理程序语句的标准 Fortran 代码。所有预处理程序语句均以一个特殊字符 # 开头。它只能在一行的第一个字符位置出现。# 后必须紧跟预处理程序命令的文本。
预处理程序指令可能出现在 Fortran 注释内。预处理程序也会修改 Fortran 注释内的文本。
预处理程序能够对固定格式和自由格式的源代码进行操作。固定格式的源文件以 ".F" 为扩展名,而自由格式的源文件以 ".F90" 为扩展名。请注意,固定格式文件命名约定适用于 FORTRAN 77 和 Fortran 90。在调用适当的编译器之前,会首先预处理带有此类扩展名的文件。
如果宏展开或者字符串替换导致一行中列的宽度超过 72 列(固定格式)或者 132 列(自由格式),预处理程序将生成适当的续行。
预处理程序变量
预处理程序变量由指令定义并具有一个字符串值。fpp 将在源代码中任何适合替换的地方用变量的值来替换所出现的变量。变量也会出现在条件指令中,控制传送给输出的源代码行的选择。
#define name string
将变量 "name" 的值定义为 "string","name" 标记的每个实例 [超出 IMPLICIT 语句边界,FORMAT 语句和串文字中的文本] 的结果被 "string" 照字面意义替换。
注意:如果是 IMPLICIT 语句边界和 FORMAT 语句中的文本,则宏只有在与该范围内的有效文字相冲突的情况下才会扩展。
还允许使用参数执行类似于“宏”的内联替换:
#define name (arg1 [,arg2]...) string-with-args-inserted
#define SOLARIS_2 .TRUE. #define CONVERT(TO_FARENHEIT) ((TO_FARENHEIT*9)/5)+32
预处理程序变量在从定义点到编译单元结束的整个范围内有效。(即文件的全局范围)
可以使用以下内容通过显式方式取消预处理程序变量的定义
#undef name
Fortran 预处理程序接受 /* 与 */ 之间包含的 C 样式注释。
源代码的条件选择
这是在 cpp 条件代码构造基础上进行建模的。
#if condition1 block1 [#elif condition2 block2 ] ... [#else blockn ] #endif
#ifdef name block #endif #ifndef name block #endif
这些条件是包含预处理程序变量(由 #define 语句指定)的 fpp 表达式。请注意,条件可在圆括号内指定。这些 fpp 表达式是 cpp 表达式的超集,它们可以计算 Fortran 逻辑型。因此,".TRUE." 在 fpp 表达式中是有效的。预处理程序会评估这些条件以获得一个真或者假的结果。这些表达式无法计算浮点值或者包含内在函数。
#define SOLARIS_2 .TRUE. #if (SOLARIS_2) CALL solaris_2 (X,Y,Z) #else CALL solaris_1 (X,Y,Z) #endif
有时,在一个文件中收集预处理程序变量是很方便的。可使用以下语句来实现
#include filename
允许嵌套 #include。#include 语句不能出现在续行中(即包含文件中的第一个语句不能是续行)。
预处理程序内在函数
defined(name) 提供了一个名称的定义状态。根据该名称是否要定义来决定返回的是 TRUE 还是 FALSE。这通常在 #if 语句中使用:
#if defined(BIG_MODEL)
命令行选项
fpp 通常从 Fortran 编译器驱动程序中调用。fpp 也可以独立调用。以下是 fpp 接受的一些选项:
-Dname
将 name 定义为 1。这与 fpp 当前正在处理的源文件中出现的 #define name1 这一行相同。
-Dname=def
这与 fpp 当前正在处理的源文件中出现的 #define name def 这一行相同。
-Idirectory
对于名称不是以 "/" 开头的 #include 文件,将 directory 插入搜索路径中。directory 被插入在 "include" 目录标准列表的前面。因此,对于其名称用双引号 (") 括起来的 #include 文件,首先在包含 #include 行的文件的目录中搜索,然后在以 -I 选项命名的目录中搜索,最后在标准列表内的目录中搜索。
-Uname
删除 name 的所有初始定义,其中 name 由预处理程序进行预定义。
-Ydirectory
搜索 #include 文件时使用 directory 来替换目录的标准列表。
采用 Linux 集群技术的高性能计算的基本概念简介
http://www-128.ibm.com/developerworks/cn/linux/l-cluster1/
Aditya Narayan , 创始人, QCD Microsystems
2005 年 10 月 17 日
高性能计算(HPC)正在变得越来越简单,这是由于两个原因:开放源码软件概念的采用,以及集群技术的精炼。本文是两篇系列文章中的第一篇,讨论了集群的类型、用途以及在 HPC 领域变得更加流行的原因、HPC 基础以及 Linux 在 HPC 中的角色。
现在 Linux 集群在很多领域都已经变得非常流行了。随着集群技术的出现以及开放源码软件日益得到采纳,现在只需要传统高性能机器的很少一部分成本就可以构建一台超级计算机了。
这两篇系列文章简要介绍采用 Linux 集群技术的高性能计算(HPC)的概念,展示如何构建集群并编写并行程序。本文是两篇系列文章中的第一篇,讨论了集群的类型、用途、HPC
基础、Linux 在 HPC 中的角色以及集群技术日益增长的原因。第 2 部分将介绍并行算法的知识,并介绍如何编写并行程序、如何构建集群以及如何进行基准测试。
HPC 体系架构的类型
大部分 HPC 系统都使用了并行 的概念。有很多软件平台都是面向 HPC 的,但是首先让我们先来了解一下硬件的知识。
HPC 硬件可以分为 3 类:
对称多处理器(SMP)
向量处理器
对称多处理器(SMP)
SMP 是 HPC 采用的体系架构之一,其中有多个处理器会共享内存。(在集群中,这也称为 大规模并行处理器(massively parallel processor,MPP),它们并不需要共享内存;稍后我们将更详细介绍这方面的内容。)与 MPP 相比,SMP 通常成本更高,而且可伸缩性较差。
向量处理器
顾名思义,在向量处理器中,CPU 被优化以便很好地处理向量数组的运算。向量处理器系统的性能很高,在 20 世纪 80 年代到 90 年代早期一度在 HPC 体系架构中占有统治地位,但是最近几年以来,集群变得更加流行了。
集群是最近几年中最为主要的一种 HPC 硬件:集群(cluster) 就是一组 MPP 的集合。集群中的处理器通常被称为 节点,它具有自己的 CPU、内存、操作系统、I/O 子系统,并且可以与其他节点进行通信。目前有很多地方都使用常见的工作站运行 Linux 和其他开放源码软件来充当集群中的节点。
接下来您将看到这些 HPC 硬件之间的区别,但是首先让我们从集群开始。
术语“集群(cluster)”在不同的地方可能会意味着不同的意义。本文重点介绍以下三种类型的集群:
故障迁移集群
负载均衡集群
高性能集群
故障迁移集群
最简单的故障迁移集群有两个节点:一个节点是活动的,另外一个节点是备用的,不过它会一直对活动节点进行监视。一旦活动节点出现故障,备用节点就会接管它的工作,这样就能使得关键的系统能够持续工作。
负载均衡集群
负载均衡集群通常会在非常繁忙的 Web 站点上采用,它们有多个节点来承担相同站点的工作,每个获取 Web 页面的新请求都被动态路由到一个负载较低的节点上。
高性能集群
高性能集群用来运行那些对时间敏感的并行程序,它们对于科学社区来说具有特殊的意义。高性能集群通常会运行一些模拟程序和其他对 CPU 非常敏感的程序,这些程序在普通的硬件上运行需要花费大量的时间。
图 1 解释了一个基本的集群。本系列文章的第 2 部分将展示如何创建这种集群,并为其编写程序。
图 1. 基本的集群
网格计算
是一个更为广泛的术语,通常用来代表利用松耦合系统之间的协作来实现面向服务的架构(SOA)。基于集群的 HPC
是网格计算的一个特例,其中节点之间都是紧耦合的。网格计算的一个成功的、众所周知的项目是
SETI@home,即搜索外星智慧的项目,它使用了大约一百万台家用 PC 在屏保时的空闲 CPU
周期来分析无线电天文望远镜的数据。另外一个类似的成功项目是 Folding@Home 项目,用来进行蛋白质的折叠计算。
高性能集群的常见用途
几乎所有的产业界都需要快速的处理能力。随着越来越便宜而且快速的计算机的出现,更多公司表现出了对利用这些技术优势的兴趣。人们对于计算处理能力的需求是没有上限的;尽管处理能力在迅速提高,但是人们的需求仍然超出计算能力所能提供的范围。
生命科学研究
蛋白质分子是非常复杂的链,实际上可以表示为无数个 3D 图形。实际上,在将蛋白质放到某种溶液中时,它们会快速“折叠”成自己的自然状态。不正确的折叠会导致很多疾病,例如 Alzheimer 病;因此,对于蛋白质折叠的研究非常重要。
科学家试图理解蛋白质折叠的一种方式是通过在计算机上进行模拟。实际上,蛋白质的折叠进行得非常迅速(可能只需要 1
微秒),不过这个过程却非常复杂,这个模拟在普通的计算机上可能需要运行 10
年。这个领域只不过是诸多业界领域中很小的一个,但是它却需要非常强大的计算能力。
业界中其他领域包括制药建模、虚拟外科手术训练、环境和诊断虚拟化、完整的医疗记录数据库以及人类基因项目。
石油和天然气勘探 震
动图中包含有大陆和洋底内部特性的详细信息,对这些数据进行分析可以帮助我们探测石油和其他资源。即便对于一个很小的区域来说,也有数以 TB
计的数据需要重构;这种分析显然需要大量的计算能力。这个领域对于计算能力的需求是如此旺盛,以至于超级计算机大部分都是在处理这种工作。
其他地理学方面的研究也需要类似的计算能力,例如用来预测地震的系统,用于安全性工作的多谱段卫星成像系统。
图像呈现 在
工程领域(例如航天引擎设计)操纵高分辨率的交互式图像在性能和可伸缩性方面历来都是一种挑战,因为这要涉及大量的数据。基于集群的技术在这些领域已经取
得了成功,它们将渲染屏幕的任务分割到集群中的各个节点上,在每个节点上都利用自己的图形硬件来呈现自己这部分屏幕的图像,并将这些像素信息传送到一个主
节点上,主节点对这些信息进行组合,最终形成一个完整的图像。
这个领域中的例子目前才不过是冰山一角;更多的应用程序,包括天体物理模拟、气象模拟、工程设计、金融建模、证券模拟以及电影特技,都需要丰富的计算资源。对于计算能力越来越多的需求我们就不再进行介绍了。
Linux 和集群如何改变了 HPC
在基于集群的计算技术出现之前,典型的超级计算机都是向量处理器,由于它们全部采用专用的硬件和软件,因此成本通常会超过一百万美元。
随着 Linux 和其他免费的集群开放源码软件组件的出现和常用硬件处理能力的提高,这种情况现在已经发生了很大的变化。您可以利用少量的成本来构建功能强大的集群,并能够根据需要来添加其他节点。
GNU/Linux 操作系统(Linux)已经在集群中得到了大量的采用。Linux
可以在很多硬件上运行,并且具有高质量的编译器和其他软件,例如并行文件系统和 MPI 实现在 Linux 上都是免费的。采用
Linux,用户还可以针对自己的任务负载对内核进行定制。Linux 是构建 HPC 集群的一个非常好的平台。
理解硬件:向量机与集群
要理解 HPC 硬件,对向量计算和集群计算进行一下比较是非常有用的。二者是互相竞争的技术(地球模拟器 是一台向量超级计算机,目前仍然是最快的 10 台机器之一)。
从根本上来讲,向量处理器和标量处理器都是基于时钟周期来执行指令的;使它们产生区别的是向量处理器并行处理与向量有关的计算的能力(例如矩阵乘法),这在高性能计算中是非常常见的。为了展示这一点,假设您有两个双精度的数组 a 和 b,并且要创建第三个数组 x,比如 x[i]=a[i]+b[i]。
任何浮点操作,例如加法和乘法,都可以通过几个步骤来实现:
进行指数调整
对结果进行取整检查等
向量处理器通过使用 流水线(pipeline) 技术在内部对这些步骤进行并行处理。假设在一个浮点加法运算中有六个步骤(与 IEEE 算术硬件一样),如图 2 所示:
图 2. IEEE 算术硬件中的六级流水线
向
量处理器可以并行处理这六个步骤 —— 如果第 i 个数组元素是在第 4 个步骤中被添加的,那么向量处理器就会为第 (i+1) 个元素执行第 3
个步骤,为第 (i+2) 个元素执行第 2 个步骤,依此类推。正如您可以看到的一样,对于一个 6 级的浮点加运算来说,加速比非常接近于
6(在开始和结束时,这六个步骤并不是都处于活动状态的),因为在任何给定的时刻(图 2
所示的红色),这些步骤都是活动的。这样做的一大优点是并行处理都是在幕后进行的,您并不需要在程序中显式地进行编码。
对于大部分情况来说,这六个步骤都可以并行执行,这样就可以获得几乎 6 倍的性能提高。箭头表示了对第 i 个数组元素所进行的操作。
与向量处理相比,基于集群的计算采用的是完全不同的一种方法。它不使用专门优化过的向量硬件,而是使用标准的标量处理器,但是它采用了大量的处理器来并行处理多个计算任务。
集群的特性如下:
集群都是使用常见的硬件进行构建的,其成本只是向量处理器的很小一部分。在很多情况中,价格会低一个数量级以上。
集群使用消息传递系统进行通信,程序必须显式地进行编码来使用分布式硬件。
采用集群,您可以根据需要向集群中添加节点。
开放源码软件组件和 Linux 降低了软件的成本。
集群的维护成本很低(它们占用的空间较小,耗费的电力较少,对于制冷条件的需求较低)。
并行编程和 Amdahl 法则
当在集群上实现高性能环境时,软件和硬件就需要联合起来工作。程序在编写时必须要显式地利用底层硬件的优点,如果现有的非并行程序不能很好地在集群上运行,那么这些程序必须重新进行编写。
并行程序一次要执行很多操作。其数量取决于目前正在解决的问题。假设一个程序所花费的时间中有 1/N 是不能并行处理的,那么剩余的 (1-1/N) 就是可以并行处理的部分(请参看图 3)。
图 3. Amdahl 法则
从
理论上来说,您可以采用无数的硬件来处理并行执行的部分,甚至在接近 0
的时间内完成这些任务,但是对于串行部分来说,这样做不会有任何提高。结果是,可以实现的最佳结果是使用原来的 1/N
的时间来执行整个程序,但是不可能再快了。在并行编程中,这个事实通常就称为 Amdahl 法则。
Amdahl 法则揭示了使用并行处理器来解决问题与只使用一个串行处理器来解决问题的加速比。加速比(speedup) 的定义如下:(使用多个处理器)并行执行程序所需要的时间除以(使用一个处理器)串行执行程序所需要的时间:
S = ------
其中 T(j) 是在使用 j 个处理器来执行程序时所需要的时间。
在图 3 中,如果采用足够多的节点来进行并行处理,那么 T'par 就可以非常接近于 0,但是 Tseq 却不会变化。在最好的情况中,并行程序也不可能快到原来的 1+Tpar/Tseq。
在编写并行程序时真正困难的事情是使 N
尽量大。但是这件事情却有两面性。通常都是要试图在更为强大的计算机上来解决更大的问题,通常随着所解决问题的规模的增大(例如试图修改程序并提高可并行
的部分来优化地利用可用资源),所花费在串行部分上的时间就会减少。因此,N 值就会自动变大了。(请参看本文后面 参考资料 部分所给出的 Amdhal 法则推论。)
并行编程的方法
现在让我们介绍两种并行编程的方法:分布式内存方法 和 共享式内存方法。
分布式内存方法
此处我们考虑一种主从模式非常有用:
主节点负责将任务划分到多个从节点上。
从节点负责处理自己所接收到的任务。
如果需要,从节点之间会相互进行通信。
从节点将结果返回给主节点。
主节点收集结果,并继续分发任务,依此类推。
显然,这种方法的问题就产生于分布式内存的组织。由于每个节点都只能访问自己的内存,如果其他节点需要访问这些内存中的数据,就必须对这些数据结构进行复制并通过网络进行传送,这会导致大量的网络负载。要编写有效的分布式内存的程序,就必须牢记这个缺点和主从模型。
共享式内存方法
在共享式内存方法中,内存对于所有的处理器(例如
SMP)来说都是通用的。这种方法并没有分布式内存方法中所提到的那些问题。而且对于这种系统进行编程要简单很多,因为所有的数据对于所有的处理器来说都
是可以使用的,这与串行程序并没有太多区别。这些系统的一个大问题是可伸缩能力:不容易添加其他处理器。
并行编程(与所有的编程技术一样)与其他科学一样,都是一门艺术,总会留下一定的空间来进行设计的改进和性能的提高。并行编程在计算中有自己特殊的地位:本系列文章的第 2 部分将介绍并行编程平台,并给出几个例子。
当文件 I/O 成为瓶颈时怎么办?
有些应用程序通常会需要从磁盘中读写大量的数据,这通常是整个计算过程中速度最慢的一个步骤。更快的硬盘驱动器能够帮助解决一些问题,但是有时这是不够的。
如果一个物理磁盘分区是在所有节点之间共享的(例如使用 NFS),就像是在 Linux 集群中经常采用的方法一样,那么这个问题就会变得更加明显了。此时就是并行文件系统的用武之地了。
并行文件系统(Parallel filesystem)
将数据存放在分布在多个磁盘上的文件中,这些磁盘连接到集群中的多个节点上,这些节点称为 I/O
节点。当一个程序试图读取某个文件时,可以并行地从多块磁盘上分别读取这个文件的某些部分。这可以降低某个磁盘控制器上的负载,并能够处理更多请求。
(PVFS 就是一个很好的开放源码并行文件系统;目前已经在 Linux 集群上使用标准的 IDE 硬盘实现了超过 1 GB/s 的磁盘性能。)
PVFS 可以作为一个 Linux 内核模块使用,也可以编译到 Linux 内核中。底层的概念非常简单(请参看图 4):
元数据服务器负责存储文件的哪些部分存储在什么地方的信息。
多个 I/O 节点上存储了文件的各个部分(PVFS 底层可以使用任何常见的文件系统,例如 ext3 )。
图 4. PVFS 是如何工作的
当集群中的计算节点想要访问并行文件系统中的一个文件时,它需要执行以下步骤:
像平常一样请求文件,请求被传送到底层的 PVFS 文件系统中。
PVFS 向元数据服务器发送一个请求(图 4 中的步骤 1、2),这会通知请求节点有关文件在各个 I/O 节点上的位置的信息。
使用这些信息,计算节点直接与所有相关的 I/O 节点进行通信,获得整个文件(步骤 3)。
这些步骤对于调用应用程序来说都是透明的;底层对所有 I/O 节点发出请求的复杂性、获取文件的内容等等,都是由 PVFS 处理的。
有关 PVFS 有一件好的事情:不需做任何修改就可以在其上运行普通文件系统的二进制形式 —— 这在并行编程领域多少是个例外。(参考资料 中介绍了其他一些并行文件系统。)
如果想在vim里面达到这个效果,在vimrc中加入一下两行:
au BufWinEnter *.{[ch],cpp,CPP,C,s,S} exe 'set list listchars=tab:\|\ '
au BufWinEnter *.{[ch],cpp,CPP,C,s,S} exe 'command Seetab :set list listchars=tab:\|\ '
当你编程序时, 就会达到这个效果. 源自:http://www.vim.org/tips/tip.php?tip_id=460
当你不想看到对齐线时 在vim的normal模式下 :set nolist
如果你想看到对齐线时 在vim的normal模式下 :Seetab
|