从这里:文件是否在UNIX中附加原子
考虑多个进程打开同一文件并附加到其中的情况.O_APPEND保证寻找到文件的末尾然后开始写操作是原子的.因此,只要每个写入大小<= PIPE_BUF,多个进程就可以附加到同一个文件中,并且任何进程都不会覆盖任何其他进程的写入.
我编写了一个测试程序,其中多个进程打开并写入同一个文件(write(2)).我确保每个写入大小> PIPE_BUF(4k).我期待看到进程覆盖其他人数据的实例.但那并没有发生.我测试了不同的写入大小.那只是运气还是有理由不这样做?我的最终目标是了解附加到同一文件的多个进程是否需要协调其写入.
这是完整的计划.每个进程都创建一个int缓冲区,用它填充所有值rank,打开一个文件并写入它.
规格:Opensuse 11.3 64位的OpenMPI 1.4.3
编译为:mpicc -O3 test.c,运行方式:mpirun -np 8 ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int
main(int argc, char** argv) {
int rank, size, i, bufsize = 134217728, fd, status = 0, bytes_written, tmp_bytes_written;
int* buf;
char* filename = "/tmp/testfile.out";
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
buf = (int*) malloc (bufsize * sizeof(int));
if(buf == NULL) {
status = -1; …Run Code Online (Sandbox Code Playgroud) 我有一个Fortran程序,我指定kind数字数据类型,试图保持最低精度,无论使用什么编译器来构建程序.例如:
integer, parameter :: rsp = selected_real_kind(4)
...
real(kind=rsp) :: real_var
Run Code Online (Sandbox Code Playgroud)
问题是我使用MPI来并行化代码,我需要确保MPI通信指定具有相同精度的相同类型.我使用以下方法与我的程序中的方法保持一致:
call MPI_Type_create_f90_real(4,MPI_UNDEFINED,rsp_mpi,mpi_err)
...
call MPI_Send(real_var,1,rsp_mpi,dest,tag,MPI_COMM_WORLD,err)
Run Code Online (Sandbox Code Playgroud)
但是,我发现这个MPI例程对于不同的MPI实现并没有特别好的支持,所以它实际上使我的程序不可移植.如果我省略了MPI_Type_create例程,那么我将依赖于标准MPI_REAL和MPI_DOUBLE_PRECISION数据类型,但如果该类型与selected_real_kind最终将由MPI传递的真实类型的选择不一致,该怎么办?我是不是只使用标准real声明的数据类型,没有kind属性,如果我这样做,我保证,MPI_REAL并且real总是会有相同的精度,无论编译器和机器?
更新:
我创建了一个简单的程序,演示了当我的内部实数比MPI_DOUBLE_PRECISION类型提供的精度更高时我看到的问题:
program main
use mpi
implicit none
integer, parameter :: rsp = selected_real_kind(16)
integer :: err
integer :: rank
real(rsp) :: real_var
call MPI_Init(err)
call MPI_Comm_rank(MPI_COMM_WORLD,rank,err)
if (rank.eq.0) then
real_var = 1.123456789012345
call MPI_Send(real_var,1,MPI_DOUBLE_PRECISION,1,5,MPI_COMM_WORLD,err)
else
call MPI_Recv(real_var,1,MPI_DOUBLE_PRECISION,0,5,MPI_COMM_WORLD,&
MPI_STATUS_IGNORE,err)
end if
print …Run Code Online (Sandbox Code Playgroud) 我想将矩阵分区为块(而不是条带),然后使用MPI_Scatter分配这些块.
我提出了有效的解决方案,但我认为它远非"最佳实践".我有8x8矩阵,填充0到63之间的数字.然后我将它分成4个4x4块,使用MPI_Type_vector并通过MPI_Send分配它,但这需要一些额外的计算,因为我必须计算大矩阵中每个块的偏移量.
如果我使用散点图,则第一个(左上角)块传输正常,但其他块不传输(块的开始错误偏移).
那么可以使用MPI_Scatter传输矩阵块,或者进行所需分解的最佳方法是什么?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define SIZE 8
int main(void) {
MPI_Init(NULL, NULL);
int p, rank;
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
char i;
char a[SIZE*SIZE];
char b[(SIZE/2)*(SIZE/2)];
MPI_Datatype columntype;
MPI_Datatype columntype2;
MPI_Type_vector(4, 4, SIZE, MPI_CHAR, &columntype2);
MPI_Type_create_resized( columntype2, 0, sizeof(MPI_CHAR), &columntype );
MPI_Type_commit(&columntype);
if(rank == 0) {
for( i = 0; i < SIZE*SIZE; i++) {
a[i] = i;
}
for(int rec=0; rec < p; rec++) {
int offset = (rec%2)*4 + (rec/2)*32;
MPI_Send (a+offset, …Run Code Online (Sandbox Code Playgroud) 使用mpirun或启动MPI作业时mpiexec,我可以理解如何开始每个单独的过程.但是,如果没有任何编译器魔法,这些包装器可执行文件如何将安排(MPI通信器)传达给MPI进程?
我对细节很感兴趣,或者对指向何处的指针感兴趣.
当我尝试制作CUDA 5.0样本时,会出现错误:
Makefile:79:*未找到MPI,没有构建simpleMPI ..停止.
我已经尝试下载并构建最新版本的Open MPI,以支持Open MPI"FAQ/Platforms/OS X/6.我如何不使用OS X捆绑的Open MPI?" 页面,它没有解决错误.
make -j 4 2>&1 | tee make.out
[ lots of output ]
make[2]: *** [mpi/man/man3/MPI_Comm_disconnect.3] Error 127
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive] Error 1
Run Code Online (Sandbox Code Playgroud)
我现在很困惑,我不知道该怎么办.
我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现.我的一个主要考虑因素是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心的是我没有调用它MPI直接导致Rust程序出现性能问题.
在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西.
我有一个使用多处理模块编写的python脚本,以便更快地执行.计算是令人尴尬的并行,因此效率随着处理器的数量而变化.现在,我想在MPI程序中使用它,该程序管理跨多台计算机的MCMC计算.此代码调用system()来调用python脚本.但是,我发现当它以这种方式调用时,使用python多处理的效率提升就会消失.
当从MPI调用时,如何让我的python脚本保持多处理的速度增益?
这是一个简单的例子,它类似于我想要使用的更复杂的代码,但显示相同的一般行为.我写了一个名为junk.py的可执行python脚本.
#!/usr/bin/python
import multiprocessing
import numpy as np
nproc = 3
nlen = 100000
def f(x):
print x
v = np.arange(nlen)
result = 0.
for i, y in enumerate(v):
result += (x+v[i:]).sum()
return result
def foo():
pool = multiprocessing.Pool(processes=nproc)
xlist = range(2,2+nproc)
print xlist
result = pool.map(f, xlist)
print result
if __name__ == '__main__':
foo()
Run Code Online (Sandbox Code Playgroud)
当我自己从shell运行它时,使用"top"我可以看到三个python进程,每个进程在我的16核机器上占用100%的cpu.
node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults …Run Code Online (Sandbox Code Playgroud) 我正在研究一种模拟波浪能转换器的工具,我需要将两个软件包相互耦合.一个程序用Fortran编写,另一个用C++编写.我需要在每个时间步骤将Fortran程序中的信息发送到C++程序.但是,在将数据发送到C++程序之前,首先需要在Python中处理数据.我收到了一条使用MPI在程序之间传输数据的提示.
我现在正在尝试从Fortran代码向Python发送一个简单的字符串,但Python代码卡在receive命令中.
我的Fortran代码如下所示:
USE GlobalVariables
USE MPI
IMPLICIT NONE
CHARACTER(LEN=10):: astring
INTEGER :: comm, rank, size, mpierr
! Initialize MPI on first timestep
IF(tstep .LT. 2) THEN
call MPI_INIT(mpierr)
ENDIF
! make string to send to python
astring = "TEST"
! MPI Test
call MPI_Comm_size(MPI_COMM_WORLD, size, mpierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, mpierr)
! Send message to python
CALL MPI_SEND(astring, len(astring), MPI_CHARACTER, 0, 22, MPI_COMM_WORLD, mpierr)
print *, 'MPI MESSAGE SENT ', mpierr
! Initialize MPI on first timestep
IF(tstep .EQ. Nsteps-1) …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种在我的Mac上使用mpi的方法,但一切都非常先进.
我已经成功安装了open-mpi
brew install open-mpi
Run Code Online (Sandbox Code Playgroud)
我有.c文件准备编译和运行.当我输入:
mpicc -o <file> <file.c>
Run Code Online (Sandbox Code Playgroud)
其次是
mpirun <file>
Run Code Online (Sandbox Code Playgroud)
我明白了
[xxxxx-MacBook-Pro.local:13623] [[44919,0],0] ORTE_ERROR_LOG:文件中的错误参数/ pmix/pmix_server.c第262行
[xxxxx-MacBook-Pro.local:13623] [[44919] ,0],0] ORTE_ERROR_LOG:第666行文件ess_hnp_module.c中的错误参数看起来orte_init由于某种原因失败了; 你的并行过程很可能会中止.在orte_init期间,并行进程可能会失败的原因有很多; 其中一些是由于配置或环境问题.这种失败似乎是内部失败; 这里有一些额外的信息(可能只与Open MPI开发人员有关):
pmix server init failed
- >返回值Bad参数(-5)而不是ORTE_SUCCESS
我输入时也会收到相同的消息:
mpirun -np 2 <file>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?