2009年6月7日星期日

在Visual Studio下以并行方式运行mpi程序

在项目属性对话框,
调试中,
命令项改为mpiexec.exe
命令参数改为-n [进程数] $(TargetPath)
mpich version: mpich2 32位 for windows
--
snigoal,HUST,Wuhan,China
 

2009年6月6日星期六

MPICH2/include/mpicxx.h(26): fatal error C1189: #error : "SEEK_SET is #defined but must not be for the C++ binding of MPI"

The error-

c:/Program Files/MPICH2/include/mpicxx.h(26): fatal error C1189: #error : "SEEK_SET is #defined but must not be for the C++ binding of MPI"

compiling your MPI application occurs because of MPI - 2 bug. This is because of SET_SEE which is defined in both mpi.h and stdio.h. The work around is to add

-DMPICH_IGNORE_CXX_SEEK

to a command line. This can be done by following the path : project properties - C/C++ - Command Line;

--
snigoal,HUST,Wuhan,China

all MPI v2.0 functions documents

http://mpi.deino.net/mpi_functions/index.htm

--
snigoal,HUST,Wuhan,China

2009年5月20日星期三

卡巴斯基在 Windows Server 2003 中的安装方案

该方案可以再Windows Server 2003上安装卡巴斯基2009(是kav,不是kis)

卡巴斯基2009的.msi文件修改方法:
首先,下载一个名叫"Orca"的软件,用这个软件打开卡巴斯基的.msi安装文件(该类型文件的获得方法见下文);
找到"LaunchCondition"表中的"MsiNTProductType=1 or Version9X",将其删除;
然后,按 Ctrl+F ,查找"MsiNTProductType=1",把找到的这个字串全部改为"MsiNTProductType>=1" 即可。
注意,其中共有四处,"InstallExecuteSequence" 三处,"LaunchCondition" 一处。

卡巴斯基2009的.msi文件获得方法:
在Windows Server 2003下运行卡巴斯基2009的安装文件,提示"无法安装应用程序,不支持当前的操作系统"。注意!!!别按"确定"。
Windows Server 2003得安装分区,进入"Documents and Settings "-"Administrator"(current user directory)-"Local Settings"-"temp"文件夹下找到一个.msi文件。(文件名不确定,双击找到的.msi文件看出现的的窗口是不是卡巴斯基)
将.msi文件复制出来,就得到了.msi文件。

出处:

最后:
卡巴斯基的授权文件可以到卡巴动力http://kabapower.cn/找。
-- 
snigoal,HUST,Wuhan,China

2009年5月9日星期六

ubuntu下java的安装

前辈的文章,不知道出处。

方法一:


首先我明确一下我的环境:
我是通过虚拟机安装的,宿主环境是windows xp sp3.
虚拟机是 virtualbox 1.6中文版
客户机是Ubuntu8.04
安装jdk
开始时我想下载那个.bin的jdk安装包,但又查到Ubuntu8.04上面有更好的安装方式如下:
sudo apt-get install sun-java6-jdk
如果你只想安装JAVA运行环境就用下面的指令
sudo apt-get iinstall sun-java6-jre
注意这两个命令会要求你管理员的权限。
我在安装的过程中并没有发现什么怪异的情况,有一个需要说明的是在安装过程中会弹出来个JDK的简介画面,在画面下部有一个确定按钮,一定要用TAB键选中然后按回车键,继续在旨出的"YES/NO"选项中依旧用TAB中选择确定后按回画。为了这个让我白等了好长时间,开始我以为是系统在后台执行,没想到是让我响应。看来LINUX的用户友好性还是差一些啊。
说明一下,apt-get的方式是在线下载的方式,如果你没有连接网络请不要用这种方式安装。我在安装的过程中中断退出过,后来重新执行后系统会从中断的地方继续安装,这一点非常好。
过几天我会介绍如何安装NetBens6.1中文版。

方法二:

