提交MPI程序通常涉及以下步骤:
初始化MPI环境
在程序的开始,需要调用`MPI_Init`函数来初始化MPI环境。这个函数接受命令行参数,并返回一个非零值表示初始化是否成功。
获取进程数和当前进程ID
使用`MPI_Comm_rank`函数获取当前进程的ID(`myid`)。
使用`MPI_Comm_size`函数获取总进程数(`numprocs`)。
编写MPI程序代码
根据需要编写MPI程序代码,例如进行通信、计算等。
结束MPI环境
在程序结束前,需要调用`MPI_Finalize`函数来结束MPI环境的运行,并返回一个非零值表示结束是否成功。
提交MPI作业
使用`bsub`命令将MPI程序提交到作业队列。例如:
```bash
bsub -W 1 -a intemmpi -n 2 -R "span[ptile=1]" -q x64_small -o zlt.out -e zlt.err mpirun.lsf ./comm
```
这个命令会提交一个作业,使用2个CPU核心,运行在`x64_small`队列上,输出文件为`zlt.out`,错误输出文件为`zlt.err`,程序名为`comm`。
查看作业状态
可以使用`bjobs`命令查看作业的状态,例如:
```bash
bjobs -u scwangj
```
示例代码
```c
include include int main(int argc, char argv) { int numprocs, myid, source; MPI_Status status; char message; // 初始化MPI环境 MPI_Init(&argc, &argv); // 获取进程数和当前进程ID MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); // 非0号进程发送消息 if (myid != 0) { strcpy(message, "Hello World!"); MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD); } else { // 0号进程接收消息 for (source = 1; source < numprocs; source++) { MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf("接收到第%d号进程发送的消息:%s\n", source, message); } } // 结束MPI环境 MPI_Finalize(); return 0; } ``` 提交脚本示例 可以编写一个简单的bash脚本来批量提交多个MPI作业: ```bash !/bin/bash for i in 50 60 70 80 90 100; do bsub -W 6 -a intemmpi -n $i -R span[ptile=1] -q x64_blades -o $i.out -e $i.err ./matrix done ``` 将上述代码保存为`submit.sh`,并赋予执行权限: ```bash chmod +x submit.sh ./submit.sh ``` 这样就可以批量提交多个MPI作业到作业队列中。