标签: mpi

用于生成素数的并行算法(可能使用Hadoop的map reduce)

生成素数是一个玩具问题,我经常不时尝试,特别是在尝试新的编程语言,平台或风格时.

我正在考虑尝试使用Hadoop(Map Reduce)编写素数生成算法或素数测试算法.

我想我会发布这个问题,以获得提示,参考,算法,方法.

虽然我的主要兴趣是基于Map Reduce的算法,但我不介意查看新的Hadoop编程模型或者例如查看使用PiCloud

我在Prime数字生成中似乎有一些有趣的问题:这里,这里这里,但没有任何与Parallel方法相关的问题引起了我的注意.

提前致谢.

parallel-processing primes hadoop mpi number-theory

14
推荐指数
1
解决办法
6829
查看次数

了解来自多个进程的并发文件写入

从这里:文件是否在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)

c unix file-io operating-system mpi

14
推荐指数
3
解决办法
1万
查看次数

如何以便携方式保留Fortran MPI程序的精度?

我有一个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_REALMPI_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)

precision fortran mpi

14
推荐指数
2
解决办法
1939
查看次数

MPI分区矩阵成块

我想将矩阵分区为块(而不是条带),然后使用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)

c scatter matrix mpi

13
推荐指数
1
解决办法
2万
查看次数

MPI流程是如何开始的?

使用mpirun或启动MPI作业时mpiexec,我可以理解如何开始每个单独的过程.但是,如果没有任何编译器魔法,这些包装器可执行文件如何将安排(MPI通信器)传达给MPI进程?

我对细节很感兴趣,或者对指向何处的指针感兴趣.

mpi

13
推荐指数
1
解决办法
1284
查看次数

在制作CUDA 5.0样本时遇到与MPI相关的问题(Mac OS X ML)

当我尝试制作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)

我现在很困惑,我不知道该怎么办.

macos cuda makefile mpi openmpi

13
推荐指数
3
解决办法
5220
查看次数

网格计算上的锈

我正在寻找为我的研究创建一些小型生物信息学程序的Rust实现.我的一个主要考虑因素是性能,虽然我知道我可以安排Rust程序在qsub的网格上运行 - 我可以访问的集群使用Oracle的GridEngine - 我担心的是我没有调用它MPI直接导致Rust程序出现性能问题.

在不使用MPI库的情况下安排程序会大大降低性能吗?我应该在Rust中使用MPI库吗?如果是这样,Rust是否有任何已知的MPI库?我找了一个,但我没找到任何东西.

mpi grid-computing rust

13
推荐指数
1
解决办法
3296
查看次数

mpi中的Python多处理

我有一个使用多处理模块编写的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)

python mpi multiprocessing

13
推荐指数
1
解决办法
6122
查看次数

是否可以使用MPI将数据从Fortran程序发送到Python?

我正在研究一种模拟波浪能转换器的工具,我需要将两个软件包相互耦合.一个程序用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)

python fortran mpi openmpi

13
推荐指数
3
解决办法
861
查看次数

如何在Mac OS X上使用mpi

我一直在寻找一种在我的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)

我究竟做错了什么?

macos install mpi

13
推荐指数
4
解决办法
2万
查看次数