以前在linux下使用jdk是在redhat下.还从来没有在debian系下安装过.
这个系安装比较特别.
于是开始动手.
动因是因为我在windows下死活不能下载的freemind在ubuntu上面竟然轻易就打开sf.net站点并且下载这个java开发的思维导图软件.使用这个软件就必须安装jdk或者jre.因为要用java感谢别的事情,所以还是安装jdk.
1.安装java-package
    本来在完善找到很多安装方法,但是必需要java-package这个软件,我的sources.list是默认的,没有被修改.
    直接 apt-get install java-package,竟然提示java-package不存在,难道是sources的原因,于是修改/etc/apt/sources.list
    添加国内的一个镜像站点 debian.cn99.com/ubuntu,接着更新源
    apt-get update
    提示的中文,我看得懂,说我的debian.cn99.com被忽略.那就别说了,
    apt-get install java-package肯定是失败的.
    后来才发现有的文章已经介绍在哪里获取java-package软件.地址是:
    deb http://gb.archive.ubuntu.com/ubuntu/ dapper main restricted
    deb http://gb.archive.ubuntu.com/ubuntu/ dapper universe multiverse
    使用方法:
    su命令到root下.
    sudo gedit /etc/apt/sources.list
    把上面的两个地址张贴到最后.
    然后运行
    apt-get update 更新源.
    然后就是安装java-package咯.
    apt-get install java-package
2.安装jdk,其实这个过程很简单的.就是花一点时间.到http://java.sun.com/javase/downloads/index.jsp下载最新版本的JDK,
    目前的版本号是JDK 5.0 Update 10。选择Linux self-extracting file(注意,不是RPM!是以bin结尾的自解压文件)
    将jdk-1_5_0_10-linux-i586.bin下载到本地。
    在命令行下进入该文件所在的目录,用如下命令制作适用于Ubuntu的安装文件:
    fakeroot make-jpkg jdk-1_5_0_10-linux-i586.bin
    如果你没有fakeroot这个软件,直接apt-get fakeroot安装就可以了.但是没有java-package
    就会提示make-jpkg无效.
在这个过程中你会看到屏幕上出现许多错误提示,这些都没有关系。回答几次yes之后,安
    装文件就制作完成了。这个文件的文件名是sun-j2sdk1.5_1.5.0+update10_i386.deb。
    通过如下命令将这个软件包安装到Ubuntu上:
    sudo dpkg -i sun-j2sdk1.5_1.5.0+update10_i386.deb

    在命令行下运行java -version,可以发现最新版本的JDK已经被成功地安装在你的系统上了。
    不过,如
    果运行java,发现使用的还是Ubuntu缺省安装的gcj虚拟机。进入/etc/alternatives
    目录,运行如下命令:
  
    rm java
    ln -s /usr/lib/j2sdk1.5-sun/bin/java java
  
    再次运行java命令,就会发现使用的是刚刚安装完成的Sun 公司的虚拟机了。
  
    如果想每次登录就有java环境,你还得设置一下
$ sudo gedit /etc/profile 在文件最后添加

#set java environment

JAVA_HOME=/opt/jdk1.6.0_01(jdk的安装路径)

export JRE_HOME=/opt/jdk1.6.0_01/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    (java环境变量的配置原文件好像有点问题,我改过来了,已经验证)


安装方法三

不要骂我,为什么把简单的方法放在后面,使用命令来安装有助于对ubuntu的熟悉和了解.最起码的软件安装会有个概念.
这个方法特别简单,是在ubuntu的一个台湾wiki上看到的,安装方法比windows下的软件安装一样简单.
具体方法:
点击桌面的"应用程序"->"添加/删除..."
然后再搜索里面输入"java",回车,就可以看到java相关的软件了,
这个时候你可以选择jdk或者jre来安装(选中复选框).然后点击"确定",开始安装.
安装结束你的java环境就已经搭建好了.
就这么简单.嘿嘿..以前在linux下使用jdk是在redhat下.还从来没有在debian系下安装过.
这个系安装比较特别.
于是开始动手.
动因是因为我在windows下死活不能下载的freemind在ubuntu上面竟然轻易就打开sf.net站点并且下载这个java开发的思维导图软件.使用这个软件就必须安装jdk或者jre.因为要用java感谢别的事情,所以还是安装jdk.(这个方法我没试,有兴趣的朋友可以试一下)

