标签: mpi

通过MPI发送和接收2D阵列

我想解决的问题如下:

我已经在大型2D矩阵中计算了C++序列码.为了优化这个过程,我希望拆分这个大的2D矩阵并使用MPI在4个节点上运行.节点之间发生的唯一通信是在每个时间步的末尾共享边缘值.每个节点与其邻居共享边缘阵列数据A [i] [j].

根据有关MPI的阅读,我有以下方案要实施.

if (myrank == 0)
{
 for (i= 0 to x)
 for (y= 0 to y)
 {
  C++ CODE IMPLEMENTATION 
  .... 
  MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1.....)
  MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1.....)
  MPI_BARRIER
}

if (myrank == 1)
{
for (i = x+1 to xx)
for (y = 0 to y)
{
 C++ CODE IMPLEMENTATION
 ....
 MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0.....)
 MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1.....)
 MPI BARRIER
}
Run Code Online (Sandbox Code Playgroud)

我想知道我的方法是否正确,并且也希望其他MPI函数的任何指导也可以用于实现.

谢谢,阿什温.

c++ 2d mpi multidimensional-array

21
推荐指数
1
解决办法
4万
查看次数

如何将stdin从文件传输到Xcode 4+中的可执行文件?

我有一个mpi程序,并设法通过Xcode 4编译和链接它.现在我想使用Xcode 4进行调试.

如何从文件中将标准输入传递给程序?

在终端我会输入

mpirun -np 2 program < input.txt
Run Code Online (Sandbox Code Playgroud)

我能够在Scheme编辑器的"Info"面板中运行定义自定义可执行文件(mpirun)的程序,我也知道我可以在"Arguments"面板中传递参数.但是Xcode 4似乎不接受"<input.txt"作为参数,即使我选中"使用自定义工作目录"+在"选项"面板中添加输入脚本的正确目录.

这篇文章说可以使用"<input.txt"作为参数,但我猜这在Xcode 2或Xcode 3中有效,但它似乎不再适用于Xcode 4.

macos mpi xcode4

21
推荐指数
1
解决办法
8863
查看次数

共享内存,MPI和排队系统

我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被分割为N cpus,并且每个块都是并行执行,非常高效,非常好的速度缩放,工作正确完成.

但是在每个过程中都会重复一些数据,并且由于技术原因,这些数据不能轻易地通过MPI(...)进行分割.例如:

  • 5 Gb的静态数据,为每个进程加载完全相同的东西
  • 可以在MPI中分发的4 Gb数据,使用的CPU越多,每个CPU的RAM越小.

在4 CPU工作中,这意味着至少有20Gb的RAM负载,大部分内存"浪费",这很糟糕.

我正在考虑使用共享内存来减少总体负载,每台计算机只会加载一次"静态"块.

