并行计算

一、命令

(1)环境:改.bashrc:

指定intel 编译器的环境变量:
source /data/software/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
指定intel mpi 的环境变量:
source /data/software/intel/impi/5.1.3.210/bin64/mpivars.sh
指定intel mkl 库的环境变量:
source /data/software/intel/mkl/bin/mklvars.sh intel64

(2)编译:

mpiicc –o helloworld helloworld.c (先目标再源

(3)常用:

执行:qsub *.qsub

查看状态:qstat

取消:canceljob

(4)vim

在查找模式中加入c表示大小写不敏感查找,C表示大小写敏感查找。例如:

/fooc ;n向后找,N向前

二、编程

(1)进程同步:信号量

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>

int main(int argc, char ** argv) {
FILE* fp;
long i, seqno = 1;
fp = fopen("seqno", "r+");
sem_t *sem = sem_open("/semlock", O_CREAT, 0644, 1); //打开信号量
for (i = 0; i < 20; i++) {
sem_wait(sem);//进入临界区
rewind(fp); /*rewind before read*/
fscanf(fp, "%ld
", &seqno);
printf("pid = %d, seq# = %ld
", getpid(), seqno);
seqno++;
rewind(fp); /*rewind before write*/
fprintf(fp, "%ld
", seqno);
sem_post(sem);//出临界区
}
fclose(fp);
}

打开:有名信号量、内存信号量https://blog.csdn.net/maopig/article/details/52227768

详细教程:http://www.360doc.com/content/12/0419/10/54470_204839982.shtml

sem_open

  文档http://man7.org/linux/man-pages/man3/sem_open.3.html#top_of_page

  教程 https://blog.csdn.net/tennysonsky/article/details/46500417

    由特定进程创建信号量,其他进程等待后打开

程序如果在还没有完成锁操作时退出,需要先重新初始化锁!(open的有名锁是跟内核走的)

 

(2)广播 已保证收到

(3)输出

  多进程控制台输出有问题,需要上锁或指定进程号才有意义,否则控制台是乱的(各进程的单项输出也不连续,无可解释性) 

  printf("%d",float)会出现迷之现象,位数解释不正确,并不能保留整数

原文地址:https://www.cnblogs.com/iwanna/p/10826654.html