--
snigoal,HUST,Wuhan,China

2009年5月6日星期三

用MPI_Pack()打包C语言的struct


C 结构

考虑一个图像的应用,它传送8位彩色象素的固定长度扫描线。与象素矩阵一起是扫描线数,一个整数。可以在C中将消息描述成一个结构:

    struct {
        int             lineno;
        char            pixels[1024];
    } scanline;
除了导出类型,对于发送不连续和/或者异构数据消息打包是一个有用的方法。下面列出包装和发送上面结构的代码段:

#include <mpi.h>

{
    unsigned int        membersize, maxsize;
    int                 position;
    int                 dest, tag;
    char                *buffer;
/*
 * Do this once.
 */
    MPI_Pack_size(1,            /* 一个元素 */
            MPI_INT,            /* 数据类型是整数 */
            MPI_COMM_WORLD,     /* 一致的 comm. */
            &membersize);       /* 最大包装空间 req'd */

    maxsize = membersize;
    MPI_Pack_size(1024, MPI_CHAR, MPI_COMM_WORLD, &membersize);
    maxsize += membersize;
    buffer = malloc(maxsize);
/*
 * 为每一新消息做此。
 */
    position = 0;

    MPI_Pack(&scanline.lineno,  /* 包装此元素 */
            1,                  /* 一个元素 */
            MPI_INT,            /* 数据类型 int */
            buffer,             /* 打包缓冲区 */
            maxsize,            /* 缓冲区大小 */
            &position,          /* 下一可用字节的偏移 */
            MPI_COMM_WORLD);    /* 一致的 comm. */

    MPI_Pack(scanline.pixels, 1024, MPI_CHAR,
            buffer, maxsize, &position, MPI_COMM_WORLD);

    MPI_Send(buffer, position, MPI_PACKED,
            dest, tag, MPI_COMM_WORLD);
}
缓冲区分配一次以包含所打包的结构的大小。由于在消息中依赖于实现的开销,必须计算大小。变长的消息可以通过分配能容纳最大可能的消息的缓冲区来处理。对于MPI_Pack( )的位置参数总是返回当前包装缓冲区的大小。

下面列出解包消息的代码段,假设已分配接受缓冲区。

{
    int             src;
    int             msgsize;
    MPI_Status      status;

    MPI_Recv(buffer, maxsize, MPI_PACKED,
            src, tag, MPI_COMM_WORLD, &status);

    position = 0;
    MPI_Get_count(&status, MPI_PACKED, &msgsize);

    MPI_Unpack(buffer,          /* 打包缓冲区 */
            msgsize,            /* 缓冲区大小 */
            &position,          /* 下一元素的字节偏移 */
            &scanline.lineno,   /* 解包这个元素 */
            1,                  /* 一个元素 */
            MPI_INT,            /* 数据类型 int */
            MPI_COMM_WORLD);    /* 一致的 comm. */

    MPI_Unpack(buffer, msgsize, &position,
            scanline.pixels, 1024, MPI_CHAR, MPI_COMM_WORLD);
}
你应该能修改上面的代码以适应任意的结构。完全可能改变要解包元素的个数,这基于同一消息中前面解包的应用信息。

--
snigoal,HUST,Wuhan,China

MPI快速教程

http://docs.huihoo.com/npact/1.htm
十分简明,初学MPI值得一看。

--
snigoal,HUST,Wuhan,China

2009年5月5日星期二