所以,主要问题是:

  • 是否有任何标准的MPI方式在节点上共享内存? 某种现成的+免费图书馆?

    • 如果没有,我将使用boost.interprocess和使用MPI调用来分发本地共享内存标识符.
    • 共享内存将由每个节点上的"本地主机"读取,并以只读方式共享.不需要任何类型的信号量/同步,因为它不会改变.
  • 任何性能损失或特别问题要警惕?

    • (不会有任何"字符串"或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
  • 该作业将在PBS(或SGE)排队系统中执行,如果进程不干净退出,我想知道这些是否会清理特定于节点的共享内存.

c++ mpi shared-memory pbs boost-interprocess

20
推荐指数
2
解决办法
5408
查看次数

如何在非常大的文本文件上直接有效地访问?

我有一个非常大的文本文件(+ 10GB),我想阅读一些数据挖掘技术.为此,我使用MPI并行技术,因此许多进程可以一起访问同一个文件.
实际上,我希望每个进程读取N行数.由于文件没有结构化(相同数量的字段,但每个字段可以包含不同数量的字符),我有义务解析文件,这是不平行的,需要花费很多时间.有没有办法直接访问特定数量的行,并且需要解析和计算行数?谢谢你的帮助.

c c++ file-io mpi

20
推荐指数
2
解决办法
1327
查看次数

将libc回溯转换为源行号

我有一个MPI应用程序,它结合了C和Fortran源.偶尔它会因为与内存相关的bug而崩溃,但是我无法找到这个bug(它是在别人的代码中的某个地方,目前我还不是很熟悉).我还没有能够用gdb捕获它,但有时会输出glibc backtrace,如下所示.

该错误可能接近"(main_main_ + 0x3bca)[0x804d5ce]",(但有内存错误,我知道情况可能并非如此).我的问题是,有没有人知道如何将+ 0x3bca或0x804d5ce转换为代码的特定行?

关于追踪错误的任何其他建议也将受到赞赏.我非常熟悉gdb的基础知识.

*** glibc detected *** /home/.../src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42]
/lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525]
/home/.../src/finite_element(main_main_+0x3bca)[0x804d5ce]
/home/.../src/finite_element[0x804e195]
/home/.../src/finite_element(main+0x34)[0x804e1e8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3]
/home/davepc/finite-element/src/finite_element[0x8049971]
======= Memory map: ========
08048000-08056000 r-xp 00000000 08:05 1346306    /home/.../src/finite_element
08056000-08057000 r--p 0000d000 08:05 1346306    /home/.../src/finite_element
08057000-08058000 rw-p 0000e000 08:05 1346306    /home/.../src/finite_element
09d1b000-09d8f000 rw-p 00000000 00:00 0          [heap]
b2999000-b699b000 rw-s 00000000 08:03 15855      /tmp/openmpi-sessions-_0/37612/1/shared_mem_pool.babel
b699b000-b6b1d000 rw-p 00000000 00:00 0 
b6b31000-b6b3d000 r-xp 00000000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3d000-b6b3e000 r--p 0000b000 08:03 407798     /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so
b6b3e000-b6b3f000 rw-p …
Run Code Online (Sandbox Code Playgroud)

c debugging fortran gdb mpi

20
推荐指数
1
解决办法
6630
查看次数

使用std :: async创建的线程发送MPI的线程安全性

根据这个网站,使用MPI::COMM_WORLD.Send(...)是线程安全的.但是在我的应用程序中,我经常(并非总是)遇到死锁或出现分段错误.MPI::COMM_WORLD使用a 封闭每个方法调用mutex.lock()mutex.unlock()始终如一地删除死锁以及段错误.

这是我创建线程的方式:

const auto communicator = std::make_shared<Communicator>();
std::vector<std::future<size_t>> handles;
for ( size_t i = 0; i < n; ++i )
{
   handles.push_back(std::async(std::launch::async, foo, communicator));
}
for ( size_t i = 0; i < n; ++i )
{
   handles[i].get();
}
Run Code Online (Sandbox Code Playgroud)

Communicator是一个有std::mutex成员的类,专门调用诸如MPI::COMM_WORLD.Send()和之类的方法MPI::COMM_WORLD.Recv().我没有使用任何其他方法发送/接收MPI.foo采取一个const std::shared_ptr<Commmunicator> &论点.

我的问题:MPI承诺的线程安全性与创建的线程不兼容std::async吗?

c++ multithreading mpi thread-safety c++11

20
推荐指数
1
解决办法
6053
查看次数

ld:对符号'log2 @@ GLIBC_2.2.5'的未定义引用

什么错了

for (level = 1; level <= log2((double)size); level++)
                         ^
Run Code Online (Sandbox Code Playgroud)

看起来像是从使用,log2()但什么是错的?我实际上正在使用它与OpenMPI代码,但注释这一行修复了一些事情.

