并行计算
一、命令
(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
表示大小写敏感查找。例如:
/foo\c ;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\n", &seqno); printf("pid = %d, seq# = %ld\n", getpid(), seqno); seqno++; rewind(fp); /*rewind before write*/ fprintf(fp, "%ld\n", 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)会出现迷之现象,位数解释不正确,并不能保留整数