TinyXML——xml解析器

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个XML片段:
   <Persons>
        <Person ID="1">
            <name>周星星</name>
            <age>20</age>
        </Person>
        <Person ID="2">
            <name>白晶晶</name>
            <age>18</age>
        </Person>
    </Persons>
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分
TiXmlUnknown:对应于XML的未知部分。 
TiXmlHandler:定义了针对XML的一些操作。
TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。
对应的XML文件:
<Persons>
    <Person ID="1">
        <name>phinecos</name>
        <age>22</age>
    </Person>
</Persons>
读写XML文件的程序代码:

#include <iostream>
#include "tinyxml.h"
#include "tinystr.h"
#include <string>
#include <windows.h>
#include <atlstr.h>
using namespace std;
CString GetAppPath()
{//获取应用程序根目录
    TCHAR modulePath[MAX_PATH];
    GetModuleFileName(NULL, modulePath, MAX_PATH);
    CString strModulePath(modulePath);
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
    return strModulePath;
}
bool CreateXmlFile(string& szFileName)
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
    try
    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument();
        //创建一个根元素并连接。
        TiXmlElement *RootElement = new TiXmlElement("Persons");
        myDocument->LinkEndChild(RootElement);
        //创建一个Person元素并连接。
        TiXmlElement *PersonElement = new TiXmlElement("Person");
        RootElement->LinkEndChild(PersonElement);
        //设置Person元素的属性。
        PersonElement->SetAttribute("ID", "1");
        //创建name元素、age元素并连接。
        TiXmlElement *NameElement = new TiXmlElement("name");
        TiXmlElement *AgeElement = new TiXmlElement("age");
        PersonElement->LinkEndChild(NameElement);
        PersonElement->LinkEndChild(AgeElement);
        //设置name元素和age元素的内容并连接。
        TiXmlText *NameContent = new TiXmlText("周星星");
        TiXmlText *AgeContent = new TiXmlText("22");
        NameElement->LinkEndChild(NameContent);
        AgeElement->LinkEndChild(AgeContent);
        CString appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
        myDocument->SaveFile(fullPath.c_str());//保存到文件
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}
bool ReadXmlFile(string& szFileName)
{//读取Xml文件,并遍历
    try
    {
        CString appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
        myDocument->LoadFile();
        //获得根元素,即Persons。
        TiXmlElement *RootElement = myDocument->RootElement();
        //输出根元素名称,即输出Persons。
        cout << RootElement->Value() << endl;
        //获得第一个Person节点。
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
        //获得第一个Person的name节点和age节点和ID属性。
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
        //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
        cout << NameElement->FirstChild()->Value() << endl;
        cout << AgeElement->FirstChild()->Value() << endl;
        cout << IDAttribute->Value()<< endl;
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}
int main()
{
    string fileName = "info.xml";
    CreateXmlFile(fileName);
    ReadXmlFile(fileName);
}
--
snigoal,HUST,Wuhan,China

libxml——The XML C parser and toolkit of Gnome

http://xmlsoft.org/

The XML C parser and toolkit of Gnome

libxml



--
snigoal,HUST,Wuhan,China

MPI程序示例

给大家写个 mpi的例子程序,在vc.net平台下。
几个首先:
在工程属性的
1.附加包含目录里加上mpich sdk的include路径,如
"E:\Program Files\MPICH\SDK\Include"
2.附加库目录里加上mpich sdk的lib路径,如
"E:\Program Files\MPICH\SDK\Lib"
3.调试|命令里加上 MPIRun.exe,主要是为了方便运行调试
别忘了在命令参数上加上 "-np 4 $(TargetPath)"
4.在我的电脑属性的环境变量增加mpich bin的执行路径,如
E:\PROGRA~1\MPICH\mpd\bin"

建一个空的控制台程序,配置好上面的,你就可以使用下面的代码段了。
#include&lt;mpi.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;stdio.h&gt;
#include&lt;conio.h&gt;
#pragma comment (lib, "mpichd.lib")
int main(int argc, char* argv[])
{
int myid,numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&amp;argc,&amp;argv);
MPI_Comm_rank(MPI_COMM_WORLD,&amp;myid);
MPI_Comm_size(MPI_COMM_WORLD,&amp;numprocs);
MPI_Get_processor_name(processor_name,&amp;namelen);
fprintf(stderr, "Hello World!Process %d of %d on %s\n", myid,numprocs,processor_name); MPI_Finalize();
if (myid == 0)
{
printf("\nPress a key and exit.\n");
getch();
}
return 0;
}

