Monday, December 14, 2009

linux 线程 进程经典文章

有关linux下进程与线程看过很多文章,我觉的这篇可以说最经典
---------------------------------

一.基础知识:线程和进程

按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。

无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行在SMP机器上,它就可以同时使用多个cpu来执行各个线程,达到最大程度的并行,以提高效率;同时,即使是在单cpu的机器上,采用多线程模型来设计程序,正如当年采用多进程模型代替单进程模型一样,使设计更简洁、功能更完备,程序的执行效率也更高,例如采用多个线程响应多个输入,而此时多线程模型所实现的功能实际上也可以用多进程模型来实现,而与后者相比,线程的上下文切换开销就比进程要小多了,从语义上来说,同时响应多个输入这样的功能,实际上就是共享了除cpu以外的所有资源的。

针对线程模型的两大意义,分别开发出了核心级线程和用户级线程两种线程模型,分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。在目前的商用系统中,通常都将两者结合起来使用,既提供核心线程以满足smp系统的需要,也支持用线程库的方式在用户态实现另一套线程机制,此时一个核心线程同时成为多个用户态线程的调度者。正如很多技术一样,"混合"通常都能带来更高的效率,但同时也带来更大的实现难度,出于"简单"的设计思路,Linux从一开始就没有实现混合模型的计划,但它在实现上采用了另一种思路的"混合"。

在线程机制的具体实现上,可以在操作系统内核上实现线程,也可以在核外实现,后者显然要求核内至少实现了进程,而前者则一般要求在核内同时也支持进程。核心级线程模型显然要求前者的支持,而用户级线程模型则不一定基于后者实现。这种差异,正如前所述,是两种分类方式的标准不同带来的。

当核内既支持进程也支持线程时,就可以实现线程-进程的"多对多"模型,即一个进程的某个线程由核内调度,而同时它也可以作为用户级线程池的调度者,选择合适的用户级线程在其空间中运行。这就是前面提到的"混合"线程模型,既可满足多处理机系统的需要,也可以最大限度的减小调度开销。绝大多数商业操作系统(如Digital Unix、Solaris、Irix)都采用的这种能够完全实现POSIX1003.1c标准的线程模型。在核外实现的线程又可以分为"一对一"、"多对一"两种模型,前者用一个核心进程(也许是轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成,而后者则完全在核外实现多线程,调度也在用户态完成。后者就是前面提到的单纯的用户级线程模型的实现方式,显然,这种核外的线程调度器实际上只需要完成线程运行栈的切换,调度开销非常小,但同时因为核心信号(无论是同步的还是异步的)都是以进程为单位的,因而无法定位到线程,所以这种实现方式不能用于多处理器系统,而这个需求正变得越来越大,因此,在现实中,纯用户级线程的实现,除算法研究目的以外,几乎已经消失了。

Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,一定程度上也弥补了这一缺陷。目前最流行的线程机制LinuxThreads所采用的就是线程-进程"一对一"模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。Linux-LinuxThreads的运行机制正是本文的描述重点。

二.Linux 2.4内核中的轻量进程实现

最初的进程定义都包含程序、资源及其执行三部分,其中程序通常指代码,资源在操作系统层面上通常包括内存资源、IO资源、信号处理等部分,而程序的执行通常理解为执行上下文,包括对cpu的占用,后来发展为线程。在线程概念出现以前,为了减小进程切换的开销,操作系统设计者逐渐修正进程的概念,逐渐允许将进程所占有的资源从其主体剥离出来,允许某些进程共享一部分资源,例如文件、信号,数据内存,甚至代码,这就发展出轻量进程的概念。Linux内核在2.0.x版本就已经实现了轻量进程,应用程序可以通过一个统一的clone()系统调用接口,用不同的参数指定创建轻量进程还是普通进程。在内核中,clone()调用经过参数传递和解释后会调用do_fork(),这个核内函数同时也是fork()、vfork()系统调用的最终实现:


int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)

其中的clone_flags取自以下宏的"或"值:

#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /* set if open files shared between processes */ #define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */ #define CLONE_PID 0x00001000 /* set if pid shared */ #define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */
#define CLONE_NEWNS 0x00020000 /* New namespace group? */
#define CLONE_SIGNAL (CLONE_SIGHAND CLONE_THREAD)

在do_fork()中,不同的clone_flags将导致不同的行为,对于LinuxThreads,它使用(CLONE_VM CLONE_FS CLONE_FILES CLONE_SIGHAND)参数来调用clone()创建"线程",表示共享内存、共享文件系统访问计数、共享文件描述符表,以及共享信号处理方式。本节就针对这几个参数,看看Linux内核是如何实现这些资源的共享的。

1.CLONE_VM

do_fork()需要调用copy_mm()来设置task_struct中的mm和active_mm项,这两个mm_struct数据与进程所关联的内存空间相对应。如果do_fork()时指定了CLONE_VM开关,copy_mm()将把新的task_struct中的mm和active_mm设置成与current的相同,同时提高该mm_struct的使用者数目(mm_struct::mm_users)。也就是说,轻量级进程与父进程共享内存地址空间,由下图示意可以看出mm_struct在进程中的地位:

2.CLONE_FS

task_struct中利用fs(struct fs_struct *)记录了进程所在文件系统的根目录和当前目录信息,do_fork()时调用copy_fs()复制了这个结构;而对于轻量级进程则仅增加fs->count计数,与父进程共享相同的fs_struct。也就是说,轻量级进程没有独立的文件系统相关的信息,进程中任何一个线程改变当前目录、根目录等信息都将直接影响到其他线程。

3.CLONE_FILES

一个进程可能打开了一些文件,在进程结构task_struct中利用files(struct files_struct *)来保存进程打开的文件结构(struct file)信息,do_fork()中调用了copy_files()来处理这个进程属性;轻量级进程与父进程是共享该结构的,copy_files()时仅增加files->count计数。这一共享使得任何线程都能访问进程所维护的打开文件,对它们的操作会直接反映到进程中的其他线程。

4.CLONE_SIGHAND

每一个Linux进程都可以自行定义对信号的处理方式,在task_struct中的sig(struct signal_struct)中使用一个struct k_sigaction结构的数组来保存这个配置信息,do_fork()中的copy_sighand()负责复制该信息;轻量级进程不进行复制,而仅仅增加signal_struct::count计数,与父进程共享该结构。也就是说,子进程与父进程的信号处理方式完全相同,而且可以相互更改。

do_fork()中所做的工作很多,在此不详细描述。对于SMP系统,所有的进程fork出来后,都被分配到与父进程相同的cpu上,一直到该进程被调度时才会进行cpu选择。

尽管Linux支持轻量级进程,但并不能说它就支持核心级线程,因为Linux的"线程"和"进程"实际上处于一个调度层次,共享一个进程标识符空间,这种限制使得不可能在Linux上实现完全意义上的POSIX线程机制,因此众多的Linux线程库实现尝试都只能尽可能实现POSIX的绝大部分语义,并在功能上尽可能逼近。

三.LinuxThread的线程机制

LinuxThreads是目前Linux平台上使用最为广泛的线程库,由Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行。它所实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。

1.线程描述数据结构及实现限制

LinuxThreads定义了一个struct _pthread_descr_struct数据结构来描述线程,并使用全局数组变量__pthread_handles来描述和引用进程所辖线程。在__pthread_handles中的前两项,LinuxThreads定义了两个全局的系统线程:__pthread_initial_thread和__pthread_manager_thread,并用__pthread_main_thread表征__pthread_manager_thread的父线程(初始为__pthread_initial_thread)。

struct _pthread_descr_struct是一个双环链表结构,__pthread_manager_thread所在的链表仅包括它一个元素,实际上,__pthread_manager_thread是一个特殊线程,LinuxThreads仅使用了其中的errno、p_pid、p_priority等三个域。而__pthread_main_thread所在的链则将进程中所有用户线程串在了一起。经过一系列pthread_create()之后形成的__pthread_handles数组将如下图所示:

图2 __pthread_handles数组结构

新创建的线程将首先在__pthread_handles数组中占据一项,然后通过数据结构中的链指针连入以__pthread_main_thread为首指针的链表中。这个链表的使用在介绍线程的创建和释放的时候将提到。

LinuxThreads遵循POSIX1003.1c标准,其中对线程库的实现进行了一些范围限制,比如进程最大线程数,线程私有数据区大小等等。在LinuxThreads的实现中,基本遵循这些限制,但也进行了一定的改动,改动的趋势是放松或者说扩大这些限制,使编程更加方便。这些限定宏主要集中在sysdeps/unix/sysv/linux/bits/local_lim.h(不同平台使用的文件位置不同)中,包括如下几个:

每进程的私有数据key数,POSIX定义_POSIX_THREAD_KEYS_MAX为128,LinuxThreads使用PTHREAD_KEYS_MAX,1024;私有数据释放时允许执行的操作数,LinuxThreads与POSIX一致,定义PTHREAD_DESTRUCTOR_ITERATIONS为4;每进程的线程数,POSIX定义为64,LinuxThreads增大到1024(PTHREAD_THREADS_MAX);线程运行栈最小空间大小,POSIX未指定,LinuxThreads使用PTHREAD_STACK_MIN,16384(字节)。

2.管理线程

"一对一"模型的好处之一是线程的调度由核心完成了,而其他诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的。在LinuxThreads中,专门为每一个进程构造了一个管理线程,负责处理线程相关的管理工作。当进程第一次调用pthread_create()创建一个线程的时候就会创建(__clone())并启动管理线程。

在一个进程空间内,管理线程与其他线程之间通过一对"管理管道(manager_pipe[2])"来通讯,该管道在创建管理线程之前创建,在成功启动了管理线程之后,管理管道的读端和写端分别赋给两个全局变量__pthread_manager_reader和__pthread_manager_request,之后,每个用户线程都通过__pthread_manager_request向管理线程发请求,但管理线程本身并没有直接使用__pthread_manager_reader,管道的读端(manager_pipe[0])是作为__clone()的参数之一传给管理线程的,管理线程的工作主要就是监听管道读端,并对从中取出的请求作出反应。

创建管理线程的流程如下所示:
(全局变量pthread_manager_request初值为-1)

图3 创建管理线程的流程

初始化结束后,在__pthread_manager_thread中记录了轻量级进程号以及核外分配和管理的线程id,2*PTHREAD_THREADS_MAX+1这个数值不会与任何常规用户线程id冲突。管理线程作为pthread_create()的调用者线程的子线程运行,而pthread_create()所创建的那个用户线程则是由管理线程来调用clone()创建,因此实际上是管理线程的子线程。(此处子线程的概念应该当作子进程来理解。)

__pthread_manager()就是管理线程的主循环所在,在进行一系列初始化工作后,进入while(1)循环。在循环中,线程以2秒为timeout查询(__poll())管理管道的读端。在处理请求前,检查其父线程(也就是创建manager的主线程)是否已退出,如果已退出就退出整个进程。如果有退出的子线程需要清理,则调用pthread_reap_children()清理。

然后才是读取管道中的请求,根据请求类型执行相应操作(switch-case)。具体的请求处理,源码中比较清楚,这里就不赘述了。

3.线程栈

在LinuxThreads中,管理线程的栈和用户线程的栈是分离的,管理线程在进程堆中通过malloc()分配一个THREAD_MANAGER_STACK_SIZE字节的区域作为自己的运行栈。

用户线程的栈分配办法随着体系结构的不同而不同,主要根据两个宏定义来区分,一个是NEED_SEPARATE_REGISTER_STACK,这个属性仅在IA64平台上使用;另一个是FLOATING_STACK宏,在i386等少数平台上使用,此时用户线程栈由系统决定具体位置并提供保护。与此同时,用户还可以通过线程属性结构来指定使用用户自定义的栈。因篇幅所限,这里只能分析i386平台所使用的两种栈组织方式:FLOATING_STACK方式和用户自定义方式。

在FLOATING_STACK方式下,LinuxThreads利用mmap()从内核空间中分配8MB空间(i386系统缺省的最大栈空间大小,如果有运行限制(rlimit),则按照运行限制设置),使用mprotect()设置其中第一页为非访问区。该8M空间的功能分配如下图:

图4 栈结构示意

低地址被保护的页面用来监测栈溢出。
对于用户指定的栈,在按照指针对界后,设置线程栈顶,并计算出栈底,不做保护,正确性由用户自己保证。
不论哪种组织方式,线程描述结构总是位于栈顶紧邻堆栈的位置。

4.线程id和进程id

每个LinuxThreads线程都同时具有线程id和进程id,其中进程id就是内核所维护的进程号,而线程id则由LinuxThreads分配和维护。

__pthread_initial_thread的线程id为PTHREAD_THREADS_MAX,__pthread_manager_thread的是2*PTHREAD_THREADS_MAX+1,第一个用户线程的线程id为PTHREAD_THREADS_MAX+2,此后第n个用户线程的线程id遵循以下公式:

tid=n*PTHREAD_THREADS_MAX+n+1

这种分配方式保证了进程中所有的线程(包括已经退出)都不会有相同的线程id,而线程id的类型pthread_t定义为无符号长整型(unsigned long int),也保证了有理由的运行时间内线程id不会重复。

从线程id查找线程数据结构是在pthread_handle()函数中完成的,实际上只是将线程号按PTHREAD_THREADS_MAX取模,得到的就是该线程在__pthread_handles中的索引。

5.线程的创建

在pthread_create()向管理线程发送REQ_CREATE请求之后,管理线程即调用pthread_handle_create()创建新线程。分配栈、设置thread属性后,以pthread_start_thread()为函数入口调用__clone()创建并启动新线程。pthread_start_thread()读取自身的进程id号存入线程描述结构中,并根据其中记录的调度方法配置调度。一切准备就绪后,再调用真正的线程执行函数,并在此函数返回后调用pthread_exit()清理现场。

6.LinuxThreads的不足

由于Linux内核的限制以及实现难度等等原因,LinuxThreads并不是完全POSIX兼容的,在它的发行README中有说明。 1)进程id问题 这个不足是最关键的不足,引起的原因牵涉到LinuxThreads的"一对一"模型。 Linux内核并不支持真正意义上的线程,LinuxThreads是用与普通进程具有同样内核调度视图的轻量级进程来实现线程支持的。这些轻量级进程拥有独立的进程id,在进程调度、信号处理、IO等方面享有与普通进程一样的能力。在源码阅读者看来,就是Linux内核的clone()没有实现对CLONE_PID参数的支持。

在内核do_fork()中对CLONE_PID的处理是这样的:
if (clone_flags & CLONE_PID) {
if (current->pid)
goto fork_out; }

这段代码表明,目前的Linux内核仅在pid为0的时候认可CLONE_PID参数,实际上,仅在SMP初始化,手工创建进程的时候才会使用CLONE_PID参数。

按照POSIX定义,同一进程的所有线程应该共享一个进程id和父进程id,这在目前的"一对一"模型下是无法实现的。

2)信号处理问题

由于异步信号是内核以进程为单位分发的,而LinuxThreads的每个线程对内核来说都是一个进程,且没有实现"线程组",因此,某些语义不符合POSIX标准,比如没有实现向进程中所有线程发送信号,README对此作了说明。

如果核心不提供实时信号,LinuxThreads将使用SIGUSR1和SIGUSR2作为内部使用的restart和cancel信号,这样应用程序就不能使用这两个原本为用户保留的信号了。在Linux kernel 2.1.60以后的版本都支持扩展的实时信号(从_SIGRTMIN到_SIGRTMAX),因此不存在这个问题。

某些信号的缺省动作难以在现行体系上实现,比如SIGSTOP和SIGCONT,LinuxThreads只能将一个线程挂起,而无法挂起整个进程。

3)线程总数问题

LinuxThreads将每个进程的线程最大数目定义为1024,但实际上这个数值还受到整个系统的总进程数限制,这又是由于线程其实是核心进程。

在kernel 2.4.x中,采用一套全新的总进程数计算方法,使得总进程数基本上仅受限于物理内存的大小,计算公式在kernel/fork.c的fork_init()函数中:

max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8

在i386上,THREAD_SIZE=2*PAGE_SIZE,PAGE_SIZE=2^12(4KB),mempages=物理内存大小/PAGE_SIZE,对于256M的内存的机器,mempages=256*2^20/2^12=256*2^8,此时最大线程数为4096。

但为了保证每个用户(除了root)的进程总数不至于占用一半以上物理内存,fork_init()中继续指定:
init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

这些进程数目的检查都在do_fork()中进行,因此,对于LinuxThreads来说,线程总数同时受这三个因素的限制。

4)管理线程问题

管理线程容易成为瓶颈,这是这种结构的通病;同时,管理线程又负责用户线程的清理工作,因此,尽管管理线程已经屏蔽了大部分的信号,但一旦管理线程死亡,用户线程就不得不手工清理了,而且用户线程并不知道管理线程的状态,之后的线程创建等请求将无人处理。

5)同步问题

LinuxThreads中的线程同步很大程度上是建立在信号基础上的,这种通过内核复杂的信号处理机制的同步方式,效率一直是个问题。

6)其他POSIX兼容性问题

Linux中很多系统调用,按照语义都是与进程相关的,比如nice、setuid、setrlimit等,在目前的LinuxThreads中,这些调用都仅仅影响调用者线程。

7)实时性问题

线程的引入有一定的实时性考虑,但LinuxThreads暂时不支持,比如调度选项,目前还没有实现。不仅LinuxThreads如此,标准的Linux在实时性上考虑都很少。

Saturday, December 5, 2009

malloc函数,动态存储分配

动态存储分配
在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。

例如:
int n;
scanf("%d",&n);
int a[n];

用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