完整来源(http://pastie.org/7559178)见第40行

[jiewmeng@JM Assign3]$ mpicc -o cpi cpi.c && mpirun -np 16 cpi
/usr/bin/ld: /tmp/cca9x4he.o: undefined reference to symbol 'log2@@GLIBC_2.2.5'
/usr/bin/ld: note: 'log2@@GLIBC_2.2.5' is defined in DSO /usr/lib/libm.so.6 so try adding it to the linker command line
/usr/lib/libm.so.6: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

似乎log2(4)会工作,但我不能传递变量?

c mpi linker-errors

20
推荐指数
1
解决办法
4万
查看次数

使用mpi而不是多处理模块时,python中的并行应用程序变得慢得多

最近,当我使用多处理模块和mpi4py作为通信工具测量并行应用程序的性能时,我观察到了一种奇怪的效果.

该应用程序对数据集执行进化算法.除评估外,大多数操作都是按顺序完成的.在应用所有进化运算符之后,所有个体都需要接收新的适应值,这在评估期间完成.基本上它只是在浮点列表(python之类)上执行的数学计算.在评估之前,数据集由mpi的scatter或python的Pool.map分散,然后进行并行评估,之后数据通过mpi的聚集或Pool.map机制返回.

我的基准平台是运行Ubuntu 11.10的虚拟机(虚拟机),在Core i7(4/8内核)上运行Open MPI 1.4.3,8 GB内存和SSD驱动器.

我发现真正令人惊讶的是,我获得了一个很好的加速,但是根据通信工具,在一定的进程阈值之后,性能变得更糟.它可以通过下面的图片来说明.

y轴 - 处理时间
x轴 - 过程
颜色的nr - 每个个体的大小(浮动的nr)

1)使用多处理模块 - Pool.map 在此输入图像描述

2)使用mpi - Scatter/Gather 在此输入图像描述

3)两张照片在彼此的顶部 在此输入图像描述

起初我认为它是超线程的错误,因为对于大型数据集,它在达到4个进程(4个物理内核)后变得更慢.但是它应该在多处理情况下也可见,而事实并非如此.我的另一个猜测是mpi通信方法比python方法效果差得多,但我发现很难相信.

有没有人对这些结果有任何解释?

添加:

毕竟我开始相信这是超线程故障.我在具有核心i5(2/4核心)的机器上测试了我的代码,并且在3个或更多进程中性能更差.我想到的唯一解释是,我使用的i7没有足够的资源(缓存?)来与超线程同时计算评估,需要安排4个以上的进程在4个物理内核上运行.

然而有趣的是,当我使用mpi htop显示完全利用所有8个逻辑核心时,这应该表明上述语句是不正确的.另一方面,当我使用Pool.Map时,它并没有完全利用所有核心.它使用一个或2个最大值而其余部分仅使用部分,再次不知道它为什么会这样.明天我将附上显示此行为的屏幕截图.

我没有在代码中做任何花哨的东西,它真的很简单(我不是因为它的秘密,而是因为它需要安装DEAP之类的其他库而不是给出整个代码.如果有人真的对这个问题感兴趣并准备好了安装DEAP我可以准备一个简短的例子).MPI的代码有点不同,因为它无法处理填充容器(从列表继承).当然有一些开销,但没什么大不了的.除了我在下面显示的代码,其余部分是相同的.

Pool.map:

def eval_population(func, pop):
    for ind in pop:
        ind.fitness.values = func(ind)

    return pop

# ...
self.pool = Pool(8)
# ...

for iter_ in xrange(nr_of_generations):
    # ...
    self.pool.map(evaluate, pop) # evaluate is really an eval_population alias with a certain function assigned to its first argument.
    # ...
Run Code Online (Sandbox Code Playgroud)

MPI - …

python mpi multiprocessing evolutionary-algorithm

20
推荐指数
1
解决办法
2441
查看次数

openacc vs openmp&mpi的区别?

我想知道openacc和openmp之间的主要区别是什么.MPI,cuda和opencl怎么样?我理解openmp和mpi之间的区别,特别是关于共享和分布式内存的部分它们是否允许混合gpu-cpu处理设置?

cuda mpi openmp opencl openacc

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

安装mpi4py时出错

我正在尝试使用pip install mpi4py安装mpi4py,但是我收到以下错误:

error: Cannot find 'mpi.h' header. Check your configuration!!!
Run Code Online (Sandbox Code Playgroud)

在我之前的同一错误报告中,

clang: error: linker command failed with exit code 1 (use -v to see    invocation)
Run Code Online (Sandbox Code Playgroud)

问题可能是什么?

谢谢!

python macos installation mpi

20
推荐指数
5
解决办法
2万
查看次数