这些是前些日子参加了迟学斌、莫则尧等老师的讲座,学来的。 感觉不错。
--
snigoal,HUST,Wuhan,China

Windows下MPI并行程序运行环境的搭建

http://mryang.blogbus.com/logs/17396382.html

  这几日对并行计算有了大概的了解,其中关键的还是并行程序的设计,搞了一早上终于弄清楚了在Windows下的MPI并行程序运行环境的搭建。

什么是MPI?
  MPI(Message Passing Interface),消息传递编程接口,是全球工业、科研和政府部联合建立的一个消息传递编程标准。是目前最为通用的并行编程方式。MPI标准中定了一组函数接口,用于进程间的消息传递。函数的具体实现由各计算机厂商来完成,然这些都是要付费的;也有一些免费的通用MPI系统,比较著名的就是MPICH(http://www.mcs.anl.gov/research/projects/mpich2/)和LAM MPI(http://www.lam-pi.org)。[1]

  单来说,要让你的单个PC机能运行并行程序的运行,就需要有MPI的运行环境。而PICH几乎支持所有的Linux/Unix和Windows,可以在单台PC或工作站上模拟MPI并行程,也可以在SMP系统或者机群环境上建立实用的并行计算环境。

  这里将在一台双核的PC上,利用虚拟机及MPICH2建立一个由3台PC节点构成的一个机群行计算环境。

软硬件准备
硬件:一台普通PC,当然硬盘和内存越大越好,我是用的是160G的硬盘,1G的内存。
软件:

  • VMware Workstation 6.0,在VM上虚拟两个PC,与物理主机构成3个节点的机群可以安装一个虚拟PC,然后实用VM的克隆功能。
  • Microsoft Windows XP Pro:每个节点的操作系统;
  • Microsoft .NET Framework 2.0:每个节点必须的环境;
  • vcredist_x86.exe(VC8运行库):在安装MPICH2时需要,安装时会提示Visual C++2005 sp1的提示,安装vcredist_x86.exe后,就可以正常安装MPICH2了;
  • mpich2-1.0.6p1-win32-ia32.msi:MPICH2安装程序,可到http://www.mcs.anl.gov/research/projects/mpich2/的Downloads中下载。

环境搭建
  在每台机器上均安装上Microsoft .NET Framework2.0和MPICH2。MPICH2的默认安装路在C:\Program Files\MPICH2,将MPICH2\bin加入系统环境变量的Path中。

  每个节点中新建一个用户,该用户应该具有管理员权限。我这里新建了用户mpi,密为111,隶属Administrators组。

  在每个节点新建相同的目录,来存放并行程序,该目录都应该在相同的位置。我这里的C:\mpitest。

单机测试
  首先需要注册一个用户,运行MPICH2的wmpiregister.exe,在开始->所有成程序-MPICH2中可以找到。将上一步中的用户名和密码在这里进行注册即可。

  后可以采用MPICH2提供的GUI界面进行测试,可以在在开始->所有成程序->MPICH2中到wmpiexec.exe;在MPICH2的examples下有个测试程序cpi.exe,选择后执行即可。

  可以到命令行方式执行命令:mpiexec -n 2 C:\Program Files\MPICH2examples\cpi.exe即可。命令中-n是参数,后面的2表示有两个节点并行计算。


联机测试
  这里将在具有3个节点的PC集群上测试。首先将cpi.exe程序拷贝到每个节点的C:\mpitest目录中,然后执行命令:
mpiexec -hosts 3 210.45.*.* 210.45.*.* 210.45.*.* C:\mpitest\cpi.exe

  注意:在联机测试时将XP的防火墙关闭。

与VC++ 6.0集成开发环境
  有了MPI的运行环境后,还需要一个MPI的开发环境。MPICH2可以和VC开发环境集成,集的方法很简单,将MPICH2的Include和lib添加到VC的Directories的Include files和ibary files中即可。同时在Project Settings中将mpi.lib添加到Object/library modules中,然后就可以采用VC++ 6.0开发MPI的并行程序了。

  

[1] 张林波,尺学斌等.并行计算导论. 北京:清华大学出版社,2006年7月

[2]  http://read.newbooks.com.cn/info/175818.html

--
snigoal,HUST,Wuhan,China

Linux集群的安装与并行计算

  1.linux安装

  安装过程就不多说了。需要注意的是安装时,如果机群不与外界联网则可以不考虑安全

  方面的因素而把rsh选为可信赖的服务,注意安装相应的软件包;如果还要与外界保持联

  网,出于安全需要应把ssh选为可信赖的服务。安装以后,应该保证各节点之间能够用s

  sh相互登录。每个节点的sshd都应该能正常提供服务。主机名:node1...noden (我所构

  建的系统n=2)

  2.创建NFS服务

  在服务器节点public目录下建立mpi目录,并将其配置成NFS服务器,在/etc/exports文

  件中加入一行:

  /public/mpi node1(rw) node2(rw)

  在客户端节点的/etc/fstab文件中增加一行:

  sever :/pubilc/mpi nfs rw , bg , soft 0 0

  将/public/mpi这个目录从服务器节点输出,并装载在各客户端,从而便于在各节点间分

  发任务

  3.修改/etc/hosts文件,将所有节点名称极其ip地址填入。例如:

  127.0.0.1

  localhost.localdomain localhost

  192.168.1.1

  node1

  192.168.1.2

  node2

  …………………….

  每个节点都进行类似的配置。这样做的目的是使节点之间能够通过node1 ... noden的名

  称相互访问。你可以通过ping noden 或 ssh noden进行测试。

  4.修改(或创建)/etc/hosts.equiv文件

  将所有你允许访问本机进行mpi计算的机器名填入,一行一个机器名。这一步是为了使节

  点对其它的节点放权。

  例如,我的node1是我用于启动mpi集群计算的机器,其他的节点是参与计算者,在node

  1的/etc/hosts.equiv文件是这样的:

  node1 #给自己放权,这样在只有一台机器时也可以模拟并行计算环境

  node2

  .....

  noden

  在node2...noden的/etc/hosts.equiv文件:

  node1 #对node1放权

  node2

  ......

  noden

  5.修改~/.bash_profile文件

  首先决定一个用于启动集群计算的用户名,不提倡使用root进行集群计算。这里在每个

  节点上建立新用户chief,他们的主目录都是/home/chief,必须采用同样的密码,将来

  的计算程序必须放在相同的路径上。譬如你的程序为:fpi.f和a.out,则必须把a.out放

  在同样的路境内,比如~/mpirun/a.out,每个节点都是如此。 修改~/.bash_profile文

  件,主要是加入下列几行脚本:

  export PATH=$PATH:/usr/local/mpich/bin

  export MPI_USEP4SSPORT=yes

  export MPI_P4SSPORT=22

  export P4_RSHCOMMAND=rsh 或ssh

  这里我们预定了将来mpich的运行环境安装在目录/usr/local/mpich下面。其余的三个变

  量是用来通知mpi运行环境采用rsh(或ssh)来作为远程shell。linux的运行环境到此就配

  置完毕了。

  6.配置rsh 或ssh

  对于采用rsh来作为远程shell运行MPI的用户只要保证在各个节点上都具有相同的用户,

  并把这一用户的密码设为空密码就可以运行了。

  若采用ssh作为远程shell则按如下配置:以你设定的用于启动mpi计算的用户登录,运行

  ssh-keygen,这将生成一个私有/公开密钥对,分别存放在~/.ssh/identity和~/.ssh/i

  dentity.pub文件内。然后进行访问授权,运行:

  cp ~/.ssh/identity.pub ~/.ssh/authorized_keys

  chmod go-rwx ~/.ssh/authorized_keys

  ssh-agent $SHELL

  ssh-add

  在每个节点重复一遍。试着在某一节点上登录其它节点,ssh noden,则在.ssh/下生成

  一个known_hosts2文件,里面放着访问该主机的密钥,把所有密钥收集起来,在各个节

  点上作同样的拷贝。这样做的目的是使各节点相互之间访问无需输入密码。

  7.开启各项必需的服务

  如果是以根用户root 登陆系统的则可以用ntsysv命令启动ntsysv实用程序。ntsysv 实

  用程序允许使用简单的菜单界面启动或关闭各种运行等级的服务。在其中我们选择开启

  rsh ,rlogin,telnet等。也可以关闭一些服务以加快启动速度如sendmail。

  如果是使用su命令转为root用户的则很可能运行ntsysv并不出现ntsysvs实用程序。此时

  可以直接去修改/etc/xinetd.d下的rlogin, rsh ,telenet的设置。用vi编辑器打开xin

  etd.d:

  vi /etc/xinetd.d

  则可看到如下所示的配置文件:

  关于rsh的设置如下

  # default: off

  # description: The rshd server is the server for the rcmd(3) routine and, \

  # consequently, for the rsh(1) program. The server provides \

  # remote execution facilities with authentication based on \

  # privileged port numbers from trusted hosts.

  service shell

  {

  disable = yes

  socket_type = stream

  wait = no

  user = root

  log_on_success += USERID

  log_on_failure += USERID

  server = /usr/sbin/in.rshd

  }

  关于rlogin的设置如下

  # default: off

  # description: rlogind is the server for the rlogin(1) program. The server

  \

  # provides a remote login facility with authentication based on \

  # privileged port numbers from trusted hosts.

  service login

  {

  disable = yes

  socket_type = stream

  wait = no

  user = root

  log_on_success += USERID

  log_on_failure += USERID

  server = /usr/sbin/in.rlogind

  }

  关于telnet的设置如下

  # default: off

  # description: The telnet server serves telnet sessions; it uses \

  # unencrypted username/password pairs for authentication.

  service telnet

  {

  disable = yes

  flags = REUSE

  socket_type = stream

  wait = no

  user = root

  server = /usr/sbin/in.telnetd

  log_on_failure += USERID

  }

  所有这些服务在安装完系统之后都是默认为禁用的,要进行修改来打开这些服务。如要

  通过修改启动telenet则就需要改disable = yes为disable = no。对于其他的服务的启

  动的修改与之相同。若启动这些服务则只需要简单执行:

  #/etc/rc.d/init.d/xinetd restart

  或重起计算机就可以使所作的更改生效。

  C.在服务器节点编译、安装Fortran90编译器

  先将Fortran90(我用的是Intel的)编译器拷贝至/tmp下,然后用tar xvfz fortran90

  .tar.gzj解压缩。运行

  ./install

  选择你所要安装的类型,如果你的机器是基于IA-32,就选择1。如果你的机器是基于It

  anium(TM)-based system就选择2。如果要停止安装,就选择X。选择过之后安回车进入

  下一步,此时会要求你选择 :

  1. Intel(R) Fortran Complier for 32-bit Applications,Version 6.0 build 02031

  2Z

  2. 2.Linux Applicationdebugger for 32-bit Applications,Version 6.0 buid 2002

  0

  x. Exit

  按顺序选择1,2 。最后选择X 完成安装并退出。在选择完1之后会要求你看版权声明,

  输入Accept继续安装。默认的安装路径为/opt/intel,选择默认路径按Enter继续。选2之

  后的情形与1相同。如果不注册可以用90天。

  D. 在服务器节点编译、安装mpich 1.2.3

  将mpich 1.2.4:ftp://ftp.mcs.anl.gov/pub/mpi/mpich.tar.gz。拷贝到一个临时目录

  下,放在/tmp下了。用root用户登录进行编译安装。

  1. 对mpich的安装进行预处理:

  首先,用tar xvfz mpich.tar.gz解压。生成mpich-1.2.3目录。切换到mpich-1.2.3目录

  。运行预处理:

  ./configure --prefix=/usr/local/mpi --对应于用rsh进行远程登录的系统

  ./configure --prefix=/usr/local/mpi -rsh=ssh --对应于用ssh进行远程登录的

  系统

  这里我们通知编译系统mpich的安装位置为/usr/local/mpich,运行环境的远程shell为

  rsh或ssh。

  2.编译:

  make

  运行此命令后mpich软件包会自动编译形成MPI系统的函数库,需要数分钟的时间,根据

  不同的机器可以略有不同。

  3.安装:

  make install

  运行此命令可以将MPI软件包安装到由./configure --prefix选项指定MPICH安装目录即

  /usr/local/mpi

  修改文件/usr/local/mpi/share/util/machines/machines.LINUX。如下:

  node1

  ndoe2

  ......

  ndoen

  这一步是通知mpich运行环境都有那些节点可供集群计算。每个节点都这样输入一遍。

  4.测试安装是否正确

  在/usr/local/mpi/examples/basics下编译cpi.c:

  make cpi

  用命令行:

  ../../bin/mpirun -np 2 cp

  运行。将会获得如下信息。

  Processes 0 on node1

  Processes 1 on node2

  ……..………………..

  如果能正常运行即证明mpich软件包安装完全成功。
--
snigoal,HUST,Wuhan,China

Linux内核有多少代码是来自华人的贡献?

统计可以看出绝大多数贡献来自于一些大公司,比如 Redhat、Intel、IBM、SUN、Google、Analog、MontaVista等。而更该被记住的是那些标记为 Hobbyists 也即不是供职于大公司而纯粹是出于个人兴趣爱好的贡献者,比如 ZhangLe。

Linux 内核有多少代码是来自华人的贡献?这里有一个统计 http://www.remword.com/kps_result/china.php

所有的统计基于 KPS (Kernel Patch Statistic),这里的 Chinese 指的是华人,并不限定国籍是中国人。

http://www.remword.com/kps_result/all_china.html 页面统计了2005年4月16日至现在华人贡献的补丁数据。可以看到, 在这段时间内有219位华人一共贡献了 5021 个补丁。

按照补丁数量排序,排第一的是 Herbert xu,一共贡献了 735 个补下。herbert xu目前供职于 Redhat,曾经是 Debian Developer。

按照补丁行数排序,排第一的是 Bryan Wu,贡献了 101637 行补丁。Bryan Wu供职于 Analog,和他的团队在维护 Blackfin 支持的相关代码。

另外还有一些熟悉的名字,比如开发 readahead 预读补丁的吴峰光(貌似目前在 Intel),来自 Intel 上海开源技术中心的王振宇,来自西安邮电大学的学生孔建军。

从这个统计可以看出绝大多数贡献来自于一些大公司,比如 Redhat、Intel、IBM、SUN、Google、Analog、MontaVista等。而更该被记住的是那些标记为 Hobbyists 也即不是供职于大公司而纯粹是出于个人兴趣爱好的贡献者,比如 ZhangLe。Zhangle 是一位 Gentoo Developer,一直在进行龙芯相关的开发工作。

还有太多的我就不认识啦,让我们记住他们的贡献。有了这么多的人贡献,GNU/Linux 才越来越好,越来越强。

 www.mobileuncle.com

--
snigoal,HUST,Wuhan,China