尧江明 的个人资料江明的空间照片日志列表更多 工具 帮助

日志


10月14日

Linux脚本编写

Linux的shell scripting 是一种自动完成多种类型任务的方法,从夜间备份到简单的命令行应用。几乎任何程序都可以通过shell script完成。你甚至可以在脚本内部完成简单的条件检查。shell script的基本格式如下:

#!/bin/sh
...
这里是你的命令
...

注意文件是以#!/bin/sh开始的。这把操作系统指向解释脚本的程序。绝大部分系统有/bing/sh,因为这是根用户使用的标准shell。你可以在绝大部分系统中使用/bing/bash。

实例: 通过vi example 建立 example脚本程序
#!/bin/sh
./run
rm dic.dat
cp dic01.dat dic.dat
cp dic.out dic01.out
在linux命令模式下输入 sh example,则执行先run命令,然后将dic01.dat 拷贝到dic.dat 文件,...
 
虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
  echo "some text": 将文字内容打印在屏幕上
  ls: 文件列表
  wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
  cp sourcefile destfile: 文件拷贝
  mv oldname newname : 重命名文件或移动文件
  rm file: 删除文件
  grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt
  cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
  cat file.txt: 输出文件内容到标准输出设备(屏幕)上
  file somefile: 得到文件类型
  read var: 提示用户输入,并将输入赋值给变量
  sort file.txt: 对file.txt文件中的行进行排序
  uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
  expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
  find: 搜索文件比如:根据文件名搜索find . -name filename -print
  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
  basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
  dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
  head file: 打印文本文件开头几行
  tail file : 打印文本文件末尾几行


8月8日

Linux 常用命令问答

LINUX下常用的压缩方法

查找文件:find 目录/ -name 文件名

如在目录3DAMP_071120_parallel中查找文件dic+06730.wel,

find ./3DAMP_071120_parallel/ -name dic+06730.wel

结果显示:./3DAMP_071120_parallel/Mg/dic+06730.wel

.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
---------------------------------------------
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName

如何tar压缩一个目录压缩?

实例:tar zcf dir.tar.gz /path/dir 将目录dir压缩成dir.tar.gz.tar
解包: tar xvf FileName.tar
打包: tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
 
a) 如何从另一个服务器传输文件到本地服务器?从远程拷贝
      scp user@host:/path/to/files local_file_name
 
162.105.147.88服务器上的文件:./TriRMF_PC/dicwel.tar.gz 传到本地服务器
工作目录下,取名为dic.tar.gz.
 
b) 如何将本地服务器上的文件传输到另一个服务器?拷贝到远程
     scp local_file_name user@host:/path/to/files
实例:scp Axial_RMF_meson_exchange+PC.tar.gz jmyao@162.105.147.88:
 
本地服务器 工作目录下的文件 Axial_RMF_meson_exchange+PC.tar.gz
传到162.105.147.88服务器上工作目录下.
7月27日

谈谈并行计算的实现-OpenMP的使用

由于工作的需要,这一个星期以来一直在学习 OpenMP的使用。在此,将一些心得与体会简记如下。
一个星期之前,我对于并行计算是一无所知,也不知道 OpenMP 为何物。不知道没关系,我们有 Google, 所以我也不是不知所措。
显然,这样搜索出来的资料,有用的,没有的混杂在一起。在此之间,我发现大部分的介绍都引用这样一个网页:
进去,发现是 OpenMP的主页。上面有很多介绍,指南OpenMP Tutorial ,以及各种相关的会议。
虽然相关介绍的文件很多,但是对于我来说都不切实际,毕竟我没有那么多时间来一一看完,于是我又找到
了一个网站:
这个网站上非常系统而又不失简单易懂地介绍了 OpenMP. 这种资料比较适合我,于是
我一口气快速的看完,花了我一整天的时间。更觉得不错的是,网站后面还附有了Exercise
这几个例子已经成为各个网站介绍 OpenMP 都不可缺少的一部分。
第一个例子是 Hello World example code:程序内容如下:
C******************************************************************************
C FILE: omp_hello.f
C DESCRIPTION:
C   OpenMP Example - Hello World - Fortran Version
C   In this simple example, the master thread forks a parallel region.
C   All threads in the team obtain their unique thread number and print it.
C   The master thread only prints the total number of threads.  Two OpenMP
C   library routines are used to obtain the number of threads and each
C   thread's number.
C AUTHOR: Blaise Barney  5/99
C LAST REVISED: 
C******************************************************************************

      PROGRAM HELLO
     
      INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,
     +        OMP_GET_THREAD_NUM
  
C     Fork a team of threads giving them their own copies of variables
!$OMP PARALLEL PRIVATE(NTHREADS, TID)


C     Obtain thread number
      TID = OMP_GET_THREAD_NUM()
      PRINT *, 'Hello World from thread = ', TID

C     Only master thread does this
      IF (TID .EQ. 0) THEN
        NTHREADS = OMP_GET_NUM_THREADS()
        PRINT *, 'Number of threads = ', NTHREADS
      END IF

C     All threads join master thread and disband
!$OMP END PARALLEL

      END
C******************************************************************************
如果你熟悉 Fortran的话,那么你就会发现,OpenMP 并行部分只是在原来的程序上加入了一些 Directives:比如说,
在这个例子,!$OMP 是并行部分的提示语句(sentinel), 并行计算部分被包括在 parallel 之间:
!$OMP PARALLEL [clause ...] 
               IF (scalar_logical_expression) 
               PRIVATE (list) 
               SHARED (list) 
               DEFAULT (PRIVATE | SHARED | NONE) 
               FIRSTPRIVATE (list) 
               REDUCTION (operator: list) 
               COPYIN (list) 
               NUM_THREADS (scalar-integer-expression)

   block

!$OMP END PARALLEL
程序执行到 PARALLEL directive的时候,会将parallel之间的代码复制用于其它线程执行,从而实现并行计算。
可以采用OMP_NUM_THREADS 来设定线程数目。所有线程执行完parallel之间的程序后又会合并成一个线程。  
下面再来谈谈变量类型:在这个例子里面,在parallel后面出现PRIVATE(NTHREADS, TID),他代表变量NTHREADS和TID
是私有变量,也就是说,这两个变量在各个线程中互不影响,互相独立。与之相反的是Shared 变量,
!$OMP PARALLEL SHARED(M1, M2)
代表变量 M1,M2 对于各个线程是公用的,类似 Common 中的变量。
因此,在用 OpenMP 对矩阵相乘实现并行计算的时候,通常将矩阵指标 i,j,k定义为PRIVATE,而矩阵 A,B,C, 定义为 Shared。

下面谈谈如何编译,若输入

ifort -openmp -o hello omp_hello.f

则可以生成一个hello可执行文件,再设定线程数目为4,

export OMP_NUM_THREADS=4

最后执行,

./hello

即可显示;

 Hello World from thread =            0
 Hello World from thread =            1
 Number of threads =            4
 Hello World from thread =            2
 Hello World from thread =            3


最后要感谢 Tamara 的指导和帮助。