我想解决的问题如下:
我已经在大型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函数的任何指导也可以用于实现.
谢谢,阿什温.
我有一个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.
我的unix/windows C++应用程序已经使用MPI进行了并行化:作业被分割为N cpus,并且每个块都是并行执行,非常高效,非常好的速度缩放,工作正确完成.
但是在每个过程中都会重复一些数据,并且由于技术原因,这些数据不能轻易地通过MPI(...)进行分割.例如:
在4 CPU工作中,这意味着至少有20Gb的RAM负载,大部分内存"浪费",这很糟糕.
我正在考虑使用共享内存来减少总体负载,每台计算机只会加载一次"静态"块.
所以,主要问题是:
是否有任何标准的MPI方式在节点上共享内存? 某种现成的+免费图书馆?
boost.interprocess
和使用MPI调用来分发本地共享内存标识符.任何性能损失或特别问题要警惕?
该作业将在PBS(或SGE)排队系统中执行,如果进程不干净退出,我想知道这些是否会清理特定于节点的共享内存.
我有一个非常大的文本文件(+ 10GB),我想阅读一些数据挖掘技术.为此,我使用MPI并行技术,因此许多进程可以一起访问同一个文件.
实际上,我希望每个进程读取N行数.由于文件没有结构化(相同数量的字段,但每个字段可以包含不同数量的字符),我有义务解析文件,这是不平行的,需要花费很多时间.有没有办法直接访问特定数量的行,并且需要解析和计算行数?谢谢你的帮助.
我有一个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) 根据这个网站,使用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
吗?
什么错了
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)
会工作,但我不能传递变量?
最近,当我使用多处理模块和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 - …
我想知道openacc和openmp之间的主要区别是什么.MPI,cuda和opencl怎么样?我理解openmp和mpi之间的区别,特别是关于共享和分布式内存的部分它们是否允许混合gpu-cpu处理设置?
我正在尝试使用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)
问题可能是什么?
谢谢!