常用的内存管理函数有以下三个:
1. 分配内存空间函数malloc
调用形式: (类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)
malloc(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2. 分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用形式:
(类型说明符*)calloc(n,size)
功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
(类型说明符*)用于强制类型转换。
calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
例如:
ps=(struet stu*)
calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

2. 释放内存空间函数free
调用形式: free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
【例】分配一块区域,输入一个学生数据。
main()
{
struct stu {
int num;
char *name;
char sex;
float score;
} *ps;

ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d\nName=%s\n",ps->num,ps->name);
printf("Sex=%c\nScore=%f\n",ps->sex,ps->score); f
ree(ps);
}

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

main函数参数argc和argv的简单介绍

在C\C++语言中,main()函数有参数形式 int main(int argc,char *argv[]) 此形式与 int main(int argc,char **argv)完全等同 那么其参数argc和argv有什么作用呢?



argc是一个整型变量,指的是命令行输入参数的个数,argv是字符串数组,它包含argc个字符串,每个字符串存储着一个命令行参数,如argv[0]存储着第一个命令行参数字符串,argv[1]存储着第二个命令行参数字符串,argv[argc-1]存储着最后一个命令行参数字符串.一般来说,argv[0]存储的是当前程序的路径与全称. 程序演示如下:


#include

int main (int argc, char **argv)

{

int i; printf ("%d\n", argc);



for (i = 0; i <>
{

printf ("%s\n", argv[i]);

}

return 0;

}


上述程序编译连接之后,生成的可执行文件test.exe位于D:盘目录下。在windows命令提示符下(cmd)转到D盘,输入test a b c d,如下图所示




在上述程序中
argc=5argv[0]="test" (第一个命令行参数字符串,代表程序的路径和全称)
argv[1]="a" (第二个命令行参数字符串)
argv[2]="b" (第三个命令行参数字符串)
argv[3]="c" (第四个命令行参数字符串)
argv[4]="d" (第五个命令行参数字符串)


Wednesday, December 2, 2009

Ubuntu root密码设置 or 切换用户

Ubuntu 8.10
在安装时,没有设置root密码,所以这就必须在安装完成后设置 命令如下:
$ sudo passwd root
输入你希望的root用户的密码------------------------------------------------------------------------------------------------------------------------------------------------------
ubuntu用户管理

root 用户为根用户,也就是 系统管理员 拥有全部权限 一个用户只能拥有一个 GID ,但是还可以归属于其它附加群组

用户管理的重要配置文件
/etc/passwd 用户名 密码位 UID 归属GID 姓名 $HOME目录 登录Shell/etc/shadow 用户名 已加密密码 密码改动信息 密码策略/etc/group 群组名 密码位 GID 组内用户/etc/gshadow 群组密码相关文件,不重要/etc/sudoers 用户名 权限定义 权限[/pre]可以使用 pwconv 命令创建影子密码,将 /etc/passwd 文件中的密码转换到 /etc/shadow 文件

su [用户名]
切换到其它用户,默认切换到root用户。提示密码为将切换用户密码 -f 快速切换,忽略配置文件-l 重新登录-m ,-p 不更改环境变量-c <命令> 切换后执行命令,并退出切换

sudo [命令]
以其它用户的身份执行命令,默认以root的身份执行。提示密码为当前用户密码 -s 切换为root shell-i 切换为root shell,并初始化-u <用户名UID> 执行命令的身份-l 显示自己的权限

passwd [用户名]
设定用户密码

-d 清除密码-l 锁定用户-e 使密码过期,在下次登录时更改密码-S 显示密码认证信息-x <天数> 密码过期,最大使用时间-n <天数> 冻结密码,最小使用时间-s 更改登录Shell-f 更改用户信息

示例:
$passwdChanging password for user(current) UNIX password: 原密码Enter new UNIX password: 新密码Retype new UNIX password: 确认新密码[/pre

chsh [-s ] [用户名]
更改登录Shell

挂载 USB
若/proc/bus/usb下没有相应USB设备信息,应输入以下命令将 USB 设备文件系统手动挂装到 /proc/bus/usb:
# mount -t usbfs none /proc/bus/usb
为了在系统引导时自动挂装 USB 设备文件系统,请将下面一行添加到 /etc/fstab 中的 /proc 挂装行之后: none /proc/bus/usb usbdevfs defaults 0 0

插入usb后:
sudo mount /dev/sdb1 /mnt/usb/ -t vfat -o iocharset=gb2312 #注意gb2312

配置上网***********************

Ubuntu的网络参数保存在文件 /etc/network/interfaces中,默认设置使用dhcp,内容如下:
# The primary network interface
auto eth0
iface eth0 inet dhcp

按你的修改:
1)编辑 /etc/network/interfaces =》vim /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.183
netmask 255.255.255.0
gateway 192.168.1.1

2)编辑 /etc/resolv.conf,设置dns
nameserver 110.120.119.114
nameserver 110.120.119.114

------------------------------------------------------------------------------------------------------------------------------------------------------
其它命令:
一、安装Grub
$ grub
$ find /boot/grub/stage1
(hd0,*)
$ root (hd0,*)
$ setup (hd0,*)
$ quit
$ sudo dd if=/dev/sda(*+1) of=\ubuntu.lnx bs=512 count=1
将ubuntu.lnx文件复制到Windows的根目录下,比如C:\,修改boot.ini,添加C:\ubuntu.lnx="Ubuntu 7.10"。

二、语言支持与软件更新
系统–>管理工具–>软件源–>下载自:–>其他…–>台湾–>tw.archive.ubuntu.com–>选择服务器–>关闭–>重新载入
系统–>管理工具–>语言支持(Language Support)–>支持的语言–>Chinese–>应用–>确定 $ sudo apt-get update
$ sudo apt-get upgrade

三、安装nVidia显卡驱动
下载NVIDIA-Linux-x86-100.14.19-pkg1.run。登录控制台(按下ctrl+alt+F1~F6任一)。
$ sudo /etc/init.d/gdm stop
$ sudo apt-get install build-essential #或只安装libc6-dev
$ sudo sh NVIDIA-Linux-x86-100.14.19-pkg1.run
$ sudo /etc/init.d/gdm start

四、安装字体
如果字体文件都保存在/home/(user_name)/fonts里
$ cd /usr/share/fonts/
$ ln -s /home/(user_name)/fonts myfonts/
#或者 $ mkdir myfonts
# $ cp /home/(user_name)/fonts/* myfonts/
$ cd myfonts/
$ sudo mkfontscale
$ sudo mkfontdir
$ fc-cache
系统–>首选项–>外观–>字体,在这里修改。

五、输入法SCIM
$ sudo im-switch -s scim -z default
$ sudo apt-get install scim-qtimm
$ sudo apt-get install scim scim-pinyin scim-tables-zh im-switch scim-qtimm scim-bridge scim-bridge-client-gtk scim-bridge-client-qt scim-bridge-agent
$ gksu gedit /etc/X11/xinit/xinput.d/scim
将默认的 GTK_IM_MODULE=scim 修改为 GTK_IM_MODULE="scim-bridge"。
另外,在scim输入法中进行了如下设定:scim设置->全局设置->将预编辑字符串嵌入到客户端中 前的勾去掉;scim设置->gtk->嵌入式候选词标的勾去掉。

六、NTFS分区读写支持
UBUNTU7.10默认就支持NTFS分区的读写,可是不完美,对NTFS分区下的中文文件支持不好,你会发现找不到中文的文件。
$ sudo apt-get -y –force-yes install ntfs-3g
$ sudo apt-get -y –force-yes install ntfs-config
$ [ -x /usr/bin/ntfs-3g ] && sudo ln -sf /usr/bin/ntfs-3g /sbin/mount.ntfs
$ gksudo ntfs-config &
$ set +v

七、媒体播放器的安装
$ sudo apt-get install mplayer mozilla-mplayer totem-xine libxine1-ffmpeg
下载w32codecs_20061022-0.1_i386.deb包并安装
mplayer调试(视频、字幕):启动mplayer,右键->Preferences->Video;Available drivers选择xv;然后进入Font标签 Font里选择一个中文字体,Encoding里设置为Simplified Chinese charset (CP936)。 $

八、安装解码器、flashplayer、java虚拟机、微软字体
多媒体解决方案是:一般普通的播放任务使用 Totem 电影播放机,如果遇到不能播放的情况或者看大碟时就选用 Mplayer ,播放音乐使用 audacious。
装多媒体软件和相应解码器:安装audacious Ubuntu中类似千千静听的的播放器,支持播放 ogg*, flac*, mp3, wma, wav, 3gp 这些格式。安装 mplayer 和 totem (播放 xvid/divx 编码的 avi 格式视频, rm/rmvb/asf/wmv 等流媒体视频,外加 vcd/dvd和其他 mpeg2/mpeg4 视频。)
为了方便所以来个一键全媒体方案:
$ sudo apt-get install mplayer mozilla-mplayer totem-xine libxine1-ffmpeg audacious ffmpeg gstreamer0.10-plugins-ugly gstreamer0.10-pitfdll gstreamer0.10-ffmpeg gstreamer0.10-* lame faad sox mjpegtools gstreamer0.10-* totem-xine ffmpeg lame faad sox mjpegtools sidplay-base xsidplay libggi-target-x libggi-target-emu libggi-target-monotext toolame mpeg2dec avifile-divx-plugin avifile-xvid-plugin mencoder drip libavifile-0.7c2 mpg123-el flac123 mpc mpd gmpc sonata gxine totem-xine kaffeine flac beep-media-player-* xine-ui bmpx gstreamer0.8* vlc
win32codes下载:http: //archive.ubuntu.org.cn/ubuntu-cn/dists/edgy/main/binary-i386/media/w32codecs_20060611 -1plf6.10_i386.deb;ftp://211.86.156.210/debian- multimedia/pool/main/w/w32codecs/w32codecs_20061022-0.0_i386.deb

九、安装RAR压缩/解压缩程序
$ sudo apt-get install rar
建立软链接:
$ sudo ln -fs /usr/bin/rar /usr/bin/unrar
这样,以后只要在命令行输入unrar,就可以解压或者压缩文件了,安装完成后,归档管理器也同时集成了rar组件。

十、Firefox插件
1. DownThemAll
2. Super DragAndGo
3. Fasterfox
4. MediaWarp https://addons.mozilla.org/en-US/firefox/addon/1879
5. FlashGot:https://addons.mozilla.org/en-US/firefox/addon/220
6. 更快速的打开网页,在firefox浏览器地址拦里输入about:config 找下面的选项进行修改吧: network.dns.disableIPv6 -> true
network.http.pipelining -> true
network.http.pipelining.maxrequests -> 8(8-24这是我自己的设置) network.http.proxy.pipelining -> true

十一、安装3D桌面:
Compiz Fusion,Emerald,Avant Window Navigato,Screenlets
1. 安装显卡驱动
如果是新装的Ubuntu,还没有安装显卡驱动,可以先到系统–>系统管理–>受限驱动管理器中启用受限制的驱动。
解决启动compiz后最大化、最小化、关闭按钮的标题栏消失的问题:
$ sudo nvidia-xconfig –add-argb-glx-visuals #解决没有窗口边框的问题
$ sudo gedit /etc/X11/xorg.conf
在"Module"段加入子段: SubSection "extmod"
Option "omit xfree86-dga"
EndSubSection
在"Device"段中加入:
Option "AddARGBVisuals" "True"
Option "AddARGBGLXVisuals" "True"
Option "DisableGLXRootClipping" "True"
Option "AllowGLXWithComposite" "True"
Option "RenderAccel" "True"
在配置文件的最后加入:
Section "Extensions"
Option "Composite" "Enable"
EndSection
2. 添加密钥和软件源(步骤2使用7.04的朋友需要做的!!!而使用7.10的朋友不需要做!!因此,跳过)

3. 下载安装Compiz和Compiz Fusion
$ sudo apt-get install compiz compiz-gnome
$ sudo apt-get install compizconfig-settings-manager
$ sudo apt-get install compiz-fusion-*

4. 启动Compiz Fusion了。同时按下Alt+F2,输入compiz –replace即可启动。
5. 定位到系统–>首选项–>CompizConfig Settings Manager,打开后可以对效果进行自定义:
立方体效果: 同时按下ctrl+Alt+鼠标左键(Button 1)。这个和Beryl下是一样的。
火焰字: 在左侧类别栏目的Effect下,勾选"在屏幕上绘制火焰".同时按下Shift+Win(Super)+B1,退出火焰字同时按下Shift+Win+C。
层叠效果: 在左侧类别栏目的Windows Management下,勾选Shift-Switcher。Win+Tab(和Vista下一样)。
桌面缩放: Win+鼠标滚轮。
屏幕飞雪: 在左侧类别栏目的Extra下勾选飞雪.同时按下Win+F3。

6. Compiz Fusion系统托盘管理图标的安装
$ sudo apt-get install git git-core compiz-dev
$ git-clone git://anongit.opencompositing.org/users/crdlb/fusion-icon
$ cd fusion-icon/
$ make
$ sudo make install
安装完毕后在主菜单的系统工具下可以找到compiz fusion icon启动即可。如果你希望在进入系统时自动启动可以系统–>首选项–>会话,新建一个新会话,填入fusion-icon就可以了。

7.
其他
1、解决PDF电子文档的中文乱码
$ sudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional

2、安装JAVA环境和JDK
$ sudo apt-get install sun-java6-jre
$ sudo apt-get install sun-java6-jdk
设置当前默认的java解释器
$ sudo update-alternatives –config java
输入有包含"sun"的行的前面的数字
安装浏览器的JAVA Plugin(可选)
$ sudo apt-get install sun-java6-plugin

3、安装编译工具
建议安装上 gcc,g++,make 等。
$ sudo apt-get install build-essential

4、因为经常会用到终端:所以把终端加到右键菜单:
$ sudo apt-get install nautilus-open-terminal
这就终端就在右键菜单了可以了!!

5. 有必要学会以root权限打开文件夹
$ sudo apt-get install nautilus-gksu
这样右键单击文件或文件夹,选择以管理员打开!!!

6. 查看隐藏文件是:Ctrl+ H

7、启用root(最高权限)帐户 $ sudo passwd root 输入你希望的root用户的密码

http://hi.baidu.com/xingxing_whu/blog/item/b3b9b2df7d848e1b49540334.html

Ubuntu的root密码是什么(How to set the password for root in UTUNBU)

Ubuntu安装后root不能够登录的并且也是没有默认的密码的,因为你还没给root设置密码,你第一个 user 是在 admin 组 ,所以他可以给 root 设置密码 。

给root用户设置密码。
具体步骤是打开终端(应用程序--附件--终端),然后输入下面的命令
sudo passwd root

回车后会出现让你输入密码和确认密码,例如这样
[sudo] password for you :---> 输入你的密码(你现在这个用户的密码),不回显
Enter new UNIX password: --- > 设置root 密码
Retype new UNIX password: --> 重复这样这样你的root的密码设置好了

第二步就是要启用root用户,因为root默认是不启用的。所以要在System->Administration->Users and Groups. Choose root and unlock it.

然后注销后就可以登录了!

http://wuxiong8665.blog.163.com/blog/static/93512200961184643307/

MPICH2简单的安装配置总结 (含Linux下的安装配置和单机运行) zz

MPICH2是MPI(Message-Passing Interface)的一个应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具,在程序设计语言上支持C/C++和Fortran。最近因为有项目需要的计算量比较大,所以就学习使用了MPICH2,在此根据网络上查询的相关信息和我自己的实际使用经历,分别总结一下MPICH2在windows和linux下基本的安装使用方法。


软件下载


MPICH2的主页是http://www-unix.mcs.anl.gov/mpi/mpich2/index.htm,在这个页面上就能找到各平台最新版本MPICH2的下载地址,其中还包括源代码,我在开始作这个项目的时候最新版本是windows版mpich2-1.0.5p2,源代码mpich2-1.0.5p4。我们的项目是一个CentOS版linux下的程序,所以最终是要在linux下运行的,但是又舍不得windows,于是就打算可能的话就在windows下写程序,用MinGW加windows版的MPICH2编译调试,通过后再到wmware虚拟机组成的简单集群作测试。所以,为避免不必要的麻烦,就要统一一下windows和linux下的MPICH2版本,而且不打算用最新的,因此决定用mpich2-1.0.5版。但是,如果在主页上找的话是没有以前旧版本下载的链接的(至少我没找到),只有最新版本的http和ftp下载。这难不住我等有心之人,既然提供了ftp下载,那咱就直接到他ftp服务器上找,最新源代码链接的地址是ftp://ftp.mcs.anl.gov/pub/mpi/mpich2-1.0.5p4.tar.gz,把后面文件名去掉就应该是文件的ftp存放路径,把这个路径直接写到浏览器地址栏里回车(偶用的是FireFox2),就能看到他们服务器上这个目录的文件列表,里面就有1.0.5版的windows安装文件和源代码包,分别为ftp://ftp.mcs.anl.gov/pub/mpi/mpich2-1.0.5-win32-ia32.msi 和 ftp://ftp.mcs.anl.gov/pub/mpi/mpich2-1.0.5.tar.gz 。msi文件不用多说,这是windows下安装用的,源代码包我们拿来在linux下用。


文档下载


还是主页上就有MPICH2的安装和使用指南文档,主要有三个,分别是User's Guide,Installer's Guide和Windows Developer's Guide,都down下来看看很有用的说。具体开发用的有关MPI标准的文档在MPI论坛的网站里都有,地址是http://www.mpi-forum.org/,我觉得最有用的是MPI-2: Extensions to the Message-Passing Interface。


Windows下的安装配置


我用的参与计算的系统都是WindowsXP Pro SP2,安装的过程没什么太特别的,一般就是默认就可以,只是其中有个地方要填一个什么passphrase,上面提示说所有系统都要用相同的passphrase,照做就是了,在所有参与计算的结点机器上都填一样的passphrase就好了。另外就是需要.net framework 2的运行环境。

默认安装的位置是C:\Program Files\MPICH2,下面的bin目录下是系统配置运行需要的程序,为了方便在控制台使用,可以把C:\Program Files\MPICH2\bin加到系统的PATH变量中去。Include是头文件,开发的时候用,lib是链接程序的时候用的库文件。Jumpshot下有个pdf的文档,干什么用的可以看看这个文档,我没仔细看,感觉我暂时还用不上。Examples下面是一个样本程序,就是一个用MPI计算圆周率的程序,分别有C,C++和Fortran版,C/C++的应该可以用VS2003以上版本打开。同时,安装程序还会自动向系统注册一个服务MPICH2 Process Manager,我们从控制面板-管理工具-服务里就能找到,这是管理运行MPI程序的一个服务,安装好后就是自动启动的,所以一般也就不用动它。

安装完毕后开始菜单-程序中就添加了一个MPICH2目录,其中就有上面提到的Jumpshot,另外wmpiconfig.exe是用来配置运行环境的,我在网上有找到的说明都是以前旧版本的,和现在的差别比较大,感觉这新版本用的不爽,没搞明白这个程序该咋用,不过好像默认状态下不改什么就能正常使用,所以也就不管它了。wmpiregister.exe则是用来注册用户的,使用MPI之前需要在这个程序里注册一个系统里已经存在的用户,而且这个用户必需拥有管理员权限,拥有运行我们安装了的MPI系统的能力。比如我就在所有参与运算的机器上添加了一个管理员mpi,密码也是mpi。

接下来,我们就可以开始试着运行一下MPI的程序了。就用examples目录下面的那个计算圆周率的程序。如果要多机并行计算的话,就需要在所有机器上的相同位置放置要运行的程序,我的情况就是在所有机器的C盘下建了一个mpiexe的目录,并把cpi.exe拷到所有机器的这个目录下。然后,在其中的某台机器上进入控制台(运行MPI程序其实也可以用开始菜单的MPICH2下的wmpiexec.exe,这是个gui程序,但是我觉得用的不爽,不如直接在控制台下敲命令来得灵活),敲下命令mpiexec -hosts 2 192.168.10.142 192.168.0.23 c:\mpiexe\cpi.exe。mpiexec是安装目录下bin目录里的一个程序,在本文的例子中就是C:\Program Files\MPICH2\bin\mpiexec.exe,因为刚才说了,我把这个地址加入到PATH里了,所以可以在任何地方直接执行,它是用来启动MPI程序的,-hosts参数说明是启动多台机器并行运算,后面跟着的2就是说要在两台机器上执行程序,再后面的就是那两台机器的ip地址,其中第一个就是我启动程序的机器,当然,这个地方也可以写机器名,只要它的机器名能被正常的解析就可以,最后面的就是要运行的程序,也就是刚才提到的所有机器都要在相同位置放置的那个MPI程序。如果只是在本机运行,则命令为mpiexec –n 2 cpi.exe,-n表示是在本地运行,后面的2表示启动的进程数。程序运行后就会提示让你输入一个数字intervals,这个数字影响计算的精度,值越大精度越高,当然计算时间就越长了,然后程序会打印出计算的结果和花费的时间。

比如,我使用单机单进程运行,intervals设为99999999,耗时1.253849秒,而用两台机器双进程则只有0.628954秒,明显快很多,并行运算还是很有效果的。不过,如果我们把intervals改为9999,单机运行只用了0.000279秒,而两台机器却花了0.001548秒,这是因为并行运算过程中,参与运算的机器需要通过网络传递一些消息,如果计算量不大的话,花在了这上面的时间影响会比较明显,因而反不如单机版的来得快。

到现在我们的MPI运行环境就基本安装好了,当然,MPI还有很多其他的命令参数,只不过最常用估计也就这两条了,其他的用得着的时候就去查上面提到的文档,里面有比较详细的介绍。另外,如果按照以上的介绍进行安装配置,在运行多机并行MPI程序的时候却出现连接错误的话,八成是因为网络的问题,看看你的防火墙是不是开着,打开相应的端口,或者干脆关掉防火墙就好了。



Linux下的安装配置和单机运行

Linux下的操作要相对来说麻烦一点,这个麻烦从安装开始,呵呵。我用的系统是CentOS4.4,装在VMware Workstation里的,一共装了两个虚拟机,环境基本上完全一样。为运行MPI在两台虚拟机都创建了一个用户mpi,密码也是mpi,home路径也都是/home/mpi,然后继续都创建了一个目录/home/mpi/mpich2用来作MPI运行环境的安装路径,一个/home/mpi/mpich2/src来存放编译用的源代码。然后将源代码包mpich2-1.0.5.tar.gz下载到两台机器上,都解压缩到/home/mpi/mpich2/src中,然后到/home/mpi/mpich2/src下,指定安装路径,

./configure -prefix=/home/mpi/mpich2

make

make install

几分钟后安装完毕。需要提一下的是,我曾经试着用root用户来安装MPICH2,但是安装后好重启系统就出了问题,所以建议还是另外建个用户来装吧(ubuntu干脆就把root给禁了,不让你直接用root)。

安装后/home/mpi/mpich2下多出来一些目录和文件,要比windows多,lib是库文件,include是头文件,bin还是程序文件,所以还是要写到环境变量里,可以用命令export PATH /home/mpi/mpich2/bin:$PATH,但我是用root用户直接在/etc/profile最后面加了这么一句export PATH=/home/mpi/mpich2/bin:$PATH,一劳永逸。

MPI应用一个管理器来管理运行MPI程序,这个管理器就是mpd,但是在正式开始运行mpd前还需要一个基于安全考虑的配置文件,.mpd.conf,这个文件是要放在运行程序的用户的home目录下,本例子中就是/home/mpi/.mpd.conf,而且这个文件只能由这个用户读写,创建文件的命令是,

cd $HOME

touch .mpd.conf

chmod 600 .mpd.conf

然后在文件中写入这么一行,secretword=***,***在参与计算的计算机上必需完全一致。如果是root用户的话,这个文件应该是/etc/mpf.conf。

然后,我们就可以启动mpd管理器了,直接在控制台下使用mpd命令,或者是mpd &,让mpd在后台运行,若关闭启动的mpd,只需要命令mpdallexit即可。在启动mpd之后就可以运行MPI应用程序了,执行命令与windows下类似,如我们仍然是测试一下examples里的cpi程序可以这样来作,

cd ~/mpich2/examples

mpiexec -n 1 ./ cpi

参数含义同windows下的单机运行命令。另外,启动mpd后还可以用命令mpdtrace来察看当前运行的mpd情况。


SSH配置和多机并行

MPI的多机并行是用mpdboot来管理启动的,是由参与计算的其中一台机器通过mpdboot同时启动其他机器上的mpd管理器并运行相应MPI程序的,所以,需要赋予运行mpdboot的机器执行其他机器上程序的能力。MPICH2支持通过ssh和rsh来做到这一点,其中ssh是默认的,而且其安全性也优于rsh,因此,我在项目中是用的ssh。

首先,我们需要修改所有机器上的/etc/hosts文件,在里面添加上参与计算的机器名和ip地址,比如本文中有两台机器参加的例子里,hosts文件应当为:

127.0.0.1 localhost.localdomain localhost

192.168.10.142 node0

192.168.10.23 node1

这里的意思是说,主机名为node0的机器ip地址为192.168.10.142,主机名为node1的机器ip地址为192.168.10.23。

当然,其实这一步也可以跳过,因为我们也可以在操作过程中直接使用ip地址,只不过那样不太方便。另外就是,有些机器默认情况下第一行可能包括本机的主机名,比如在ip为192.168.10.142的node0上,hosts文件第一行是

127.0.0.1 localhost.localdomain localhost node0

这样可能会使得mpdboot工作不正常,所以还是最好给成上面的那种形式。

第二步是创建ssh密钥,命令行下:

#ssh-keygen -t rsa

-t rsa指的是密钥类型,具体请察看ssh相关资料,这里不多说。这样就在当前用户的home目录下生成了一个.ssh目录,本文中的就是/home/mpi/.ssh。

第三步,将/home/mpi/.ssh下的id_rsa.pub文件拷贝改名为authorized_keys,即

#cp id_rsa.pub authorized_keys

第四步,在其他所有机器上进行以下操作。

#ssh-keygen -t rsa 生成.ssh文件夹

#scp node0的IP:/home/mpi/.ssh/* ~/.ssh 拷贝node0上的.ssh文件夹覆盖本地的

第五步,在所有机器上建立与自己和所有其他机器的信任连接。

对每个节点执行:

#ssh node0

#ssh node1

根据提示键入yes即可。然后就可以在不需要用户名密码的情况下通过ssh登陆其他机器了,比如在node0上#ssh node1,

就可以直接进入node1。

接下来,在启动mpdboot的机器上创建一个参与计算的host列表文件,如文件mpd.hosts,每行是一个主机名,创建过程如

#cd ~

#touch mpd.hosts

#vi mpd.hosts

nod0

node1


现在,就可以启动运算集群了

#mpdboot -n 2 -f mpd.hosts

-n表示要启动的机器个数,一般是不大于mpd.hosts文件中的机器数,比如本文中的例子就是两台机器。这样,列表中的机器就会启动其本机上的mpd管理器。

然后,就可以开始运行MPI程序,进行运算了,同windows下一样,程序需要放在每台机器上的相同位置(如果用NFS就只需在一台机器上放置程序,其他机器作映射就行),比如都是程序/home/mpi/mpich2/examples/cpi,在运行mpdboot 的结点机器上:

#mpiexec -n 2 /home/mpi/mpich2/examples/cpi

-n表示要启动的进程个数,一般是不大于mpd.hosts文件中的机器数(或者cpu核心数?偶用的机器就是双核的了,所以单机的时候双进程比单进程效率好很多,但是三进程就不行)。

Mpd在运行过程中,可以通过mpdtrace显示参与计算的机器名,mpdtrace –l则是显示机器名以及其端口。


http://hi.baidu.com/andy1lee/blog/item/79d492a716661693d0435829.html

linux平台下mpich2的安装以及如何运行并行程序 zz

From : http://hi.baidu.com/%B2%DD%B8%F9%CE%DE%B4%FD/blog/item/dcb32844961d4348500ffe0f.html

网上有很多资料,一搜一大片,其实很多雷同,而且是根据官方文档翻译过来的。在下载mpich2时就能下载到相应的帮助文档,安装过程在mpich2-doc-install.pdf(或mpich2-doc-README.txt)中说的很是详尽了!我仅把自己的安装过程和遇到的问题写下来。

我的计算环境是一个32CPU的集群,想在自己的帐户下安装mpich2-1.0.6,我的帐户目录为/home/mat04/ 。首先将mpich2-1.0.6拷贝到一个目录下,假设为/home/mat04/software/,接着如下:

cd /home/mat04/software/
tar zvxf mpich2-1.0.6.tar.gz
cd mpich2-1.0.6
makdir ~/mpich2-1.0.6/
makdir ~/tmp
./configure --prefix=/home/mat04/mpich2-1.0.6/ 2>&1 tee configure.log
make 2>&1 tee configure.log
make install 2>&1 tee configure.log

几点说明:
1、 由于 ./configure使用了选项--prefix ,所以在前面要先创建目录makdir ~/mpich2-1.0.6/。2、 安装的过程需要一个临时文件夹,所以makdir ~/tmp,要是没有这个tmp目录的话, ./configure总是出错。
3、 ./configure,make,make insatll中使用的 2>&1 tee ***.log 是要产生相应的log文件。
4、 与windows版本不同的是:在include文件夹下有mpi.mod,而windows下的include文件夹下则没有mpi.mod文件。windows下需要自己写一个mpi.mod,在前面的文章里有阐述。

然后,就是要将/home/mat04/mpich2-1.0.6/bin写入环境变量PATH里:
vi ~/.bashrc
插入三行:
# mpich2 variables :PATH=/home/mat04/mpich2-1.0.6/bin:$PATH
export PATH
保存退出,再source .bashrc

测试一下:
which mpirun
which mpif77
which mpd
结果应该是:
~/mpich2-1.0.6/bin/mpirun
~/mpich2-1.0.6/bin/mpif77
~/mpich2-1.0.6/bin/mpd
那就安装完成了,简单~~~,可以写一个简单的helloworld程序测试一下,当然也可以用它的cpi。

遇到的问题:
安装完成后发现/home/mat04/mpich2-1.0.6/bin目录下没有mpif90,而mpif77,mpicc,mpicxx都有。我就是要写90程序啊,就需要mpif90。不知道出了什么问题,卸了重装,换mpich2-1.0.3,问题依旧。倒是mpich-1.2.7没问题,装完就什么都有了,但是没有mpdboot,这也是我需要的啊。

昨天我针对这个问题给mpich写了封信,不知道能不能回复呢,呵呵。等不了那个,就先问了问小董,他对mpi挺熟悉的。他说是fortran编译器的问题。因为在我的帐户下装了pgf和intel两个fortran编译器,安装mpich2时,./congfigure步骤中关于fortran90的选项时认的是pgf90,而没有认intel的ifort。若把环境变量中的pgf去掉,只剩下intel的,再./configure时自然认的是ifort,安装完后在bin/目录下也有了mpif90。但是为什么pgf90不行,ifort行呢?不知道,他说在机房的10号机上只有pgf时是可以的,如果pgf和intel同时存在,不知道会怎么样。经过这个问题,我就把pgf彻底注释掉了,以后只用一个intel编译器。

最后,在集群环境下如何运行mpi程序。

1、先写一个mpd.hosts文件,里面写上要起动的节点,在1号机上有8个能用的节点oscarnode01-oscarnode08,就在里面写上这8行:
oscarnode01
oscarnode02
oscarnode03
oscarnode04
oscarnode05
oscarnode06
oscarnode07
oscarnode08
当然也可以把主节点simserver01也写进去。

2、启动节点: mpdboot -n 2 -f mpd.hosts
2代表2台机器,在这里就是两个节点。此时启动的是mpd.hosts中最前面的两行,即1,2节点,因为1,2节点都已经坏掉了,所以应该把oscarnode03和oscarnode04写在最前面。若mpdboot -n 9 -f mpd.hosts则会出错了,因为没有那么多个节点可用啊~~~

3、提交任务:mpiexec -n 4 ./helloworld
两个节点有4个CPU,当然要使用4个进程了,就是提了8个进程,也是在这4个CPU上运行。

4、退出:mpdallexit

几点说明:
1、虽然mpd.hosts启动的是3,4节点,但要是站在主节点simserver01上提任务,主节点上便会有任务进程运行,尽管主节点simserver01并不在mpd.hosts中。所以要先ssh oscarnode04进入一个节点中,再提交任务。
2、在集群环境中提交castep,pwscf,vasp等任务多用作业管理程序,如PBS。自己写的mpi程序也应该用pbs提交,试了几次不太理想,没有完全成功,pbs脚本还是不太会写。等成功了再写一篇文章吧。

写完这篇文章后,看了看邮箱,mpich回信了,原因跟小董说的一样,就是configure没找到f90编译器,老外的工作效率就是高啊,前天下午发的邮件,昨天早晨就回了,我今天下午才看见,是我耽误了自己啊,呵呵,其实是我写信的时候觉得他不一定能给我回复啊。以下是他的回复:The configure.log file you sent was empty. But it is possible that configure could not find the Fortran 90 compiler. You can specify the Fortran 90 compiler by setting the environment variable F90 to the name of the compiler and then rerunning configure, make, make install. Also make sure the f90 compiler is in your default path, or provide the full path in the F90 environment variable.

Linux 中设置MPICH2的环境变量

有两种方法:

1、修改profile文件: #vi /etc/profile 在里面加入:
export PATH=/home/tliu/mpich2-install/bin:$PATH

2. 修改.bashrc文件: # vi /root/.bashrc 在里面加入:
export PATH=/home/tliu/mpich2-install/bin:$PATH

这两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
# echo $PATH 看看输出里面是不是已经有了/my_new_path这个路径了。

Tuesday, December 1, 2009

VirtualBox下Windows Host Ubuntu Guest共享文件夹的设置-2

作者RunningOn。
所谓Windows Host Ubuntu Guest,就是指VirtualBox安装在Windows下,VirtualBox里虚拟的操作系统是Ubuntu。这样的配置在大学里很常见,为了做实验又不想装独立Linux,一般就这样配置。本文里用的Windows是指Windows XP SP2,VirtualBox和Ubuntu都是最新的,即VirtualBox1.5.6和Ubuntu 8.04(Hardy Heron)。

本来Linux Guest安装共享文件夹比较麻烦,但在WindpwsXP和最新的VirtualBox和Ubuntu下,事情变得非常简单。如果你的系统不符合这些条件,那么安装方法请见VirtualBox的end user manual。废话不多说,让我们开始吧。共分三步:

1. 首先要安装虚拟电脑工具包
我假设你的VirtualBox1.5.6和Ubuntu8.04已经安装完毕,启动VirtualBox,运行Ubuntu并登录,然后在VirtualBox的菜单里选择"设备"->"安装虚拟电脑工具包",你会发现在Ubuntu桌面上多出一个光盘图标,这张光盘默认被自动加载到了文件夹/media/cdrom0,而且/cdrom自动指向这个文件夹。默认设置下文件管理器会自动打开这张光盘,可以看到里面有个"VBoxLinuxAdditions.run"文件。

打开一个命令行终端,依次输入"cd /cdrom"和"sudo sh ./VBoxLinuxAdditions.run",不含双引号,开始安装工具包。安装完毕,会用英文提示要重启Ubuntu,建议立刻重启。

重启后,比较明显的变化是鼠标是共享模式,并且剪贴板也和Windows共享了。如果有这些变化,说明虚拟电脑工具包已经装成功。

2. 下一步设置共享文件夹。
这里只介绍图形界面的设置方法,命令行方式的不做介绍,也不推荐,因为没必要。如果Ubuntu正在运行,请右键点击对应的VirtualBox窗口右下角的共享文件夹图标(在鼠标图标的左边),打开共享文件夹的设置窗口。如果Ubuntu没有运行,在VirtualBox界面左边的列表中选择ubuntu虚拟机,并在右边的列表中单击“共享文件夹”,也可以打开同样的共享文件夹设置窗口。在共享文件夹设置窗口中,单击右侧的"添加一个共享文件夹",路径选择你想要共享的Windows文件夹,共享名任取一个自己喜欢的,比如"myshare",选项read-only是指是否只允许ubuntu读这个文件夹,请根据需要选择这个选项。搞定后点确定并关闭窗口。

3. 再要在ubuntu下挂载这个共享文件夹。
在Ubuntu下的命令行窗口里输入"sudo mount -t vboxsf myshare /media/share",不含双引号。其中"myshare"是之前取的共享文件夹的名字,"/media/share"是要挂载到的目标文件夹,是我事先已经建好了的,最好是个空文件夹。

到此一般就搞定了,Windows下的共享文件夹,对应Ubuntu下的我建立的"/media/share",你可以试试在Ubuntu下能不能操作那个共享文件夹。

默认设置下是支持中文的,如果有乱码,请查找与磁盘挂载相关的文章。重启Ubuntu后需要重新挂载共享文件夹,即重新运行"sudo mount -t vboxsf myshare /media/share",想自动挂载,请查找修改/etc/fstab文件的文章,本文亦不做描述,另一解决办法是永远不重启Ubuntu,而是使用VirtualBox提供的快速休眠功能,即关闭VirtualBox时,选择"快速休眠"。大部分情况下,休眠就可以了,快且方便。

Thursday, November 26, 2009

Linux下C语言编程基础知识 (zz)

Linux下C语言编程基础知识
作者:Hoyt Em ail:hoytluo@21cn.com

作 者:Hoyt Email:hoytluo@21cn.com

前言:
这篇文章介绍在LINUX下进 行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以 下内容:
源程序编译
Makefile的编写
程序库的链接
程序的调试
头文件和 系统求助

----------------- ------------------------------ ------------------------------------------------------------------------
1.源程序的编 译
在Linux下面,如果要编译一个C语言源程序,我 们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何 使用gcc编译器.
假设我们有下面一个非常简单的源程 序(hello.c):
int main(int a rgc,char **argv)
{
pri ntf("Hello Linux\n");

}

要编译这个程序,我们只要在命 令行下执行:
gcc -o hello hello. c
gcc 编译器就会为我们生成一个hello的可执 行文件.执行./hello就可以看到程序的输出结果了.命令行 中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表 示我们要求编译器给我们输出的可执行文件名为hello 而he llo.c是我们的源程序文件.
gcc编译器有许多选 项,一般来说我们只要知道其中的几个就够了. -o选项我们已经 知道了,表示我们要求输出的可执行文件名. -c选项表示我们只 要求编译器输出目标代码,而不必要输出可执行文件. -g选项表 示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息 .
知道了这三个选项,我们就可以编译我们自己所写的简 单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助 文档,那里有着许多对其它选项的详细说明.

-------------------------------------------------------------------------------------------------------------------------

2.Mak efile的编写
假设我们有下面这样的一个程序,源代 码如下:

/* main.c */
#include "mytool1.h"
#include "mytool2.h& quot;

int main(int arg c,char **argv)
{
mytoo l1_print("hello");
mytool2_print("hello&q uot;);
}


/* mytool 1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *pr int_str);
#endif


* mytool1.c */
#includ e "mytool1.h"

void mytool1_print(char *print_s tr)
{
printf("This is mytool1 print %s\n", print_str);
}


/* m ytool2.h */
#ifndef _MYTOO L_2_H
#define _MYTOOL_2_H
void mytool2_print(cha r *print_str);
#endif


/* mytool2.c */
#i nclude "mytool2.h"

void mytool2_print(char *pr int_str)
{
printf(&quo t;This is mytool2 print %s\n&q uot;,print_str);
}


当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c
gcc -c myto ol1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
这样的话我们也可以产生main程 序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改 了其中的一个文件(比如说mytool1.c)那么我们难道还要 重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说 ,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们 的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?

为此,聪明的程序员们想出了一个很好的工具来做这 件事情,这就是make.我们只要执行以下make,就可以把上 面的问题解决掉.在我们执行make之前,我们要先编写一个非常 重要的文件.--Makefile.对于上面的那个程序来说,可 能的一个Makefile的文件是:

# 这是上面那个程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c

有了这 个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.

下面我们学习Makefile是如何编写的.
在 Makefile中也#开始的行都是注释行.Makefile中 最重要的是描述文件的依赖关系的说明.一般的格式是:
target: components
TAB rule

第一行表示的是依赖关系.第二行是规则.
比如说我们上面的那个Makefile文件的第二行 main:main.o mytool1.o mytool2.o
表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o
当倚赖的对象在目标修改后修改的话, 就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键
Makefile有 三个非常有用的变量.分别是$@,$^,$<
代表的意义分 别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.
如果我们使用上面三个变 量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $ <

mytool1.o:mytool1.c m ytool1.h
gcc -c $<

mytool2.o:mytool2.c mytool2.h
gcc -c $<


经过简化后 我们的Makefile是简单了一点,不过人们有时候还想简单一 点.这里我们学习一个Makefile的缺省规则
.c .o:
gcc -c $<


这 个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:

#这是再一次简化后的Makefile
main:main.o mytool1.o mytoo l2.o
gcc -o $@ $^
.c.o :
gcc -c $<


好了, 我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.

-------------------------------------------------------------------------------------------------------------------------
3.程序库的链接
试着编译下面这个程序

/* temp.c */
#include

int main(int argc,char **argv)
{
double value;
printf("value:%f\n& quot;,value);
}

这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误.
/tmp /cc33Kydu.o: In function `main :
/tmp/cc33Kydu.o(.text+0x e): undefined reference to `log
collect2: ld returned 1 exit status

出现这个错误是因为编 译器找不到log的具体实现.虽然我们包括了正确的头文件,但是 我们在编译的时候还是要连接确定的库.在Linux下,为了使用 数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么 没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译 器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用 到编译器的 -L选项指定路径.比如说我们有一个库在 /hom e/hoyt/mylib下,这样我们编译的时候还要加上
-L /home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径
/lib, /usr/lib, /usr/local/lib, 在这三个路径下面的库,我们可以不指定路径.

还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:0000 9fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道 怎么找,请赶快告诉我,我回非常感激的.谢谢!

-------------------------------------------------------------------------------------------------------------------------
4.程 序的调试
我们编写的程序不太可能一次性就会成功的,在 我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们 就要对我们的程序进行调试了.
最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看 gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情, 我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一 个用.

-------------------------------------------------------------------------------------------------------------------------
5.头文件和系统求助
有时候 我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记 得着函数在那个头文件进行了说明.这个时候我们可以求助系统.
比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的. 和这个函数所在的头文件说明了. 如果我们要write这个函数 的说明,当我们执行man write时,输出的结果却不是我们 所需要的. 因为我们要的是write这个函数的说明,可是出来 的却是write这个命令的说明.为了得到write的函数说明 我们要用 man 2 write. 2表示我们用的write 这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的 库函数.
记住不管什么时候,man都是我们的最好助手 .


---------------- ------------------------------ ------------------
好了,这一章就 讲这么多了,有了这些知识我们就可以进入激动人心的Linux下 的C程序探险活动.

From: http://www.aonet.cn/artical/39/200504858.htm

Wednesday, May 20, 2009

Emacs用户手册中文版 zz

译者: con Copyright (c) 1985 Free Software Foundation, Inc; See end for conditions.
You are looking at the Emacs tutorial.

Emacs 的命令通常包括控制键(就是上面标有 Ctrl或Ctl的那个)或者是META键(上面标有ED99v或ALT)。为了方便起见我们将用下面的缩写来代替这些键的全称:

C- 意思是当敲入字符 时同时按住控制键,因此,C-f表 示:按住控制键并且按 f 。 M- 表示当键入 时按住META或ALT或ED99v键。如果没有META 或ALT或ED99v键,则用ESC键代替。 表示ESC键

注意:退出Emacs,按C-x C-c(两个字符)。在文本左边区域的“>>”符号表示让你试着使用一个命令。比如:
>> 现在键入C-v(观看下一屏)移动到下一屏。(就象前面说的,按v的同时也按住控制键)。从现在开始,每当你读完一屏的时候都可以用它来翻屏。
注意在翻屏后会保留上屏的最后一行;这是为你继续阅读文本提供某些连贯性。
你所需要知道的第一件事是如何把光标从一个地方移动到另一个地方。你已经知道了如何向前翻一屏--用 C-v。要向后翻一屏,键入M-v。
>> 试着键入 M-v 和 C-v 几次。
* 摘要(SUMMARY)
---------------------------
下面几个命令对整屏观看时有用:

C-v 向前翻一整屏。
M-v 向后翻一整屏。
C-l 清除屏幕并重新显示所有的文本,然后把光标移动到屏幕的中央。 (注意是Control-L,而不是 Control-1)。
>> 寻找光标,并且注意它在文本里的位置。然后键入C-l。再寻找光标你会注意到光标现在会出现在同样的文本附近。
* 基本光标控制(BASIC CURSOR CONTROL)
-----------------------------------------------------------------
整屏整屏的移动是很有用的,可是如何把光标移动到屏幕上文本里的一个指定的地方呢?
有好几个方法可以实现。最基本的方法是用命令 C-p,C-b,C-f,和C-n。这些命令每个都使光标在屏幕上往特定的方向移动一行或者一列。下面是一个图表显示了这四个命令和它们所移动的方向:


上一行,C-p
:
:
向前,C-b ...... 当前光标的位置 ...... 向后,C-f
:
:
下一行,C-n
>> 用C-n或C-p把光标移动到图表中间。然后键入C-l会看到整个图表出现在屏幕的中央。



你也许会发现这些字母很容易记住:P 代表上面的(previous),N 代表下一个 (next),B 代表向前(backward),F 代表向后(forward)。这些是基本的光标位置命令,你将经常会用到它们。所以现在学习它们很有好处。


>> 用几次 C-n 把光标向下移动到这一行。

>> 用 C-f 把光标移动到行里,再用C-p把光标上移。观察当光标在行的中间时 C-p做了些什么。
每一个文本行都以一个换行符结尾,它用来当作行与行之间的分格。你的文件的最后一行的尾部应该有一个换行符(但Emacs并不要求一定要有一个)。
>> 试着在行的开头使用C-b。它将会把光标移到上一行的末尾。这是因为它向后移的时候穿过了换行符。
C-f 也能象 C-b一样穿过换行符。
>> 使用几次C-b,使您能知道光标在哪。然后用C-f移动到行的末尾。然后再用一次C-f,使光标移动到下一行。

当你移动超过屏幕的顶部或底部,光标回移动到下一屏的中间,这叫做“滚屏 (scrolling)”。它使得Emacs滚屏移动到文本上指定的部位而不是移出屏幕。

>> 试着用C-n把光标移过屏幕的底部,看看回发生什么。

如果觉得一个一个字符的移动太缓慢,可以一个单词一个单词的移动。M-f(Meta-f) 向前移一个单词,M-b向后移一个单词。
>> 键入几个M-f和M-b。

当光标在一个单词的中间,M-f移动到单词的末尾。当光标在两个单词间的空白部分 M-f移动到后一个单词的末尾。M-b与M-f一样,只是移动的方向相反。
>> 键入M-f和M-b几次,中间穿插一些C-f和C-b以使你能观察到M-f和M-b在单词中和单词间的不同行为。

注意比较C-f,C-b与M-f,M-b。通常情况下Meta键用于有关语言单位(词,句,段落) 的操作;而控制键用于编辑时的基本单位(字符,行等)。
这是句与行的比较:C-a和C-e移动到一行的开头和末尾,M-a和M-e移动到一个句子的开头和末尾。
>> 键入一对C-a,再键入一对C-e。 键入一对M-a,再键入一对M-e。

你会看到重复键入的C-a什么也不做,而重复键入的M-a则会移动一个以上的句子。
光标在文本中的位置也叫“点(point)”。在段落里,光标标示出了点在屏幕上文本里的位置。
下面是简单的光标移动命令的总结,包括单词和句子的移动命令:

C-f 向前移动一个字符。
C-b 向后移动一个字符。

M-f 向前移动一个单词。
M-b 向后移动一个单词。

C-n 移动到下一行。
C-p 移动到上一行。

C-a 移动到行首。
C-e 移动到行尾。

M-a 向前移动到句子的开头。
M-e 向后移动到句子的末尾。

>> 试着对每一个命令都实践几次,它们都是经常要用到的命令。
另外两个重要的光标移动命令是M-<(Meta小于),它移动光标到整个文本的开头,M-> (Meta大于)它移动光标到整个文本的末尾。
在多数终端上,“<”在逗号的上面,所以你必须用Shift键来输入它。在这些终端上,你也必须用Shift键来输入M-<;没有Shift键,你可以输入M-逗号。 >> 现在就试试M-<,移动到本教程的开头,然后再用C-v移回这里。 现在就试试M->,移动到本教程的末尾,然后再用M-v移回这里。

你也可以用方向键来移动光标,如果你的终端有方向键的话。我们建议学习C-b, C-f,C-n和C-p有三个原因。第一,它们能在所有类型的终端上工作。第二,你获得了使用Emacs的锻炼,你将会发现输入这些CTRL加字符比按方向键要快(因为你不必把你的手从键盘上移开)。第三,一旦你养成了使用这些CTRL加字符的命令的习惯,你就能一样容易的学习其他高级的光标移动命令。
大多数Emacs命令接收一个数字参数;对大多数命令来说,这表示命令重复的次数。输入重复命令次数的方法是在输入命令之前按C-u和数字。如果你有 META(或ED99v或 ALT)键,则有另一种方法输入数字参数:在按住META键的时候输入数字,我们建议学习C-u方法,因为它能在任何终端上工作。
例如,C-u 8 C-f 向前移动8个字符。
>> 试着使用带数字参数的C-n或C-p,只用一个命令就把光标移动到与本行相邻的 行上。

绝大多数命令把数字参数当作重复次数,但也有几个例外。C-v和M-v就是。当给出一个参数,只是上滚或下滚数字指定的行数而不是屏数。比如,C-u 4 C-v滚动4行屏幕。


>> 现在试试 C-u 8 C-v。
这将使屏幕滚动8行,如果你想往回滚动的话,键入一个带参数的M-v。
如果你正在使用X窗口,在Emacs窗口的左手边有一个叫做滚动条的矩形区域。你能通过用鼠标点击滚动条来滚动文本。
>> 试着在滚动条顶部的高亮区域点击中键。这将使文本滚动,滚动的位置取决于 你点击的长短。

>> 试着按住鼠标中键上移或下移鼠标,你将看到当你移动鼠标时文本会上下滚动。
* 当EMACS挂起时(WHEN EMACS IS HUNG)
------------------------------------------------------------------
当Emacs停止响应你的命令时,你能用C-g把它安全的停止。当一个命令执行了太长的时间时你可以用C-g把它终止。
你也可以用C-g来取消数字参数和输入后又不想执行的命令。
>> 键入C-u 100 产生一个值为100的数字参数,然后按C-g。再按C-f。它只会移动 一个字符,因为你用C-g取消了参数。


如果错误的输入了一个 ,你能用C-g消掉它。
* 禁止命令(DISABLED COMMAND)
----------------------------------------------------
一些Emacs命令是“禁止”的,所以新手不会因偶然而执行它。
如果你键入了一个禁止命令,Emacs会显示一条消息说明这条命令是干什么的,并且问你是否需要执行它。
如果你真的想要执行,敲空格键继续。通常,如果你不想执行禁止命令,用“n”来回答。

>> 输入 :(一条禁止命令),然后用n来回答。

* 窗口(WINDOWS)
-----------------------------
Emacs 能有好几个窗口,每一个显示自己的文本。我们将在后面解释怎样对多窗口操作。现在我们要解释怎样去除多余的窗口屏回到基本的单窗口编辑状态。这是一个例子:
C-x 1 一个窗口(也就是除去其他所有的窗口)。
因为Control-x跟了数字1。C-x 1使包含光标的窗口占满整个屏幕,屏删除其他所有窗口。
>> 把光标移动本行并输入 C-u 0 C-l。
>> 键入Control-h k Control-f。 看这个窗口如何缩小,并在按Control-f的时候出现了一个新的文档窗口。
>> 键入C-x 1 并且看到那个文档窗口消失了。

* 插入和删除(INSERTING AND DELETING)
---------------------------------------------------------------
如果你要插入文本,只须输入文本。输入的字符你能见到,比如A,7,*等等。Emacs 会立即把它们插入。键入 (回车键)插入一个换行符。
你能用 删除你输入的最后一个字符。 就是键盘上标着“Del”的键。在某些情况下,“Backspace”键作用和 一样,但不总是这样!


通常, 立即删除光标前面的那个字符。


>> 输入几个字符,然后用 删除它们。不必担心这个文件回被改变;你不会 替换主教程。这只是你的个人拷贝。

当一行文本太长而超过屏幕宽度时,这一行会在屏幕的下一行被“继续”。文本的右边会有一个反斜杠“”表示它被继续。
>> 插入文本直到最右边,然后再插入。你将看到一个继续了的行。
>> 使用 删除文本直到行的长度在屏幕的宽度以内。继续的行将会消失。

你能像删除其他任何字符一样删除换行符。删除两个行间的换行符会使它们合并为一行。如果这一行很长屏幕显示不下的话,将会用一个继续的行来表示。
>> 把光标移动到一行的开头按 这将使本行和上一行合为一行。
>> 按 重新插入你删除的换行符。

记住大多数的Emacs命令能接收一个重复次数。这包括文本字符,把一个文本字符重复的插入几次。
>> 键入这个-- C-u 8 * 来插入 ********

你现在已经学习了Emacs的大多数输入和排错的方法。你也能一样的删除单词或行。这是删除操作的摘要:
删除光标前面的字符
C-d 删除光标后面的字符
M- 除去光标前面的单词
M-d 除去光标后面的单词
C-k 除去从光标位置到行尾的内容
M-k 除去到当前句子的末尾
注意比较 ,C-d与M ,M-d和C-f,M-f( 不是一个控制字符,但不用担心)。C-k和M-k就象C-e,M-e。
当你一次除去不止一个字符时,Emacs将保存着这些文本,所以你可以恢复它们。恢复那些被除去的文本称作“拉(yanking)”。你能在除去文本的同一地方拉回它们,或是在文本的其他地方。你能对文本拉上几次以产生它们的多个拷贝,拉的命令是 C-y。
注意“除去(killing)”与“删除(Deleting)”之间的区别,被除去的东西能被拉回来,而被删除的不能。通常除去能除去很多的文本屏保存,而删除只能除去一个字符,或是空行或空格,并且不保存。


>> 把光标移到一个空行的开头,键入C-k除去这一行。
>> 按第二次C-k,你将看到剩下的空行也被除去了。



注意单个的C-k除去行的内容,第二个C-k除去行本身,并且使后面的所有行上移。特别要注意数字参数:它除去很多行和它们的内容,这不仅仅是重复。C-u 2 C-k 除去两行和它们剩下的空行;而按两次C-k并不会这样做。


要在当前光标处找回上次被除去的文本;按C-y


>> 试一试,用C-y把文本拉回来。



把C-y考虑为你把某人从你这里拿走的东西再拿回来。注意你如果在一行上按了几次 C-y,所有被除去的文本是存在一起的,所以按一次C-y将拉回全部的行。


>> 现在就试一下,按几次C-k。 现在找回被除去的文本;


>> 按C-y。然后把光标下移几行再按一次C-y,你现在会看到怎样拷贝这些文本。



当你要拉回一些被除去的文本该怎样做呢?C-y只能拉回最近被除去的文本。但以前的文本并没有消失。你能用M-y来恢复它。当你用C-y拉回最近被除去的文本后,换成 M-y可以拉回以前被除去的文本。键入一次又一次的M-y可以拉回更早以前被除去的文本。当你找到要寻找的文本,不必做任何事来保持它,只须离开拉文本的地方继续你的编辑。


如果你M-y了足够多的次数,你会回到开始点(最近被除去的)。


>> 除掉一行,移开,再除掉另一行。 然后用C-y拉回第二行。 然后换成M-y拉回被除掉的第一行。 再按一次M-y看看得到了什么。继续按直到拉回被除去的第二行;然后再做几次。 如果原意的话,你可以给M-y加正的或负的数字参数。


* 撤销(UNDO)
--------------------


如果你对文本作了一些改动,然后又发现这样做是错误的,你能用撤销命令,C-x u 撤销这些改变。

通常,一次C-x u撤销一个改变;如果你在一行上重复几次C-x u,就会重复几次撤销操作。

但有两个例外:不改变文本的操作(包括光标移动和滚屏命令)不算在内;只能处理20 次。


>> 用C-k除去这一行,然后按C-x u 它将重现出来。

C-_是一个可选择的撤销命令;它所作的工作和C-x u 完全一样,只是更容易输入。 C-_的缺点是有些键盘上没有它,这就是为什么还提供C-x u的原因。在某些终端上你可以按住CTRL的时候再敲/来输入C-_。C-_或C-x u把数参数字当作重复次数。

* 文件(FILES)
-------------------

为了永久保存你编辑的文本,你必须把它放到一个文件里。否则当你退出Emacs的时候它就会消失。你通过“查找(finding)”文件,把你编辑的内容放到文件里。(也称为 “访问(visiting)文件”)。


(译注:为了保持与原文的一致性,把find译为“查找”,但是这里和后面出现的 “查找文件”指的都是打开文件的意思。)


查找(finding)一个文件意味着你在Emacs里看文件的内容,在多数情况下,也就是你在编辑它。但是,你用Emacs对它作的改变并不是永久行的,除非你“保存(saving)” 它。所以你可以避免把一个改了一半的文件留在系统上。甚至你保存了文件,Emacs也会把原始文件换个名字保留下来,以防过后你发现对文件的改动是错误的。


如果你观察屏幕的你将看见一个开始和结尾都是破折号的行,并且以“--:**-- TUTORIAL”或之类的东西开始。屏幕的这部分通常显示你正在访问的文件的名字。现在,一个叫做“TUTORAL”的文件,它是你的Emacs教程的个人拷贝。当你用Emacs 查找一个文件,文件名会出现在同样的位置。


查找和保存文件命令不像前面学的那些命令。它们都以字符Control-x开始。以 Control-x起头的是一个完整的命令系列;它们中的许多都是对文件,缓冲,和相关的东西进行操作的。这些命令有两个,三个或四个字符长。


关于查找文件命令的另一件事是你必须给出你需要的文件的文件名。我们说这个命令 “从终端读取一个参数”。(在这种情况下,参数是文件的名字);当你键入命令C-x C-f后,Emacs会提示你输入文件的名字。你输入的文件名会出现在屏幕底部的行上。这个底部的行称为微型缓冲(minibuffer)用于这类较短的输入。你能用Emacs本身的编辑命令来编辑文件名。


当你正在输入文件名(或其他任何微型缓冲区输入),你能用命令C-g来取消。


>> 键入命令C-x C-f,然后输入C-g。这将取消微型缓冲,也取消了C-x C-f命令所使 用的微型缓冲,所以你不查找任何文件。



当你输完文件名后用 来结束。然后C-x C-f开始工作,并开始寻找你所选择的文件。当C-x C-f命令结束后微型缓冲区也消失了。


过一小会儿文件的内容就会显示在屏幕上,然后你就能对它进行编辑了。当想永久保留你的改动时用命令:


C-x C-s 保存文件(save the file)。


这个操作会把Emacs里的文本拷贝到文件里。在你第一次作的时候,Emacs把原始文 件改为一个新名字以使它不至于丢失。新名字是在原来名字的后面加一个“~”。


保存结束后,Emacs打印出被写的文件的文件名。你应当经常的保存,万一系统崩溃 的话你不至于丢失太多的工作。


>> 键入C-x C-s来保存你的教程的拷贝。屏幕的底部会打印出“Wrote.....TUTORIAL”。



注意:在某些系统上,输入C-x C-s 会把屏幕冻结住使你从Emacs看不到更多的输出。这表示这个操作系统的“特性”叫做“控制流程”,它拦截了C-x不让它到达Emacs那里。要使屏幕解冻,输入C-q,然后看Emacs手册里的“Spontaneous Entry to Incremental Search”一节,按上面的建议来对付这种“特性”。


你能查找一个已存在的文件,来查看它或编辑它。你也可以查找一个尚未存在的文件。这是 Emacs:里创建文件的方法:查找文件,将会出现一个空白,然后插入文件的文本。当你 “保存(saving)”的时候,Emacs将会用你插入的文本创建文件。从那时候起,你可以认为你在编辑一个存在的文件了。




* (缓冲)BUFFERS
--------------------------



如果你用C-x C-f查找第二个文件,第一个文件仍然留在Emacs里。你可以再用C-x C-f查找一次来切换回去。用这种方法你在Emacs里有很多文件。


>> 输入C-x C-f foo 来建立一个名为foo的文件。然后插入一些文本,编辑它,并 用C-x C-s来保存“foo”。 最后输入C-x C-f TUTORIAL 以回到本教程。




Emacs把每个文件的文本都保存在一个叫“缓冲(buffer)”的东西里。查找(打开)一个文件就会在Emacs里产生一个新的缓冲。要看你当前运行的Emacs里存在的缓冲列表,输入:


C-x C-b 列出缓冲(list buffers)


>> 输入 C-x C-b



观察每个缓冲都有一个名字,它可能也有一个它所保存的文件的文件名。一些缓冲不对应文件。比如,叫“*Buffers List*”的缓冲没有任何文件。这个缓冲只包含由C-x C-b产生的缓冲列表。你在Emacs窗口里看到的任何文本都是某个缓冲的一部分。



>> 输入 C-x 1 消除缓冲列表。



如果你对一个文件的文本作了改动,然后查找另一个文件,第一个文件并不保存。它的改变保存在Emacs里,在那个文件的缓冲里。被建立或编辑的第二个文件的缓冲并不影响第一个的。这一点很有用,但这也意味着要有一个便捷的方法来保存第一个文件的缓冲。如果要用 C-x C-f切换回去只是为了按C-x C-s保存它将会是一件令人讨厌的事。所以我们用


C-x s 保存缓冲(save the buffer)


C-x s 向你询问每个改动过但未存盘的缓冲,对每个这样的缓冲都询问是否保存。


>> 插入一行文本,然后按C-x s。 将会问你是否保存叫TUTORIAL的缓冲。 输入“y”来回答是。





* 扩展命令集(EXTENDING THE COMMAND SET)
-----------------------------------------------------------------------



有太多的Emacs命令,大大超过了Contorl和meta加上字符所能表示的数量。Emacs用X(扩展 eXtand)命令来解决这个问题。有两种风格:


C-x 字符扩展,后跟一个字符。
M-x 名字命令扩展,后跟一个长名字。


这些命令通常有用,但不如你已经学过的那些命令使用的频繁。你已经见过了它们中的两个:文件命令C-x C-f 用于查找和C-x C-s用于保存。


另一个例子是结束Emacs的命令C-x C-c(不必担心你所作的改动会丢失,在退出Emacs 之前,C-x C-c会提示你保存每一个改动过的文件)。


C-z命令用于*临时*退出Emacs,所以你能回到原来运行的Emacs里。在允许这样做的系统上,C-z把Emacs“挂起”;就是说回到外壳(shell)下,但并不破坏运行的Emacs。在大多数外壳上,你能用‘fg'命令或‘%emacs'来继续Emacs。


在不支持挂起的系统上,C-z建立一个子外壳(subshell)运行于Emacs下以使你能运行其他程序然后回到Emacs;这并不是真正的“退出” Emacs。在这种情况下,通常从子外壳回到Emacs的外壳命令是‘exit'。 有很多C-x 命令,这是已学过的一个列表:


C-x C-f 查找文件
C-x C-s 保存文件
C-x C-b 缓冲列表
C-x C-c 退出Emacs


C-x u 撤销操作


被称作扩展命令的命令的使用频率都不太高。或者是只在某些模式下使用。一个例子是替换字符串的命令,它在全文里把字符串替换为其他的。当你键入M-x, Emacs会在屏幕的底部提示你输入命令;在这种情况下,是“replace-string”。比如输入“repl s ”, Emacs会把命令补全。用 来结束命令。


替换字符串命令要求两个参数--要被替换的字符串和用来替换的字符串。你必须用 来结束两个参数。


>> 把光标移上两行,然后输入M-x repl s changed altered 。 注意现在这一行改变了:你把光标初始位置后的所有单词c-h-a-n-g-e-d替换为了 “altered”





* 自动保存(AUTO SAVE)
------------------------------------



当你改动了一个文件还未存盘的话,所作的改动也许会由于系统崩溃而丢失。为防止这种情况发生,Emacs在编辑时为每个文件提供了“自动保存(auto save)”。自动保存的文件的文件名前后都有一个#号;例如,如果你编辑的文件名叫“hello.c”,自动保存的文件的文件名就叫 “#hello.c#”。当你正常的保存了文件后,Emacs会删除这个自动保存的文件。如果遇到死机,你能打开那个文件后按M-x recover file 来恢复你的编辑,(是你编辑的文件而不是自动保存的文件)。当提示确认时,输入yes 来继续恢复自动保存的数据。




* 回显区域(ECHO AREA)
------------------------------------



如果Emacs发现你输入命令的速度很慢的话它会在屏幕底部为你显示出来,这个区域叫 “回显区域”。




* 模式行(MODE LINE)
---------------------------------



回显区域上面的一行称为“模式行(mode line)”。模式行显示与下面类似的东西:


--**-Emacs: TUTORIAL (Fundamental)--L670--58%----------------


这一行给出了有关你在编辑的文件和Emacs状态的有用信息。


你已经知道了文件名意味着什么。--NN%--指出你现在在文本里的位置;它意味着上面还有NN%的文本。如果是在文件的开头,会用--Top-- 来代替--0%--。如果是在行的末尾,会显示--Bot--。如果你正在看的文本内容很少,可以全部显示在屏幕上,模式行会说 --All--。


前面的星号表示你已经改动过文本了。一旦你保存了文件或打开了一个新文件,模式行的这部分就不是星号而是破折号了。


模式行上括号里的部分是现在的编辑模式。现在是缺省的基本(Fundamental)模式。它是 “主模式(major mode)”的一种。


Emacs有很多不同的主模式。有些意味着不同的语言或不同的文本。如Lisp模式(Lisp mode),文本模式(text mode)等等。在任何时候有且只能有一种主模式被激活。并且它的名字会出现在现在显示“Fundamental”的位置上。


每一个主模式都有些自己的命令。就象不同的编程语言的注释看起来不同一样。每种主模式插入的注释也不同。可以用扩展命令切换进某种主模式。例如,M-x fundamental-mode 是切换进基本模式。


>> 输入 M-x text-mode



不必担心,没有命令会给Emacs带来很大改变。但是你可以看到现在M-f和M-b把省略号当作单词的一部分。而先前,在基本模式里,M-f 和M-b把省略号当成当成分隔符。


主模式通常作诸如此类微小的变化:大多数命令在每个主模式里作“同样的工作”,但又有些微小的不同。


要观看关于你现在的主模式的文档,按C-h m。


>> 键入C-u C-v一次和多次使本行接近屏幕的顶端。
>> 输入C-h m ,看看文本模式和基本模式有些什么不同。
>> 按C-x 1 从屏幕上关掉这个文档。



主模式之所以叫做主模式是因为也存在从模式,从模式与主模式完全不同。每个从模式可以自己打开或者关闭,独立于所有其他从模式,也独立于你的主模式。所以你可以不用从模式或者同时用很多种从模式。


有一种从模式很有用,特别是在编辑英文文本时。它是自动填充模式(auto fill mode)。当这个模式打开的时候,当输入的文本过宽的时候就会自动折行。


你能用M-x auto-fill-mode 来打开自动填充模式。如果此模式已经打开M-x auto- fill-mode 则把它关闭。我们把这叫做切换开关。


>> 输入M-x auto-fill-mode 。然后插入一些“asdf”直到看到这行被分为两行。你必须在中间放一些空格,只有到空格的时候才会换行。



通常边界宽度是70,但你能用带数字参数的C-x f 命令来改变它。


>> 键入带参数20的C-x。(C-u 20 C-x f) 然后输入一些文本看现在每行只有20个字符了。然后用C-x f把它改回70。



如果你在一个段落的中间产生了改变,自动填充模式将不会重新填充。要想重新填充段落,当光标在段落里的时候按M-q。


>> 把光标移到上一段按 M-q。

* 搜索(SEARCHING)
-----------------------------

Emacs 能朝前和朝后搜索字符串(指相邻的一些字符或单词)。搜索是一个移动光标的操作,它把光标移动到字符串出现的下一个地方。


Emacs 的搜索命令和其他大多数编辑器不同,它是“增量式(incremental)”的,这意味着搜索在你键入字符串时就开始了。


开始一个向前搜索的命令是C-s,C-r是往回搜索。但等等,先别忙。


当你输入C-s是你将注意到在回显区域会出现一个字符串“I-search”。这告诉你Emacs开始了一个增量搜索,并在等待你输入要搜索的东西。 结束查询。


>> 现在键入C-s开始一个搜索。慢慢的输入单词‘cousor',在输入每一个字母的时候停顿一 下,注意看光标发生了什么。
>> 再输入一次C-s,来搜索“cursor”出现的下一个地方。
>> 现在输入 四次看看光标移到了哪里。
>> 输入 结束搜索。


看到发生什么了吗?在Emacs的增量搜索里,你输入多少字符串它就试着搜索这些字符出现的地方。到字符串出现的下一个地方,只须再按一次C-s。要搜索的字符串不存在的话,Emacs 会发出蜂鸣并告诉你当前的搜索“失败(failing)”,按 C-g 也是终止搜索。


注意:在某些系统上,输入 C-s 会把屏幕冻结住使你从Emacs看不到更多的输出。这表示这个操作系统的“特性”叫做“控制流程”,它拦截了C-s不让它到达Emacs那里。要使屏幕解冻,输入C-q,然后看Emacs手册里的“Spontaneous Entry to Incremental Search”一节,按上面的建议来对付这种“特性”。
如果你在搜索的过程里按了,你将注意到要搜索的字符串的最后一个字符会被删除并且光标会回到上一个被搜索到的地方。比如,假设你键入了“c”,将会搜索“c”第一次出现的地方。然后如果你键入“u”,光标将移到“ cu”第一次出现的地方。现在键入 。这将从搜索的字符串里把“u”删掉,这时光标回到“c”第一次出现的地方。


如果你在搜索时按了Control或meta键加字符(少数几个少数命令例外,如C-s和C-r),搜索将被终止。


C-s向当前光标的后面搜索字符串出现的地方。如果你需要搜索前面文本里的东西,用C-r来代替。我们所介绍的C-s的每个特性C-r也支持,除了方向相反。


* 多窗口(MULTIPLE WINDOWS)
------------------------------------------------


Emacs有一个非常好的特性是能同时在屏幕上显示不止一个的窗口。


>> 把光标移到本行上按C-u 0 C-l。


>> 现在按C-x 2,它把屏幕分裂成两个窗口,每个窗口都显示本教程。光标在上面的窗口里。


>> 按C-M-v 滚动到下面的窗口里。(如果你没有一个真正的Meta键,那么按ESC C-v)

>> 按 C-x o (“o” 指 “其他(other)”) 把光标移到到下面的窗口里。
>> 用 C-v 和 M-v 滚动下面窗口里的文本。 在上面的窗口里看本教程。


>> 再次按 C-x o 使光标回到上面的窗口里。 现在光标象以前一样在上面的窗口里了。



你能一直用C-x o在窗口间切换。每个窗口都有它自己的光标位置,但仅有一个窗口能显示活动的光标。所有的编辑命令都发生在那个显示光标的窗口上。我们把这个窗口叫做“选中窗口( selected window)”。


当你在一个窗口里编辑文本,而用另一个窗口作参考时命令C-M-v非常有用。你总是能把光标留在所编辑的地方,而用C-M-v来翻阅另一窗口。


C-M-v 是 CONTROL-META 加字符的一个例子。 如果你有一个真正的META 键,你能同时按住 CTRL 和 META 再按“v”来输入C-M-v。CTRL 和 META 谁先按谁后按无所谓。


如果你没有一个真正的META 键, 你可以用 ESC 来代替。这时候次序是有关系的: 你必须让 ESC 跟在 CTRL-v后面; 否则 CTRL-ESC v 将不工作。 这是因为 ESC 是一个有意义的字符而不是一个修饰字符。


>> 输入 C-x 1 (在上面的窗口里) 以消除下面的窗口。



(如果你在下面的窗口里键入C-x 1,将会把上面的窗口去掉。可以把这个命令看作是“只保留你现在在的那个窗口。)


你不必一定要在两个窗口里显示同样的缓冲。如果你在一个窗口里键入C-x C-f查找文件,另一个窗口的内容不会改变。你能独立的在每个窗口里查找文件。


这是让两个窗口显示不同内容的另一种方法:


>> 在你输入的文件名后再输入C-x 4 C-f,然后用 结束。会看到指定的文件出现在下面 的窗口里。光标也在那里面。


>> 键入C-x o 回到上面的窗口,然后输入C-x 1删掉下面的窗口。



* 递归编辑层(RECURSIVE ED99vING LEVELS)
----------------------------------------------------------------

有时候你会进入“递归编辑层(recursive editing level)”。由模式行上的方括号指示。它在主模式名的括号外面。例如你也许会看到(Fundamental)变成了[(Fundamental)]。


要退出递归编辑层,按ESC ESC ESC。这是一个通用的退出命令,你也可以用它除去额外的窗口,或者退出微型缓冲。


>> 输入 M-x 进入一个微型缓冲; 然后用 ESC ESC ESC 离开。

你不能用C-g来退出递归编辑层。这是因为C-g只能取消在递归编辑层里面的命令。


* 获取更多的帮助(GETTING MORE HELP)
--------------------------------------------------------------

在本教程里我们试着为你开始使用Emacs提供了足够多的信息。但是有关Emacs的信息实在是太多以至于不能全部都在这里说明。但是,你还应该学习更多有关Emacs的东西,因为它另外还有很多有用的特性。Emacs提供了很多读取有关命令的文档的命令。这些“帮助”命令都以 Control-h开头,叫做“帮助字符”。


为了使用帮助特性,输入字符C-h,然后再输入一个字符来说明你需要哪种帮助。如果你真的不知道,输入C-h ? 然后 Emacs会告诉你它能给你什么样的帮助。如果你输入了C-h 又觉得不需要任何帮助,你可以用C-g来取消它。


(在有的地方,C-h的作用被改变了。如果按C-h在屏幕的底部没有出现有关帮助的信息的话,试试用F1和M-x help RET来代替。)


最基本的帮助特性是C-h c。输入C-h,然后是字符 c,然后输入一个命令字符和序列;然后 Emacs 会显示这个命令的简洁的描述。


>> 输入 C-h c Control-p.

显示的消息看起来会象这样:


C-p runs the command previous-line


这告诉你“功能的名字”。功能的名字主要用于对Emacs的功能扩充和定制。但因为功能的名字指出了命令的用途,所以最好不要改动它。


C-h c后面可跟多字符命令,比如 C-x C-s 和 (如果你没有 META 或者 ED99v 或者 ALT 键) v 。


要获取有关命令的更多信息,用C-h k 代替 C-h c。


>> 输入 C-h k Control-p.



这将在一个Emacs窗口里显示命令的文档。当你读完后可以用C-x 1除去帮助文本。如果不想马上离开,你可以一边编辑一边参考帮助文本,然后再按C-x 1。


这是一些有用的 C-h 选项:


C-h f 描述一个功能,在你输入了这个功能的名字后。

>> 输入 C-h f previous-line 。 将打印出C-p命令所实现的所有功能。



C-h a 命令查找。输入一个关键字,Emacs将列出所有名字里有这个关键字的命令。 包括所有以Meta-x开始的命令。对有些命令,C-h a 也将列出实现同一功能的 几个命令序列。


>> 输入 C-h a file .




这将在窗口里显示所有名字里有单词“file”的M-x命令。


>> 输入 C-M-v 来滚动帮助窗口,做上几次。


>> 输入 C-x 1 来删除帮助窗口。





* 总结(CONCLUSION)
--------------------------------

记住,永远都用C-x C-c来退出Emacs。用C-z来退到一个临时的外壳里,以使你过后还能回到 Emacs。
本教程尽量让所有的初学者都能理解,如果你发现有些东西不清楚的话,别责备你自己-抱怨吧!


(拷贝与版权)COPYING
---------------------------------

This tutorial descends from a long line of Emacs tutorials starting with the one written by Stuart Cracraft for the original Emacs.


This version of the tutorial, like GNU Emacs, is copyrighted, and comes with permission to distribute copies on certain conditions:

Copyright (c) 1985, 1996 Free Software Foundation


Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
copyright notice and permission notice are preserved,
and that the distributor grants the recipient permission
for further redistribution as permitted by this notice.


Permission is granted to distribute modified versions
of this document, or of portions of it,
under the above conditions, provided also that they
carry prominent notices stating who last altered them.



The conditions for copying Emacs itself are more complex, but in the same spirit. Please read the file COPYING and then do give copies of GNU Emacs to your friends. Help stamp out software obstructionism ("ownership") by using, writing, and sharing free software!

http://blog.csdn.net/chiefsailor/archive/2007/03/22/1538049.aspx

贴自己的.emacs文件 zz

http://hi.baidu.com/chinsung/blog/item/e50bd8545c9b205bd0090665.html


http://hi.baidu.com/chinsung/blog/item/5f33b5518ae5341b377abe4d.html

http://hi.baidu.com/super_c_mew/blog/item/a52be7c94e29bc1f7e3e6ffe.html

Add or eidt file: ".emacs"

(1)After install Emacs, you should create a ".emacs" file yourself, and save it in the path "home/user../"

(2)Install "speedbar" into Emacs

1. download speedbar package from http://packages.ubuntu.com/hardy/speedbar
2. save it in the path opt/speedbar/
3. sudo tar -xzf speedbar-0.14beta4.tar.gz
4. sudo make
Add following code in the file of ".emacs":
;;常用设置
;;(setq default-major-mode 'text-mode);一打开就起用 text 模式。
(global-font-lock-mode t);语法高亮
(auto-image-file-mode t);打开图片显示功能;;
(fset 'yes-or-no-p 'y-or-n-p);以 y/n代表 yes/no,可能你觉得不需要,呵呵。
(column-number-mode t);显示列号
(show-paren-mode t);显示括号匹配
(display-time-mode 1);显示时间,格式如下
(setq display-time-24hr-format t)
(setq display-time-day-and-date t);;
(tool-bar-mode nil);去掉那个大大的工具栏;;
(scroll-bar-mode nil);去掉滚动条,因为可以使用鼠标滚轮了 ^_^
(mouse-avoidance-mode 'animate);光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。很好玩阿,这个功能
(setq mouse-yank-at-point t);支持中键粘贴
(transient-mark-mode t);这个忘了,郁闷!
(setq x-select-enable-clipboard t);支持emacs和外部程序的粘贴
(setq frame-title-format "xxx@%b");在标题栏提示你目前在什么位置。你要把xxx改成自己的用户名;;
(setq default-fill-column 80);默认显示 80列就换行

;;color Themes
(load-file "/home/xxx/myemacs/color-theme.el")
(color-theme-deep-blue);选择 deepblue的配色方案

;;speed Themes
~$ cat .emacs
(add-to-list 'load-path "/opt/speedbar/speedbar-0.14beta4")
(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
(define-key-after (lookup-key global-map [menu-bar tools]) [speedbar] '("Speedbar" . speedbar-frame-mode) [calendar])
;; Texinfo fancy chapter tags
(add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
;; HTML fancy chapter tags
(add-hook 'html-mode-hook (lambda () (require 'sb-html)))
;; For any verison of emacs on a linux RPM based system:
;; (autoload 'rpm "sb-rpm" "Rpm package listing in speedbar.")
;; For any version of emacs where w3 is installed:
;; w3 link listings (autoload 'w3-speedbar-buttons "sb-w3" "s3 specific speedbar button generator.")

Monday, May 18, 2009

ubuntu8.10安装配置emacs22

1. 准备工作
(1)安装CVS、SSH
sudo apt-get install ssh cvs

(2)安装texinfo(为了编译man包)
sudo apt-get install texinfo

(3)安装编译所需的支持包
sudo apt-get install libgtk2.0-dev xlibs-dev (GNOME界面相关)
sudo apt-get install xserver-xorg-dev
sudo apt-get install build-essential
sudo apt-get install libncurses5 libncurses5-dev
sudo apt-get build-dep emacs21 (编译emacs21所需)

2.安装
sudo apt-get install emacs

Thursday, May 14, 2009

intel Fortran 编译器 10.1 Linux*版入门 4

英特尔 ® Fortran 编译器 10.1 Linux* 版入门指南、安装指南和发行说明[4]
原始文档下载地址
http://www.intel.com/cd/software/products/apac/zho/358463.htm

系统要求
处理器术语
英特尔® 编译器支持三种平台:处理器与操作系统类型的常规组合。这部分介绍英特尔在其文档、安装过程以及技术支持网站中用于描述平台的术语。

IA-32
IA-32 体系结构指基于以下处理器且运行 32 位操作系统 ("Linux x86") 的系统:通常与英特尔奔腾® II 处理器兼容的 32 位处理器(例如,英特尔® 奔腾® 4 处理器或英特尔® 至强® 处理器),或是其它厂商生产的支持相同指令集的处理器。

Intel® 64
Intel® 64 体系结构指基于带 64 位体系结构扩展的 IA-32 体系结构处理器(例如,英特尔® 酷睿™2 处理器系列)且运行 64 位操作系统 ("Linux x86_64") 的系统。如果系统运行 32 位版的 Linux 操作系统,则适用 IA-32 体系结构。针对 Intel® 64 体系结构应用程序的英特尔编译器还支持以下系统:基于 AMD* Athlon64* 与 Opteron* 处理器,并且运行 64 位操作系统的系统。
IA-64
指基于英特尔® 安腾® 2 处理器且运行 64 位操作系统的系统。

本机与跨平台开发
术语“本机”是指构建一个应用程序,它将在构建时使用的相同平台上运行;例如,在 IA-32 体系结构上构建要在 IA-32 体系结构上运行的应用程序。术语“跨平台”或“交叉编译”是指构建一个应用程序,它运行时使用的平台与构建时使用的平台属于不同的类型;例如,在 IA-32 体系结构上构建要在 IA-64 体系结构上运行的应用程序。并非所有的跨平台开发组合都受支持,有些组合可能需要安装可选的工具与函数库。
下表介绍支持的编译主机(构建应用程序的系统)与应用程序目标(运行应用程序的系统)组合。
IA-32 体系结构主机
支持的目标:IA-32
Intel® 64 体系结构主机
支持的目标:IA-32 与 Intel® 64
IA-64 体系结构主机
支持的目标:IA-64
备注:开发与主机不同的目标时,可能需要从 Linux 发行包中安装可选的函数库组件。
备注:“英特尔® 集群 OpenMP*”是单独授予许可证的功能,与编译器的系统要求也不相同。如需有关详细信息,请参阅“英特尔集群 OpenMP”文档。

开发 IA-32 体系结构应用程序的要求
  • 基于 IA-32 体系结构处理器(最低 450 MHz 主频的英特尔奔腾® II 处理器,或更高级的处理器 - 建议配备英特尔® 酷睿™2 处理器系列或英特尔® 奔腾® 4 处理器)、Intel® 64 体系结构处理器的系统,或是基于 AMD* Athlon* 或 AMD Opteron* 处理器的系统
  • 512 MB 内存(建议配备 1GB)。
  • 100 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


针对 Intel® 64 体系结构系统或针对 AMD* Opteron* 处理器开发应用程序时的要求

  • 基于 IA-32 或 Intel® 64 体系结构处理器(建议配备英特尔® 酷睿™2 处理器系列或英特尔® 至强® 处理器),或是基于 AMD Opteron 处理器的系统
  • 512 MB 内存(建议配备 1GB)
  • 300 MB 的空闲硬盘空间,另外还需要 300 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 100 MB 硬盘空间,用于虚拟内存页面文件。确保使用的虚拟内存量至少达到针对安装的 Linux 操作系统版本所建议的最小值
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SGI ProPack* 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


开发 IA-64 体系结构应用程序的要求

  • 基于英特尔® 安腾® 2 处理器的系统。
  • 512 MB 内存(建议配备 1 GB)。
  • 150 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


关于 gcc 版本的说明
英特尔编译器使用许多不同的 Linux 操作系统版本(具有不同版本的 gcc)进行过测试。某些 Linux 版本可能包含与已经测试过的版本不同的头文件,这可能会导致问题。您使用的 glibc 版本必须同使用的 gcc 的版本保持一致。
备注:

  • 使用 -O3、-ipo 及 -openmp 等高级优化选项编译非常庞大的源文件(几千行)时,所需的内存量可能会明显大很多。
  • 上面的处理器型号名称列表并非毫无遗漏 - 与上面列出的那些处理器支持相同指令集的其它处理器型号应该也可以正常使用。如果有关于特定处理器型号的问题,请与“英特尔® 首要支持”联系。
  • 有些优化选项在运行应用程序的处理器类型方面存在限制。如需有关详细信息,请参阅这些选项的文档。


安装
如需有关安装编译器与设置编译器环境的详细信息,请参阅单独的安装指南。在本文的其它部分,使用 表示的默认安装目录是:
/opt/intel/fc/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/fce/10.1.xxx(针对 Intel® 64)
/opt/intel/idb/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/idbe/10.1.xxx(针对 Intel® 64)


已知问题
OpenMP 应用程序的二进制文件不兼容
在安装“英特尔编译器 10.1 版”之后,使用“英特尔编译器 9.0 版”并指定 -openmp 开关编译的程序可能无法运行。对于这类程序,加载器可能会在运行时退出,并出现以字符串 _intel 开头的有关未定义符号的错误消息(例如,_intel_fast_memset)。如果发生这种情况,请使用“英特尔编译器 10.1 版”重新编译可执行文件,之后加载器错误消息应该会消失。


RPM 4.0.2 与 RPM 4.1 的安装警告
RPM 4.0.2 无法安装到非默认目录。这个问题在 RPM 4.0.3 中已经解决。RPM 4.1 无法安装到非默认目录。这个问题在 RPM 4.11 到 4.2 中已经解决。


静态链接 libpthreads 时的段冲突
在某些版本的 Linux 上,对于使用静态链接的 libpthreads.a 构建的应用程序(使用 -static 时,默认使用 libpthreads.a), 在使用大于 2GB 的堆栈空间时,可能会因为段冲突而失败。这是 Linuxthreads 的一个已知问题。如果遇到此问题,请动态链接 libpthreads。作为变通方法,在 Red Hat Linux 9 与 Red Hat Enterprise Linux 3.0 上,您可以安装 nptl-devel 软件包,并在 ifort 命令行上传递 "-I/usr/include/nptl -L/usr/lib/nptl"。这将创建一个静态链接的二进制文件,它将仅在 nptl 下运行,但没有堆栈大小的限制。


OpenMP 限制

  • 在某些版本的 Linux POSIX 线程库中,堆栈大小限制以硬编码方式写在程序中,因此在某些版本的 Linux 上,需要很大堆栈空间的 POSIX* 多线程程序可能无法正确运行。英特尔编译器使用 POSIX 线程库来实现基于 OpenMP 的自动生成的并行化,因此这些限制也适用于 OpenMP 程序 (-openmp) 以及使用英特尔编译器自动生成的并行程序 (-parallel)。超出堆栈空间限制的多线程程序通常会遇到段冲突或寻址错误。
    要避免这些限制,请使用在构建时定义了 FLOATING_STACKS 参数的 glibc 版本。对于某些发行版,这意味着使用共享的 pthread 库而不是静态版的 pthread 库。然后,使用 ulimit -s 或 limit stacksize 命令将最大 shell 堆栈大小设置为明显非常大的值(以 KB 为单位,但不是 unlimited),并将 KMP_STACKSIZE 环境变量设置为所需的线程堆栈大小(以字节为单位)。请注意,在 bash shell 中,只能使用一次 ulimit -s 来设置很大的最大堆栈大小。在 C shell (csh) 中,可以使用 limit stacksize(参数之前没有短划线)重复设置最大堆栈大小。
  • 请注意,在特定版本的 Linux(Red Hat Enterprise Linux 4 及更早的版本是已知的示例)上,默认安装的 /usr/lib/libpthread.a 与 /usr/lib/libc.a 不完全支持 Linux 线程本地存储器(Thread Local Storage,简称 TLS)。使用 Linux TLS 机制并使用 -static 进行链接时,如果尝试访问线程本地存储器,则包含 -openmp 或调用 libpthread 便可能触发运行时故障。为纠正此问题,请安装 nptl-devel.rpm 软件包(包含在 Linux 安装光盘上)并使用 -L/usr/lib/nptl 进行编译。
  • 如果公用块声明为带 OpenMP 指示的 THREADPRIVATE,则公用块在声明它的所有源文件中都必须有相同的长度。


IA-64 Linux 系统上的 gprel relocation(gprel 重新定位)错误消息
在运行 Linux 的 IA-64 系统上,使用 -shared 开关创建“动态共享目标”(.so) 时,在 ld 阶段可能会生成一些 "relocation against dynamic symbol"(动态符号重新定位)消息,类似于:
/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__segv_default_msg/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__l_fpe_mask/usr/bin/ld: for_init.o: @gprel relocation against dynamic symbol for__l_undcnt

...
要纠正此问题,请将 -i_dynamic 与 -nofor_main 开关添加到命令行。对于 9.0 版,指定 -shared 时,将自动设置 -i_dynamic 与 -nofor_main。


不再支持 -ipo_obj 选项。
强制生成直接目标代码的 -ipo_obj 选项不再受支持。如果指定该选项,则会发出一个警告,并且其效果与指定 -ip 时的一样。
在 IA-64 体系结构系统上,-relax 不再传递给链接器
对于 9.0 版,编译器驱动程序不再将 -relax 开关传递给 IA-64 体系结构系统上的链接器,原因在于这与 -r 选项冲突。使用 binutils 2.11.90.0.27 或更高版本(建议使用 2.14)时,由于 -relax 是默认选项,因此不需要指定它。如果必须使用较早版本的 binutils 并希望指定 -relax 选项,请在调用链接器的编译命令中使用 -Xlinker -relax。


SLES 10 上关于 libunwind.so.7 的 ld 警告
在 SUSE LINUX Enterprise Server 10 上使用英特尔编译器构建应用程序时,可能会看到类似以下的警告:
ld: warning: libunwind.so.7, needed by /usr/lib/gcc/ia64-suse-linux/4.1.0/../../..//libgcc_s.so, may conflict with libunwind.so.6
变通办法是将以下命令行添加到 ifort.cfg:
-L /usr/lib
此问题会在将来发行的英特尔编译器中得到解决。


使用 CPU 自动调度 (-ax*) 时的调试信息有限
使用 -ax{WNBP} 进行编译时,会为每个函数生成两份代码。一份是针对通用代码,另一份是特定于 CPU 的代码。每个函数的符号随后引用“CPU 自动调度”例程,在运行时确定要执行生成的哪一个代码部分。使用名称在这些函数上设置的调试器断点会导致应用程序在调度例程中停止。这可能会导致在调试时出现意外的行为。此问题可能会在将来版本的“英特尔调试器”与“英特尔编译器”中得到解决。


对于构建时未使用 -fp 的 IA-32 体系结构的程序,无法进行调试或无法查看其跟踪信息
使用 -fp 编译时,指定将 IA-32 体系结构 EBP 寄存器用作帧指针,而不是用作通用寄存器。调试器与跟踪处理器可能无法正确展开特定的堆栈(包含对编译时未使用 -fp 的函数的调用)。如果使用 -g 或 -O0 进行编译,-fp 是隐含启用的;但明确指定更高的优化级别(如 -O2)时,则不会启用它。如果希望在应用程序上使用调试器或跟踪器,并且要使用的优化级别高于 -O0,则还应该指定 -fp,以确保调试器与跟踪处理器可以使用帧指针。

汇编器可能无法识别生成的代码
旧版 GNU 汇编器可能无法处理编译时使用了 -[a]xP、T 或 S 选项而生成的汇编代码。如果对于您而言这是个问题,请使用 binutils 2.17.50.0.15 或更高版本。

用带扩展调试信息的 idb
如果使用 inline_debug_info、semantic_stepping、variable_locations 或 extended 等 -debug 关键字,则应该使用“英特尔调试器”(idb);原因在于其它调试器可能不理解这些扩展信息,并因此出现无法预测的行为。我们正在与其它调试器的开发人员合作,以期获得他们对扩展调试信息的支持。


不支持 -auto_ilp32 选项
-auto_ilp32 选项不受支持,该选项指定应用程序不得超出 32 位地址空间(这在文档中有提及)。


启用运行时检查时,可能也会启用编译时检查
在某些情况中,使用 -check 或 -C 选项启用运行时检查时,如果当时可以诊断所请求的条件,则可能会导致编译器在编译时发出针对该条件的诊断信息。例如,如果指定 -check bounds 或 -CB,则常数下标的数组越界可能会导致编译时错误。


技术支持
如果未在安装过程中注册编译器,请访问英特尔® 软件开发产品注册中心进行注册。注册之后,在技术支持服务期间,您可以获取免费技术支持、产品更新以及升级。
如需有关如何找到“技术支持”、“产品更新”、“用户论坛”、常见问题、提示与技巧的信息,以及其它技术支持信息,请访问:http://www.intel.com/software/products/support/flin
备注:如果分销商提供本产品的技术支持,请与他们而不是英特尔联系技术支持事宜。


提交问题
提交问题的步骤:

  • 转到 http://www.intel.com/software/products/support,然后单击“英特尔® 首要支持”的链接。
  • 登录该网站。请注意,用户名与密码区分大小写。
  • 单击“产品”下拉列表旁边的“执行”按钮。
  • 单击左侧导航栏中的“提交问题”链接。
  • 从“产品类型”下拉列表中,选择“开发环境(工具、SDV、EAP)”。
  • 如果是与软件或许可证相关的问题,请从“产品名称”下拉列表中选择“英特尔(R) Fortran 编译器 Linux* 版”。
  • 输入问题,填写随后出现的各个窗口中的所有字段,以便成功提交问题。
    备注:在提交源代码(对源代码的访问需要限制为特定的国家或地区)之前,请通知技术支持代表,以确定是否允许受理这项请求。


问题报告或产品建议的指导原则:

  • 描述困难或建议。对于问题报告,请尽可能具体一些,以便我们能够重现问题。对于编译器问题报告,如果可能,请包含编译器选项与较小的测试用例。
  • 描述系统配置信息。使用以下命令获取 glibc 与内核的版本:

> uname -a

> rpm -qa grep glibc

如果未安装 rpm,请使用以下命令:

> ls /lib/libc*

并将信息复制到相应的“英特尔® 首要支持”字段。
使用以下命令获取“英特尔 Fortran 编译器”的“软件包标识”:

ifort -V

然后从输出内容中,将“软件包标识”(如 l_fc_x_10.1.xxx)复制到相应的“英特尔® 首要支持”字段中。请包含可能有助于我们重现并解决您的问题的任何其它特定信息。

  • 如果无法安装编译器或获取“软件包标识”,请输入所下载的文件名作为软件包标识。


已解决的问题
如需了解最新版的编译器中已经解决的问题,请查阅 <软件包标识>_README(例如 l_fc_x_10.1.xxx_README),它可以从英特尔® 软件开发产品注册中心的“产品下载”部分下载。
编译器源代码减错器 (CESR)
“ 编译器源代码减错器”(CESR) 包含一套非常有用的实用程序,它们可以单独使用,也可以组合在一起使用,能够对由 C/C++ 或 Fortran 源代码组成的测试用例进行多种处理,包括收集、缩减、精确定位、保护、文档编制及打包等。如果希望从庞大的应用程序中提取较小的测试用例提交给“英特尔® 首要支持”,它会很有帮助作用。CESR 可以从英特尔® 软件开发产品注册中心的“产品下载”部分进行下载。选择您的产品,然后在“版本”下拉列表中选择 CESR。CESR 是实验性产品,我们不为它提供技术支持,但仍然非常欢迎您通过“英特尔® 首要支持”向我们提供有关该产品的反馈。CESR 要求先安装 Python* 2.2 或更新版本。


文档
您可以使用 Web 浏览器来查看英特尔编译器以及相关的基于 HTML 的文档。您应该使用支持 JavaScript 的 Web 浏览器(如 Firefox*),这样它便可以为联机帮助文件提供全面的浏览、搜索、索引查询,以及超链接功能。
文档安装在 /doc 目录中。HTML 索引文档可以在 /doc/Doc_Index.htm 中找到。英特尔® 调试器手册 在“英特尔® 调试器”的 doc 目录中以 HTML 的形式提供。
查看手册页
ifort(1) 手册页提供 ifort 编译器命令的命令行选项列表及相关信息。要显示 ifort(1) 手册页,在使用 source 命令执行 < 文件以设置环境之后,输入以下命令:
$ man ifort
man 命令提供一些单键或组合键,让您滚动查看显示的内容、搜索字符串、跳转到某个位置,以及执行其它功能。例如,输入 z 查看下一个屏幕;或输入 w 查看上一个屏幕。要获得有关 man 命令的帮助,请输入 h 键;查看完帮助时,输入 q 键以返回到所显示的手册页中。要进行搜索,请输入 / 字符,后接搜索字符串 (/string),然后按 Enter 键。查看 man 命令文本之后,输入 q 以返回到 shell 命令提示符中。


查看文档
在受支持的 Linux* 发行版所附带的 Web 浏览器上,HTML 文档格式经测试可以正常工作。PDF 版的编译器文档可以在以下位置找到:http://developer.intel.com/software/products/compilers/flin/docs/manuals.htm


附加信息
相关产品与服务

有关英特尔软件开发产品的信息可以在 http://www.intel.com/software/products 上找到。
其中一些相关产品包括:
Intel® Software College 为开发人员提供一流的软件开发技术培训。培训包括在线课程与讲师指导的课程,内容涵盖所有的英特尔架构、平台、工具及技术。
英特尔® VTune™ 性能分析器可以评估应用程序的 CPU 使用情况,并帮助确定是否可以通过进行一些修改来改善应用程序的性能。
英特尔® C++ 与 Fortran 编译器是让软件运行如飞,并全面支持最新英特尔处理器的重要组成部分。
英特尔® 性能程序库提供一套针对各种英特尔处理器进行过优化的例程。英特尔® Math Kernel Library 为科学与工程软件的开发人员提供一整套线性代数、快速傅立叶变换以及矢量数学函数,它们均针对最新的英特尔处理器进行过优化。英特尔® 集成性能基元包含多个跨平台的工具,可针对多种英特尔架构与多个操作系统构建高性能的软件。


免责声明与法律信息
本文所含信息专门针对英特尔(R) 产品提供。本文并未授予任何知识产权的许可证,无论是明确、暗示、禁止翻供还是其它任何形式。除这些产品的“英特尔销售条款”之规定外,英特尔概不承担任何其它义务,对于英特尔产品的销售与/或使用(包括适合特定用途、适销性或不侵犯任何专利权、版权或其它知识产权),英特尔不作任何明确或暗示的担保,也不承担任何赔偿责任。未经英特尔公司书面同意,不应将英特尔产品用于任何在发生故障时可能会造成人身伤亡的用途,英特尔产品并未针对这些用途而设计,也不旨在用于这些用途。
英特尔随时可能更改技术规格与产品说明,如确有更改,恕不另行通知。标有“保留”或“未定义”字样的任何功能或指令,其存在性与特性均不确定,设计人员切勿对此有所依赖。英特尔保留这些供将来定义之用,对于因将来对它们的更改而导致的任何冲突或不兼容现象,英特尔概不承担任何责任。本文所含信息可随时更改而不另行通知。不应依赖这些信息进行最终设计决策。
本文所述产品可能包含一些设计缺陷或错误(统称错误),导致产品与发布的规格不符。目前已确定的错误可应客户要求提供。
在订购产品之前,请与当地的英特尔销售办事处或分销商联系,以获取最新规格。
对于本文中引用的并且包含订单号的文档,或是其它的英特尔文档,均可通过拨打 1-800-548-4725 或访问英特尔网站来获取。
赛扬、迅驰、英特尔、英特尔徽标、Intel386、Intel486、英特尔酷睿、安腾、MMX、奔腾、VTune 以及至强是英特尔公司在美国以及其它国家或地区的商标。
* 其它品名与品牌可能是属于其它公司的资产。
(C) 2007 英特尔公司版权所有。保留所有权利。

(http://blog.sina.com.cn/s/blog_51ffcfc301009utw.html~type=v5_one&label=rela_nextarticle)

intel Fortran 编译器 10.1 Linux*版入门 3

英特尔 ® Fortran 编译器 10.1 Linux* 版入门指南、安装指南和发行说明[3]
原始文档下载地址
http://www.intel.com/cd/software/products/apac/zho/358463.htm

英特尔® Fortran 编译器 10.1 Linux* 版发行说明
目录
概述
新增功能
系统要求
安装
已知问题
技术支持
文档
附加信息
免责声明与法律信息
概述
本 产品为 Linux* 软件开发人员提供各种工具,用于创建性能出众的 Fortran 应用程序。“英特尔® Fortran 编译器”是完整的 Fortran 95 语言编译器,它包含 Fortran 2003 标准中的许多功能,此外还有广泛的主流语言扩展。英特尔编译器通过对并行化与 OpenMP* 的支持,来支持多线程代码的开发。
产品内容
本产品有两个版本。
标准版包含以下组件:
  • 针对 IA-32 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 IA-64 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 Intel® 64 体系结构应用程序的“英特尔® Fortran 编译器”
  • 针对 IA-64 体系结构应用程序的“英特尔® 汇编器”
  • 英特尔® 调试器(请参阅单独的“发行说明”)
  • 实用程序
    英特尔® 编译器代码覆盖工具
    英特尔® 编译器测试优先级调整工具
  • 光盘文档
    为方便访问所有的文档,提供了一个文档索引。它位于 /doc/Doc_Index.htm

专业版包含“标准版”的所有内容,外加“英特尔® Math Kernel Library”,这个函数库包含许多经过高度优化且充分线程化的数学函数,适用于对性能要求极高的工程、科学以及金融等领域的应用。
备注:“英特尔® Fortran 编译器”的安装路径是 /opt/intel/fc/10.1.xxx,其中 xxx 代表 3 位数字的更新号。本文通篇使用 一词指代默认的安装路径。
“英特尔® Math Kernel Library”的安装独立于编译器。如需有关详细信息,请参阅“英特尔® Math Kernel Library 安装指南”。
要获取本产品中提供的各种工具的技术支持与产品更新,需要进行注册。如需了解如何注册,请参阅下面的技术支持部分。


兼容性
对 于使用 8.0 版之前的编译器(包括会创建 .mod 文件的那些编译器)编译的所有 Fortran 源代码,都必须重新编译。使用 8.0 之前的版本构建的第三方函数库也需要重新构建 - 如果使用的第三方函数库不支持“英特尔 Fortran”,请通过“英特尔® 首要支持”https://premier.intel.com 告诉我们是哪些。使用“英特尔 Fortran 8.0”或之后的版本构建的 Fortran 源代码无需使用 10.1 版重新编译。
另请参阅下文的“Fortran-C/C++ 混合语言应用程序的链接方面的变动”部分。


10.0 与 10.1 版的新增功能
以下部分讨论“英特尔 Fortran 编译器”自 10.0 版以来所引入的新功能与更改。对于“英特尔调试器”,请参阅单独的发行说明。
新增与更改过的命令行选项
下面列出自 9.1 版初次发行以来新增或更改过的命令行选项。如需有关这些选项的详细信息,请参阅编译器文档。
-assume [no]old_boz
控制二、八、十六进制的常数在作为 INT、REAL、DBLE 及 CMPLX 等内部函数的参数时如何进行处理。请参阅下面关于 Fortran 2003 行为的说明。(默认值:-assume noold_boz)
-assume [no]old_unit_star
控制与设备* 之间如何进行输入、输出,以及如何处理 ACCEPT、PRINT 以及 TYPE。请参阅下面关于 Fortran 2003 行为的说明。(默认值:-assume old_unit_star)
-assume protect_parens
确定优化器在对 REAL 与 COMPLEX 表达式进行求值时,是否会不重新组合各个运算来优先处理括号。(默认值:off)
-assume [no]realloc_lhs
确定赋值语句左侧的可分配对象是按照 Fortran 95/90 规则还是 Fortran 2003 规则进行处理。请参阅下面关于 Fortran 2003 行为的说明。(默认值:off)
-assume [no]std_mod_proc_name
确定是否允许模块过程的名称与用户外部符号名称冲突。请参阅下文备注。(默认值:off)
-axS
指定编译器生成“SSE4 矢量化编译器与媒体加速器”指令(针对将来支持这些指令的英特尔处理器)以及普通的 IA-32 体系结构代码。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-check [no]pointer
启用或禁用以下运行时检查:是否通过空指针进行访问,或是否访问未分配的 ALLOCATABLE 变量。(默认值:off)
-cxxlib-nostd
防止编译器链接标准的 C++ 库(默认值:off)
-diag-
控制诊断信息的显示(默认值:off)
-diag-dump
告诉编译器打印所有已经启用的诊断消息并停止编译(默认值:off)
-diag-enable sv[123]
启用“静态验证器”。(默认值:off)
-diag-enable sv-include
指定“静态验证器”也应考虑 include 文件。
-diag-file[=file]
将诊断分析的结果输出到一个文件。(默认值:off)
-diag-file-append[=file]
将诊断分析的结果附加到一个文件。(默认值:off)
-[no-]diag-id-numbers
告诉编译器通过使用诊断消息的标识号值来显示诊断消息(默认值:on)
-f[no-]align-functions[=n]
告诉编译器以最优字节边界对齐函数。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-fast
启用一组用于改善性能的选项。在此发行版中,这些选项已经改变。请参阅下文备注。
-f[no-]instrument-functions
确定是否在函数入口与出口点插入指令(默认值:off)
-f[no]-keep-static-consts
告诉编译器保留给源代码中未引用的变量分配的空间(默认值:off)
-fp-speculation=
告诉编译器推测浮点运算时的模式(默认值:fast)
-[no-]func-groups
如果启用评测信息,则启用或禁用函数组合功能(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-gdwarf-2
启用使用 DWARF2 格式生成调试信息的功能(默认值:off)
-heap-arrays[-]
指定应该在堆而不是堆栈上分配自动数组,以及为了临时计算而创建的数组。
-help [category]
显示所有可用的编译器选项或某一类编译器选项(默认值:off)
-ipo-jobs
指定要在“过程间优化”(IPO) 的链接阶段同时执行的命令(作业)数
-march=
告诉编译器生成针对指定的 CPU 的代码(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-msse[n]
告诉编译器生成针对特定英特尔® 处理器的代码(仅限 IA-32 与 Intel® 64 体系结构,默认值:IA-32 为 off,Intel® 64 体系结构为 -msse2)
-mtune=core2
告诉编译器选择为英特尔® 酷睿™2 处理器系列带来好处的优化(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-openmp-lib type
可供指定用于链接的 OpenMP* 运行时库。. (默认值:legacy)
-[no-]opt-multi-version-aggressive
告诉编译器主动使用多版本功能来检查指针别名与标量替换。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-opt-ra-region-strategy [=keyword]
选择寄存器分配器用于将每个例程划分成区域的方法。(仅限 IA-32 与 Intel® 64 体系结构,默认值:default)
-opt-streaming-stores keyword
启用生成数据流存储以进行优化的功能。(仅限 IA-32 与 Intel® 64 体系结构,默认值:auto)
-[no-]par-runtime-control
生成代码以便对具有符号循环边界的循环执行运行时检查。(默认值:off)
-par-schedule-[=n]
指定 DO 循环迭代的调度算法
-[no-]prefetch
启用或禁用预取插入优化。在 IA-32 体系结构上使用时需要指定 -xT。(仅限 IA-32 与 IA-64 体系结构,默认值:off)
-save-temps[-]
告诉编译器保存编译期间创建的中间文件(默认值:off)
-shared-intel
使英特尔提供的库可以动态链接(默认值:除 libguide 之外,所有的库都静态链接)
-shared-libgcc
动态链接 GNU libgcc 库。(默认值:off)
-static-intel
使英特尔提供的库可以静态链接(默认值:除 libguide 之外,所有的库都静态链接)
-static-libgcc
静态链接 GNU libgcc 库。(默认值:off)
-std 或 -stand
与 -std03 或 -stand f03 相同。请注意,这与之前的版本相比有所变化。(默认值:off)
-std03 或 -stand f03
告诉编译器针对不符合 Fortran 2003 标准的源代码语法发出警告。(默认值:off)
-tcheck []
指出要对 OpenMP 多线程应用程序执行的分析方法(默认值:off)
-tcollect
插入调用“英特尔® 踪迹收集器”API 的指令探针(默认值:off)
-[no-]unroll-aggressive
告诉编译器对包含小常数遍历计数的循环主动使用完整的展开。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-[no-]vec-guard-write
告诉编译器在矢量化循环中执行条件检查。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-xO
指 定编译器要生成 SSE3、SSE2 以及 SSE 指令,并且要针对含 SSE3 的英特尔® 奔腾® 4 处理器与英特尔® 至强® 处理器进行优化。生成的代码应该能够在并非英特尔制造但支持 SSE3、SSE2 以及 SSE 指令集的处理器上运行,如某些 AMD* 处理器。此值不启用在 S、T、P 等处理器值中启用的某些优化选项。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)
-xS
指 定编译器生成“SSE4 矢量化编译器与多媒体加速器”指令(针对将来支持这些指令的英特尔处理器)。此选项还允许编译器生成 SSSE3、SSE3、SSE2 以及 SSE 指令,并且它可以针对将来的英特尔处理器进行优化。(仅限 IA-32 与 Intel® 64 体系结构,默认值:off)


不再建议使用的和已经删除的命令行选项
如需有关不再建议使用(仍然起作用,但将在未来的版本中删除)或已经删除(不再支持)的命令行选项的详细信息,请参阅光盘文档中的 Compiler Options > Deprecated and Removed Compiler Options(编译器选项 > 不再建议使用的和已经删除的编译器选项)部分。
-fast 的含义已更改
-fast 选项是一种简便方式,用于指定通常可改善运行时性能的一组选项。如文档所述,随着时间的推移,这组选项可能会发生变化。在 10.0 版中,-fast 设置 -xT;而在较早的版本中,它设置 -xP。如果此变化对您而言不合适,则您必须单独指定所需的选项,而不是使用 -fast。如需有关详细信息,请参阅光盘文档上的 Compiler Options(编译器选项)部分。


-stand 的含义已更改
在 10.0 版中,指定 -stand 选项而后面不跟关键字时,其含义已经变为 -stand f03,即检查是否符合 Fortran 2003。通过指定 -stand f90 或 -stand f95,您可以选择检查是否符合 Fortran 90 或 Fortran 95。-std 是 -stand 的替代性拼写法。请注意,Intel® Fortran Language Reference(英特尔® Fortran 语言参考)仍然将 Fortran 2003 功能作为对 Fortran 95 的扩展来突出介绍。


在 Intel® 64 体系结构系统上,默认情况下 -xW 是启用的
在 Intel® 64 体系结构的系统上,默认情况下 -xW 是启用的;这相当于启用矢量化,您可能会看到显示的矢量化报告消息,这是使用以前的发行版所无法看到的。要禁用矢量化报告消息,请使用 -diag-disable vec。您仍然可以指定替代性选项,如 -xP 或 -axT。


替代性命令行选项
许多命令行选项都有老式的拼写,选项名称中的单词之间使用下划线 ("_") 而不是连字符 ("-") 来连接。老式拼写仍然是有效的替代性选项名称。


支持 gcc* OpenMP* 库
对于 10.1 版,您可以通过指定 -openmp-lib compat 来指定使用与 gcc 兼容的 OpenMP 库。如果您的应用程序包含某些使用 gcc 或 g++ 所构建的源模块,并且使用了 OpenMP,这可能正是所需要的。默认值是 -openmp-lib legacy,它使用英特尔提供的 OpenMP 库。


Fortran 2003 行为
Fortran 2003 定义作为对以前标准的扩展,或是较早的标准中未指定的语言功能的行为。尽管“英特尔 Fortran 编译器 10.1 版”尚不支持 Fortran 2003 的全部功能;但在某些情况中,此编译器现在选择的是 Fortran 2003 的行为,而较早的编译器版本选择的则是不同的行为。在其它某些情况中,此编译器的默认行为尚没有发生变化。这些情况如下文所述。


对可分配对象的赋值
在 Fortran 95 中,对可分配数组的赋值要求赋值语句左右两侧的形状与长度参数都要匹配。在 Fortran 2003 中,如果形状与长度参数不匹配,则取消分配所赋值的变量,然后重新分配到与赋值的表达式匹配的形状与长度参数。对于 10.1 版,编译器可以执行 Fortran 2003 指定的额外操作,但由于这些操作会明显影响性能,默认值是保留 Fortran 95 行为,即形状与长度参数要求匹配。如果希望采取 Fortran 2003 的行为,即在形状不匹配时取消并再次分配变量,请指定 -assume realloc_lhs


二、八、十六进制常数
在 Fortran 95 中,二、八、十六进制常数(“BOZ 常数”)只能出现在 DATA 语句中,并且限制为初始化标量整型变量。作为 Fortran 95 的扩展,“英特尔 Fortran 编译器”允许 BOZ 常数出现在任何上下文中,类型诠释由上下文来确定。Fortran 2003 对 BOZ 常数的用法进行了扩展,允许它们初始化任何数值类型,并且允许它们出现在 INT、REAL、DBLE 以及 CMPLX 内部函数的参数中。
BOZ 常数用法的 Fortran 2003 语义同以前“英特尔 Fortran”的扩展版相同,但 BOZ 常数作为 INT、REAL、DBLE 以及 CMPLX 等函数的参数的情况除外。按照 Fortran 2003 的规定,在这些上下文中,BOZ 常数诠释为二进制值,也就是直接作为内部函数返回的数据类型进行诠释;而在以前的“英特尔 Fortran”诠释中,BOZ 常数先是视作有符号整型值,随后再进行转换。
例如:
print *, real(Z'40490FDB')
按照旧式的行为 (-assume old_boz),打印结果是 1.0785300E+09;而按照新的行为 (-assume noold_boz),打印结果是 3.141593。
对于 10.0 版,“英特尔 Fortran”的默认行为是 Fortran 2003 的行为,即传递二进制值而不进行转换。如果应用程序需要旧式的行为,请使用 -assume old_boz 选项进行编译。


默认 I/O 设备 *
在“英特尔 Fortran 编译器”中的默认情况下,同 ACCEPT、PRINT 以及 TYPE 语句使用的 I/O 设备* 与隐含设备关联的设备号和可以在 OPEN 语句中指定的设备号(如设备 5 或 6)不同。Fortran 2003 要求程序员能够 OPEN 这些默认设备,这与当前“英特尔 Fortran”的行为不兼容。
在 10.0 版中,已经添加了 -assume [no]old_unit_star 编译命令行选项以控制此行为。默认值 -assume old_unit_star 对于不同于设备 5 和 6 的设备,保持当前与过去的行为。如果希望使用 Fortran 2003 的行为,或如果将使用 Fortran 2003 内部模块 ISO_FORTRAN_ENV 及其定义的 INPUT_UNIT 与 OUTPUT_UNIT 常数,请指定 -assume noold_unit_star 让设备*(以及 ACCEPT、PRINT 和 TYPE)使用设备 5(输入)和 6(输出)。
此行为的默认值在将来的发行版中可能会改变。


RECL= 无格式文件的单位
在 10.0 版中,同“英特尔 Fortran”8.x 与 9.x 版中一样,打开文件进行无格式 I/O 时,在 OPEN 中为 RECL= 关键字指定的值是四字节单位,即默认整数的大小。以前的 Fortran 标准规定,RECL= 单位“独立于实现”,但 Fortran 2003“建议”使用单字节。要将无格式 I/O 的 RECL= 单位指定为字节,请使用现有的编译器选项 -assume byterecl。如果您的应用程序使用 ISO_FORTRAN_ENV 内部模块中的 FILE_STORAGE_SIZE 命名参数,则也必须使用此选项。


.XOR。内部函数操作符
作为扩展,“英特尔 Fortran”编译器定义了内部函数操作符 .XOR.。由于内部函数操作符具有与用户自定义操作符不同的优先级,这会导致与相同名称的用户自定义操作符发生冲突。如果您定义自己的操作符 .XOR.,则可以指定 -assume no_old_xor 以禁用编译器将 .XOR. 当作内部函数操作符的定义。


模块过程与变量的全局符号
“英特尔 Fortran”编译器通过将模块名称与过程或变量名称合到一起(以字符串 "_mp_" 分隔),然后应用标准的名称修饰规则,来构造模块过程与变量的全局名称。例如,MYMOD 模块中的 SUB 过程的全局名称为 MYMOD_mp_SUB。此方法可能会与名称中包含 _mp_ 字符串的用户过程产生冲突。如果您的应用程序发生这种冲突,请指定 -assume noold_mod_proc_name 选项,它会将分隔符的大小写切换为与默认名称的大小写相反。您必须为整个应用程序指定相同的选项,以使所有名称保持一致。


数据流 I/O(Fortran 2003 功能)
对于 10.1 版,编译器支持 Fortran 2003 数据流 I/O 功能,它提供按照字节流来读取和写入文件的能力。要启用数据流访问,请打开指定 ACCESS='STREAM' 的文件。READ 与 WRITE 语句支持 POS= 关键字,可以指定文件位置。如需有关详细信息,请参阅“英特尔 Fortran 编译器语言参考”。


RECORDTYPE='STREAMxx' 的行为改变
作为扩展,“英特尔 Fortran”支持 OPEN 语句中的 RECORDTYPE 值 STREAM、STREAM_CR 及 STREAM_LF。在以前的版本中,文档与实现都不正确,并且两者不一致。旧的行为如下:
RECORDTYPE='STREAM'
写入时,将 LF 用作行终结符。输入时,不识别分隔符。
RECORDTYPE='STREAM_CR'
写入时,将 CR-LF 用作行终结符。输入时,不识别分隔符。
RECORDTYPE='STREAM_LF'
写入时,将 CR-LF (Windows)、LF(Linux* 与 Mac OS*)用作行终结符。输入时,不识别分隔符
此外,如果指定了 CARRIAGECONTROL='NONE',则行为已发生改变。
在 10.1 版中,行为改变如下:
RECORDTYPE='STREAM'
不写入或读取分隔符。类似于 Fortran 2003 的数据流 I/O
RECORDTYPE-'STREAM_CR'
将 CR 当作记录分隔符进行写入和读取
RECORDTYPE='STREAM_LF'
将 LF 当作记录分隔符进行写入和读取
按如下所示定义新选项:
RECORDTYPE='STREAM_CRLF'
将 CR-LF 对当作记录分隔符进行读取和写入
CARRIAGECONTROL 不再影响 RECORDTYPE 的行为。
在 Windows 上,默认格式的记录分隔符是 CR-LF;在 Linux 与 Mac OS 上则是 LF。利用这些更改,现在可以使用相同的方式在所有三种操作系统上指定特定的分隔符类型。
如果希望在无须编辑源代码的情况下更改应用程序的运行时行为,则可以定义一个新的环境变量 FOR_FMT_TERMINATOR。此环境变量的值采用以下形式:
mode[:ulist][;mode[:ulist]...]
其中 mode 是 CR、LF 或 CRLF 之一,ulist 是应用该模式的可选设备号范围,例如,2,17-20, 91


Fortran 2003 的新增功能
自 9.1 版最初发行以来,Fortran 2003 标准中已经添加了以下功能。其中某些功能第一次出现在 9.1 版的更新中。如需有关详细信息,请参阅 Intel® Fortran Language Reference(英特尔® Fortran 语言参考)。
ASYNCHRONOUS 属性和语句
BIND(C) 属性和语句
PROTECTED 属性和语句
VALUE 属性和语句
指针对象的 INTENT
赋值语句右侧在形状或长度上存在差异时,重新分配其左侧的可分配变量(要求使用 "assume realloc_lhs" 选项)
FLUSH 语句
WAIT 语句
OPEN 的 ACCESS='STREAM' 关键字值
OPEN 与数据传输语句的 ASYNCHRONOUS 关键字
INQUIRE 与数据传输语句的 ID 关键字
INQUIRE 与数据传输语句的 POS 关键字
INQUIRE 的 PENDING 关键字
用户自定义操作符的重命名
IMPORT 语句
USE 语句的 INTRINSIC 与 NON_INTRINSIC 关键字
ISO_C_BINDING 内部模块
用于 COMMAND_ARGUMENT_COUNT 内部过程的 ISO_FORTRAN_ENV 内部模块(必须使用 /assume:byterecl 与 /assume:noold_unit_star 进行编译,以便得到正确的值)。
GET_COMMAND 内部过程
GET_COMMAND_ARGUMENT 内部过程
GET_ENVIRONMENT_VARIABLE 内部过程
IS_IOSTAT_END 内部过程
IS_IOSTAT_EOR 内部过程
MOVE_ALLOC 内部过程
NEW_LINE 内部过程
SELECTED_CHAR_KIND 内部过程


其它语言功能
如需有关以下新增语言功能的详细信息,请参阅 Intel® Fortran Language Reference(英特尔® Fortran 语言参考)。
ASSUME_ALIGNED 指示
LOOP_COUNT 指示
MEMORYTOUCH 指示
OPTIMIZE 指示
MULT_HIGH_SIGNED 内部过程


用于指定默认记录长度的新环境变量
现提供两个新的函数变量,可用于更改应用程序的运行时行为:FORT_FMT_RECL 与 FORT_UFMT_RECL。
FORT_FMT_RECL 用于给为进行有格式 I/O 而打开的所有 Fortran 设备指定默认的 RECL(记录长度)值。如果定义为十进制无符号整型值,则使用该环境变量值时,仿佛该值是在 RECORDTYPE 不是 'FIXED' 的情况下为 OPEN 的 RECL= 指定的那样。它最常见的用途是更改表式输出的行长度,默认值是 80 列。
FORT_UFMT_RECL 用于给为进行无格式 I/O 而打开的所有 Fortran 设备指定默认的 RECL(记录长度)值。如果定义为十进制无符号整型值,则使用该环境变量值时,仿佛该值是在 RECORDTYPE 不是 'FIXED' 的情况下为 OPEN 的 RECL= 指定的那样。它最常见的用途是更改使用 RECORDTYPE='SEGMENTED' 打开的文件的最大段长,默认值是 2040 字节。


OpenMP* 应用程序的 KMP_AFFINITY 环境变量
KMP_AFFINITY 环境变量可以在 OpenMP* 应用程序中用于指定应该如何将执行线程绑定到系统中的处理器上。此设置的效果是在程序执行期间按照线程的创建顺序,以轮流的方式将每个线程绑定到系统中的处理器核心。KMP_AFFINITY 的值应该采用以下形式:
compact,
其中 是一个非负整数。例如:
compact,1
参数指定连续线程的绑定核心在机器拓扑图(用二叉树表示)中的间隔。级别零表示,对于启用了“英特尔® 超线程技术”的处理器,线程将绑定到处理器的连续线程上下文;如果未启用,则绑定到连续的处理器。从线程上下文到核心,再到封装(处理器),级别依次增加一级。此设置仅有英特尔公司提供的处理器才支持,并且所在的系统必须使用支持线程绑定的操作系统。


改善的并行器与矢量器
此版本采用一个完全重新设计的优化器,在包含内存与循环优化的 O2 与 O3 优化级别,优化器会将并行化(所有体系结构)与矢量化(IA-32 与 Intel® 64 体系结构)的功能集成到一起。
通过采取以下措施可以显著改善性能:
生成更高效的多线程代码
生成更高效的 SIMD 代码
增强的循环转换


新增与改进的高级循环转换优化报告
“循环转换 (HLO) 优化”报告可以告诉您编译器为什么无法对某组循环进行循环交换,并提示是否可通过更改源代码来消除所报告的瓶颈。这些报告现已经过改进,可以提供更详细的信息,并且也更容易理解。


静态验证器
“静态验证器”是一个新的编译器功能,可跨越多个源文件对程序执行静态分析。它可以检测不同种类的缺陷,以及用户代码中语言功能的可疑或不一致的用法,并按照严重程度进行报告。“静态验证器”可以理解 C/C++ 与 Fortran 代码,也可以分析 OpenMP 指示。


Fortran 2003 功能摘要
“英特尔 Fortran 编译器”支持最新版 Fortran 标准(即 Fortran 2003)中的许多新功能。在将来的版本中,将出现更多的 Fortran 2003 功能。当前编译器支持的 Fortran 2003 功能包括:
Fortran 字符集已扩展到包含 8 位 ASCII 字符 ~ \ [ ] ` ^ { } # @
名称最长可达 63 个字符
语句最长可达 256 行
允许方括号 [ ] 代替 (/ /) 用作数组构造器的分隔符
命名为 PARAMETER 常数可以用作复常数的一部分
可分配的衍生类型组分
ASYNCHRONOUS 属性和语句
BIND(C) 属性和语句
PROTECTED 属性和语句
VALUE 属性和语句
VOLATILE 属性和语句
指针对象的 INTENT 属性
赋值语句右侧在形状或长度上存在差异时,重新分配其左侧的可分配变量(要求使用 "assume realloc_lhs" 选项)
在所有的 I/O 语句中,以下数值可以是任何类型:UNIT=、IOSTAT=
FLUSH 语句
WAIT 语句
OPEN 的 ACCESS='STREAM' 关键字
OPEN 与数据传输语句的 ASYNCHRONOUS 关键字
INQUIRE 与数据传输语句的 ID 关键字
数据传输语句的 POS 关键字
INQUIRE 的 PENDING 关键字
以下 OPEN 数值可以是任何类型:RECL=
以下 READ 与 WRITE 数值可以是任何类型:REC=、SIZE=
以下 INQUIRE 数值可以是任何类型:NEXTREC=、NUMBER=、RECL=、SIZE=
在以下情况中允许执行递归 I/O:除自己的内部文件之外,新启动的 I/O 不会修改其它任何内部文件
IEEE 无穷大与 NaN 按照 Fortran 2003 规定的格式化输出进行显示
在 I/O 格式中,如果 P 编辑描述符后面跟一个重复说明符,则编辑描述符后面的逗号可有可无
USE 中用户自定义操作符的重命名
USE 中的 INTRINSIC 与 NON_INTRINSIC 关键字
IMPORT 语句
可分配的虚拟参数
可分配的函数返回值
COMMAND_ARGUMENT_COUNT 内部函数
GET_COMMAND 内部函数
GET_COMMAND_ARGUMENT 内部函数
GET_ENVIRONMENT_VARIABLE 内部函数
IS_IOSTAT_END 内部函数
IS_IOSTAT_EOR 内部函数
MOVE_ALLOC 内部函数
NEW_LINE 内部函数
SELECTED_CHAR_KIND 内部函数
以下内部函数可接受可选的 KIND= 参数:ACHAR、COUNT、IACHAR、ICHAR、INDEX、LBOUND、LEN、LEN_TRIM、MAXLOC、MINLOC、 SCAN、SHAPE、SIZE、UBOUND、VERIFY
ISO_C_BINDING 内部模块
ISO_FORTRAN_ENV 内部模块

在此发行版中,启用“静态验证器”时,不会调用链接器,因此不会产生可执行文件或静态/动态链接库,作为调用“静态验证器”的结果而产生的目标文件无效,不应用于生成实际的可执行文件或静态/动态链接库。当前用法模型是添加“静态验证器”作为替代性的构建选项,以产生诊断报告。
“静态验证器”不能与交叉文件过程间优化 (/Qipo) 结合使用。
如需有关详细信息,请参阅光盘文档中关于 Building Applications > Error Handling > Handling Compile Time Errors > using Static Verification Diagnostic Options(构建应用程序 > 错误处理 > 处理编译时错误 > 使用静态验证诊断选项)的部分。


(http://blog.sina.com.cn/s/blog_51ffcfc301009utu.html~type=v5_one&label=rela_nextarticle )

Wednesday, May 13, 2009

intel Fortran 编译器 10.1 Linux*版入门 2

英特尔 ® Fortran 编译器 10.1 Linux* 版入门指南、安装指南和发行说明[2]
原始文档下载地址
http://www.intel.com/cd/software/products/apac/zho/358463.htm

英特尔® Fortran 编译器 10.1 Linux* 版安装指南

目录
简介
系统要求
获取编译器与工具
安装编译器与工具
设置编译器环境
卸载编译器与工具
获取技术支持
免责声明与法律信息

简介
本文介绍如何安装与配置“英特尔® Fortran 编译器 10.1 Linux* 版”以便使用。安装过程分为多个步骤。在开始安装之前,请通读本文,然后依次执行各个步骤。如需有关产品内容的详细信息,包括新增与改进的功能,请参阅单独的发行说明
如果安装了旧版“英特尔 Fortran 编译器 Linux 版”,则在安装此版本之前,并不需要卸载它。如果选择卸载旧版本,则在安装此版本之前或之后都可以卸载。

系统要求
处理器术语
英特尔® 编译器支持三种平台:处理器与操作系统类型的常规组合。这部分介绍英特尔在其文档、安装过程以及技术支持网站中用于描述平台的术语。

IA-32
IA-32 体系结构指基于以下处理器且运行 32 位操作系统 ("Linux x86") 的系统:通常与英特尔奔腾® II 处理器兼容的 32 位处理器(例如,英特尔® 奔腾® 4 处理器或英特尔® 至强® 处理器),或是其它厂商生产的支持相同指令集的处理器。

Intel® 64
Intel® 64 体系结构指基于带 64 位体系结构扩展的 IA-32 体系结构处理器(例如,英特尔® 酷睿™2 处理器系列)且运行 64 位操作系统 ("Linux x86_64") 的系统。如果系统运行 32 位版的 Linux 操作系统,则适用 IA-32 体系结构。针对 Intel® 64 体系结构应用程序的英特尔编译器还支持以下系统:基于 AMD* Athlon64* 与 Opteron* 处理器,并且运行 64 位操作系统的系统。
IA-64
指基于英特尔® 安腾® 2 处理器且运行 64 位操作系统的系统。

本机与跨平台开发
术语“本机”是指构建一个应用程序,它将在构建时使用的相同平台上运行;例如,在 IA-32 体系结构上构建要在 IA-32 体系结构上运行的应用程序。术语“跨平台”或“交叉编译”是指构建一个应用程序,它运行时使用的平台与构建时使用的平台属于不同的类型;例如,在 IA-32 体系结构上构建要在 IA-64 体系结构上运行的应用程序。并非所有的跨平台开发组合都受支持,有些组合可能需要安装可选的工具与函数库。
下表介绍支持的编译主机(构建应用程序的系统)与应用程序目标(运行应用程序的系统)组合。
IA-32 体系结构主机
支持的目标:IA-32
Intel® 64 体系结构主机
支持的目标:IA-32 与 Intel® 64
IA-64 体系结构主机
支持的目标:IA-64
备注:开发与主机不同的目标时,可能需要从 Linux 发行包中安装可选的函数库组件。
备注:“英特尔® 集群 OpenMP*”是单独授予许可证的功能,与编译器的系统要求也不相同。如需有关详细信息,请参阅“英特尔集群 OpenMP”文档。

开发 IA-32 体系结构应用程序的要求

  • 基于 IA-32 体系结构处理器(最低 450 MHz 主频的英特尔奔腾® II 处理器,或更高级的处理器 - 建议配备英特尔® 酷睿™2 处理器系列或英特尔® 奔腾® 4 处理器)、Intel® 64 体系结构处理器的系统,或是基于 AMD* Athlon* 或 AMD Opteron* 处理器的系统
  • 512 MB 内存(建议配备 1GB)。
  • 100 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++

针对 Intel® 64 体系结构系统或针对 AMD* Opteron* 处理器开发应用程序时的要求

  • 基于 IA-32 或 Intel® 64 体系结构处理器(建议配备英特尔® 酷睿™2 处理器系列或英特尔® 至强® 处理器),或是基于 AMD Opteron 处理器的系统
  • 512 MB 内存(建议配备 1GB)
  • 300 MB 的空闲硬盘空间,另外还需要 300 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 100 MB 硬盘空间,用于虚拟内存页面文件。确保使用的虚拟内存量至少达到针对安装的 Linux 操作系统版本所建议的最小值
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Fedora* 7
    Red Hat Enterprise Linux* 3, 4, 5
    SGI ProPack* 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
    Ubuntu* 7.04
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


开发 IA-64 体系结构应用程序的要求

  • 基于英特尔® 安腾® 2 处理器的系统。
  • 512 MB 内存(建议配备 1 GB)。
  • 150 MB 的磁盘空间,另外还需要 200 MB 空间,用于存放安装过程中下载的文件与临时文件。
  • 以下 Linux 版本(这是经英特尔测试过的操作系统版本的列表;其它版本可能会,也可能不会正常工作,因此不建议使用 - 如有任何疑问,请与“英特尔® 首要支持”联系)之一:
    Asianux* 3.0
    Debian* 4.0
    Red Hat Enterprise Linux* 3, 4, 5
    SUSE LINUX Enterprise Server* 9, 10
    TurboLinux* 11
  • 安装了“Linux 开发工具”组件,包括 gcc 3.2.3、3.3、3.4、4.1、4.11、g++ 以及相关工具
  • 提供 libstdc++.so.5 的 Linux 组件 compat-libstdc++


关于 gcc 版本的说明
英特尔编译器使用许多不同的 Linux 操作系统版本(具有不同版本的 gcc)进行过测试。某些 Linux 版本可能包含与已经测试过的版本不同的头文件,这可能会导致问题。您使用的 glibc 版本必须同使用的 gcc 的版本保持一致。
备注:

  • 使用 -O3、-ipo 及 -openmp 等高级优化选项编译非常庞大的源文件(几千行)时,所需的内存量可能会明显大很多。
  • 上面的处理器型号名称列表并非毫无遗漏 - 与上面列出的那些处理器支持相同指令集的其它处理器型号应该也可以正常使用。如果有关于特定处理器型号的问题,请与“英特尔® 首要支持”联系。
  • 有些优化选项在运行应用程序的处理器类型方面存在限制。如需有关详细信息,请参阅这些选项的文档。


获取编译器与工具
在安装编译器与工具之前,应该检查英特尔® 软件开发产品注册中心的产品下载 部分,确认是否有新的版本或更新。光盘版或电子下载许可证邮件中列出的版本可能并不是最新版本。要从“英特尔® 首要支持”下载并安装编译器,首先必须按照技术支持下的说明进行注册,以便获取技术支持。
在“英特尔® 软件开发产品注册中心”,此编译器以多种不同的软件包形式提供,以满足您的各种需要。这些软件包的文件名与说明如下:
l_fc_x_10.1.xxx.tar.gz
适用于开发 IA-32 与 Intel® 64 体系结构应用程序的完整产品,包含“英特尔 Fortran 编译器”与“英特尔调试器”。针对 IA-32 或 Intel® 64 体系结构系统进行开发的新用户应该选择它。
l_fc_x_10.1.xxx_ia32.tar.gz
仅适用于开发 IA-32 体系结构应用程序的“编译器”与“调试器”。如果要更新以前安装的 10.1 编译器,并且是针对 IA-32 体系结构系统进行开发,请选择它。
l_fc_x_10.1.xxx_intel64.tar.gz
仅适用于开发 Intel® 64 体系结构应用程序的“编译器”与“调试器”。如果要更新以前安装的 10.1 编译器,并且针对 Intel® 64 体系结构系统进行开发,请选择它。
l_fc_x_10.1.xxx_ia64.tar.gz
仅适用于开发 IA-64 体系结构应用程序的“编译器”与“调试器”。如果要针对 IA-64 体系结构系统进行开发,并且要进行全新安装或更新以前的 10.1 编译器,请选择它。
其中 "x" 可能会有所不同。
如果您拥有“英特尔® Fortran 编译器专业版”许可证,则“英特尔® Math Kernel Library”需要单独下载与安装。如需有关详细信息,请参阅该组件的“安装指南”与/或“发行说明”。

安装编译器与工具
如果在首次安装或注册过程中遇到困难,请访问 https://registrationcenter.intel.com/support 以便从英特尔获取帮助。
在本文的其它部分,使用 表示的默认安装目录是:
/opt/intel/fc/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/fce/10.1.xxx(针对 Intel® 64)
/opt/intel/idb/10.1.xxx(针对 IA-32 与 IA-64)
/opt/intel/idbe/10.1.xxx(针对 Intel® 64)
请注意,路径包括含更新号的完整版本号。这意味着您可以在系统上保持安装多个版本的编译器。如果不希望保留多个版本,则在安装新版本之前或之后都可以删除旧目录。
如果同时安装“英特尔 C++ 编译器”与“英特尔 Fortran 编译器”,它们都提供“英特尔调试器”。如果 C++ 与 Fortran 安装程序的更新号不同,则“英特尔调试器”的更新号也会不同。如果安装同时发行的这两种语言的编译器,我们建议为 Fortran 编译器选择 Custom Install(自定义安装);由于调试器相同,请勿再次安装“英特尔调试器”。从英特尔 C++ 软件包安装调试器时,会提供 Eclipse* 集成。
执行以下步骤来安装编译器。

  • 将编译器软件包解压到您拥有写入访问权限的目录。

> tar -xvf l_fc_x_10.1.xxx.tar

>tar -zxvf l_fc_x_10.1.xxx.tar.gz

  • 运行安装脚本

在解开 tar 文件的目录中,执行安装脚本。

> cd l_fc_x_10.1.xxx

> ./install.sh

  • 如 果不是作为 root 登录,安装脚本将询问是要作为 root 进行安装、使用 sudo 作为 root 进行安装,还是不使用 root 权限进行安装。建议作为 root 进行安装(如果有权限,请使用 sudo),这将更新系统 RPM 数据库。如果要安装到私有区域,请使用 install as current user(作为当前用户进行安装)选项。
  • 安装脚本将显示一系列选项,供您开始安装或查看文档。输入 1 并按 Enter 键开始安装编译器。
  • 随后安装脚本将提示输入“英特尔 Fortran 编译器 Linux 版”的序列号。序列号已经在购买产品时提供给您,它或是在当地经销商发给您的电子邮件中,或是在光盘包装盒的贴纸上。您也可以选择输入指向现有许可证文件的路径。作出选择,然后按照提示执行。
  • 随后,安装脚本会执行一些必备条件检查,并显示已经安装的英特尔软件开发工具(如果有),然后提供 Typical Install(典型安装)与 Custom Install(自定义安装)让您选择。建议选择 Typical Install(典型安装)- 输入 1 并按 Enter 键。
  • 再次按 Enter 键以显示许可协议。显示许可协议之后,安装脚本会提示您接受还是拒绝许可协议。如果接受许可协议,请输入 accept(接受)并按 Enter 键。如果拒绝许可协议,请输入 reject(决绝)并按 Enter 键以结束安装过程。
  • 随后安装过程将继续 - 安装脚本可能会提示您接受其它一些许可协议、指定安装路径或是按 Enter 键继续执行安装步骤。
  • 在安装过程结束时,安装脚本将提示您注册“英特尔® 首要支持”。注册之后,便可以在技术支持期(对于购买的带技术支持的许可证,通常是一年)内享受“英特尔® 首要支持”的所有服务,包括所有的更新与新版本。如果不进行注册,您将无法安装或使用产品更新。输入电子邮件地址,看到提示时进行注册。(如果已经拥有“ 英特尔® 首要支持”帐户,请输入注册的电子邮件地址)。随后您将收到一封包含注册信息(含初始密码)的电子邮件。如果不希望注册,或是已经注册,请依次按 x 与 Enter 键退出。
  • 注册之后,安装脚本退出。


RPM 4.0.2 与 RPM 4.1 的安装警告


RPM 4.0.2 无法安装到非默认目录。这个问题在 RPM 4.0.3 中已经解决。RPM 4.1 无法安装到非默认目录。这个问题在 RPM 4.11 到 4.2 中已经解决。


安装英特尔® 许可证服务器


如果有流动型、限制用户数或节点锁定型许可证,则许可证必须结合针对英特尔软件的 FLEXlm* 许可证服务器(英特尔® 许可证服务器)一起安装,该服务器在许多主流平台上都有提供。该服务器可以安装在本地网络中可访问的任何支持的平台上。编译器光盘包含针对多个 Linux 版本的许可证服务器。如果没有光盘,或是需要针对其它平台的许可证服务器,则可以从英特尔® 软件开发产品注册中心下载许可证管理器。请注意,并非在支持编译器本身的所有平台上都提供“英特尔许可证服务器”。


在运行 SGI ProPack* 的 SGI* Altix* 系统上安装英特尔许可证服务器


如果要在运行 SGI ProPack* 的 SGI* Altix* 系统上安装“英特尔许可证服务器”,请按照以下操作说明执行,以确保在分区集群环境中正确操作:

  • 英特尔® 软件开发产品注册中心获取适当的许可证服务器。要使用的文件是 flexlm.Linux.ia64.EL3_SGIAltix.tar.Z。
  • 按照编译器软件包中 flexlm_ug.pdf 文档文件中的操作说明安装许可证服务器。
  • 要确定检索许可证文件所需的“主机标识”,请登录到要运行许可证服务器的分区,将默认值设置 (cd) 为安装了“英特尔许可证服务器”的目录(默认为 /opt/intel/flexlm),并执行以下命令:
    ./lmhostid
  • 如果还没有许可证,请访问“英特尔® 软件开发产品注册中心”,按上节所述注册您的产品。如果已经拥有许可证,但主机标识不正确,请将问题提交到英特尔® 首要支持,提供许可证文件的序列号、运行 lmhostid 的结果、表明这是流动型许可证还是节点锁定型许可证的指示,以及为新主机标识生成新许可证的请求。务必从“Linux* 操作系统”下拉列表中选择 SGI* Altix* ProPack*,指定这是针对 Altix 系统。英特尔客户支持小组将为您生成含正确主机标识的新许可证。

无提示安装


“英特尔 Fortran 编译器”可以进行自动安装,而不必就所作的提示输入响应信息。这种类型的安装会显示一些输出结果,但无需用户交互。这种安装的步骤如下:

  • 为所提供的无提示安装配置模板创建一份本地副本。这在光盘上有提供,即 data/silentInstallConfigFile.ini。如果使用下载的产品副本,请按上文所述将它进行 untar,您将在 data 文件夹中找到该文件。例如:
    cp /mnt/cdrom/data/SilentInstallConfigFile.ini /home/my_account/my_silent.ini
  • 编辑配置文件的本地副本以接受许可协议,并且允许根据需要覆盖安装的现有程序。进行适当的本地更改以设置安装目标目录等首选项。对于可能需要更改的每个字段,模板文件都包含相关的说明。
  • 根据需要切换为 root 或超级用户帐户。
  • 运行安装程序如下:
    /mnt/cdrom/data/install_fc.sh --run --silent /home/my_account/my_silent.ini
    对于下载的软件包,请使用指向 data/install_fc.sh 的适当路径来确定未解压的安装程序的位置。
    如果自定义的配置文件中有错误或疏漏,只需纠正这些错误并重新运行安装程序即可。


设置编译器环境


“英特尔 Fortran 编译器 10.1 Linux 版”产品中的程序依赖于 PATH 与 LD_LIBRARY_PATH 环境变量。安装脚本 (install.sh) 创建编译器环境脚本文件 (ifortvars.sh/idbvars.sh) 来设置这些变量。强烈建议将这些脚本文件添加到登录脚本(.login 文件)中。在 ".login" 文件中设置这些变量之后,便不再需要每次会话都运行这些脚本文件。
对脚本使用 source 命令以设置编译器环境:
> source /bin/ifortvars.sh(.csh)以使用 ifort
> source /bin/idbvars.sh(.csh)以使用 idb
安装程序还会创建 /bin/ifort.cfg 编译器配置文件,它包含所有编译都需要的常用设置。您可以编辑这些文件以添加额外的默认选项。备注:如果安装编译器更新包,则需要保存配置文件;如果已经修改它,请使用另一个文件名进行保存,以免安装程序覆盖掉已修改的文件。
如果在运行编译器方面遇到任何问题,请确保许可证目录中存在有效的许可证文件 (*.lic)。默认情况下,这是 /opt/intel/licenses。编译器使用 INTEL_LICENSE_FILE 环境变量来确定许可证文件的位置。如果仍然有问题,请将问题提交给“英特尔® 首要支持”。如需有关详细信息,请参阅本文的“技术支持”部分。
安装本产品之后,如果尚未注册,请进行注册以获取技术支持。如需了解注册操作说明,请参阅下文的获取技术支持


卸载编译器与工具


请按照以下步骤卸载英特尔“编译器”与“调试器”。

  • 如果安装时使用的是 root 帐户,则将需要作为 root 登录
  • 要卸载编译器:

/bin/uninstall.sh

或者,如果将编译器安装到了默认的目录,请使用

/opt/intel/fc/10.1.xxx/bin/uninstall.sh 或

/opt/intel/fce/10.1.xxx/bin/uninstall.sh(在 Intel® 64 体系结构系统上)

  • 要卸载调试器:

/bin/uninstall.sh

或者,如果将调试器安装到了默认的目录,请使用

/opt/intel/idb/10.1.xxx/bin/uninstall.sh 或

/opt/intel/idbe/10.1.xxx/bin/uninstall.sh(在 Intel® 64 体系结构系统上)


获取技术支持


如果未在安装过程中注册编译器,请访问英特尔® 软件开发产品注册中心进行注册。注册之后,在技术支持服务期间,您可以获取免费技术支持、产品更新以及升级。
如需有关如何找到“技术支持”、“产品更新”、“用户论坛”、常见问题、提示与技巧的信息,以及其它技术支持信息,请访问:http://www.intel.com/software/products/support/flin
备注:如果分销商提供本产品的技术支持,请与他们而不是英特尔联系技术支持事宜。


免责声明与法律信息


本文所含信息专门针对英特尔(R) 产品提供。本文并未授予任何知识产权的许可证,无论是明确、暗示、禁止翻供还是其它任何形式。除这些产品的“英特尔销售条款”之规定外,英特尔概不承担任何其它义务,对于英特尔产品的销售与/或使用(包括适合特定用途、适销性或不侵犯任何专利权、版权或其它知识产权),英特尔不作任何明确或暗示的担保,也不承担任何赔偿责任。未经英特尔公司书面同意,不应将英特尔产品用于任何在发生故障时可能会造成人身伤亡的用途,英特尔产品并未针对这些用途而设计,也不旨在用于这些用途。
英特尔随时可能更改技术规格与产品说明,如确有更改,恕不另行通知。标有“保留”或“未定义”字样的任何功能或指令,其存在性与特性均不确定,设计人员切勿对此有所依赖。英特尔保留这些供将来定义之用,对于因将来对它们的更改而导致的任何冲突或不兼容现象,英特尔概不承担任何责任。本文所含信息可随时更改而不另行通知。不应依赖这些信息进行最终设计决策。
本文所述产品可能包含一些设计缺陷或错误(统称错误),导致产品与发布的规格不符。目前已确定的错误可应客户要求提供。
在订购产品之前,请与当地的英特尔销售办事处或分销商联系,以获取最新规格。
对于本文中引用的并且包含订单号的文档,或是其它的英特尔文档,均可通过拨打 1-800-548-4725 或访问英特尔网站来获取。
赛扬、迅驰、英特尔、英特尔徽标、Intel386、Intel486、英特尔酷睿、安腾、MMX、奔腾、VTune 以及至强是英特尔公司在美国以及其它国家或地区的商标。
* 其它品名与品牌可能是属于其它公司的资产。
(C) 2007 英特尔公司版权所有。保留所有权利。


(http://blog.sina.com.cn/s/blog_51ffcfc301009utr.html~type=v5_one&label=rela_nextarticle)