我想解决的问题如下:
我已经在大型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作业:mpirun -np处理器编号文件名
我的理解是,以上命令使我可以提交给4个通过MPI进行通信的独立处理器。但是,在我们的设置中,每个处理器都有4个未使用的内核。我的问题如下:
是否可以通过MPI run命令行提交要在同一节点或多个节点上的多个内核上运行的作业?如果可以,怎么办?
以上要求在代码中进行任何特殊注释/设置吗?通过阅读一些文献,我确实了解到内核之间的通信时间可能与处理器之间的通信时间不同,因此确实需要对问题的分布方式进行一些思考……但是对于该问题呢?还需要估算什么?
最后,传输的数据量是否有限制?总线可以发送/接收多少数据是否有限制?缓存有限制吗?
谢谢!
我试图在4个节点上运行一个简单的MPI程序.我正在使用在Centos 5.5上运行的OpenMPI 1.4.3.当我使用hostfile/machinefile提交MPIRUN命令时,我没有输出,接收空白屏幕.因此,我必须杀死这份工作..
我使用以下运行命令:: mpirun --hostfile hostfile -np 4 new46
OUTPUT ON KILLING JOB:
mpirun: killing job...
--------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process that caused
that situation.
--------------------------------------------------------------------------
mpirun was unable to cleanly terminate the daemons on the nodes shown
below. Additional manual cleanup may be required - please refer to
the "orte-clean" tool for assistance.
--------------------------------------------------------------------------
myocyte46 - daemon did not report back when launched
myocyte47 - daemon …
Run Code Online (Sandbox Code Playgroud) 作为一名初学C/C++程序员,我不得不花费几个小时,试图破译下面的代码:有人可以一行一步地走我(通过以下代码进行动态内存分配).
char **alloc_2d_char(const int rows, const int cols)
{
char *data = (char *)malloc(rows*cols*sizeof(char));
char **array= (char **)malloc(rows*sizeof(char*));
for (int i=0; i<rows; i++)
array[i] = &(data[cols*i]);
return array;
}
Run Code Online (Sandbox Code Playgroud)
指针的指针是从指针到数组分开解释的.我已经能够从各种来源获得部分信息,但没有一个能够内聚地缝合线条.
我正在尝试解决MPI_Irecv中的致命错误:中止作业并收到对该查询的混合(有用但不完整)响应.
该错误消息是以下内容:
aborting job:
> Fatal error in MPI_Irecv: Other MPI
> error, error stack: MPI_Irecv(143):
> MPI_Irecv(buf=0x8294a60, count=48,
> MPI_DOUBLE, src=2, tag=-1,
> MPI_COMM_WORLD, request=0xffffd6ac)
> failed MPID_Irecv(64): Out of
> memory
Run Code Online (Sandbox Code Playgroud)
我正在寻求某人的帮助来回答这些问题(我需要指导以帮助调试和解决此死锁)
在"MPI非阻塞发送和接收"结束时,发送/接收完成后是自己释放的内存还是必须强制释放它?
如果我使用"多核心"而不是单核心,会解决"内存不足"的问题吗?我们目前有4个处理器到1个核心,我使用以下命令提交我的工作:mpirun -np 4.我尝试使用mpirun n -4但它仍然在同一个核心上运行了4个线程.
我如何计算出我的程序需要多少"共享内存"?
MPI_ISend/MPI_IRecv在我的代码中的递归循环内部,因此如果错误源位于那里则不太清楚(如果我只使用一次或两次发送/接收命令,系统计算就好了没有"内存不足问题"如果是这样,如何检查和减轻此类信息?
#include <mpi.h>
#define Rows 48
double *A = new double[Rows];
double *AA = new double[Rows];
....
....
int main (int argc, char *argv[])
{
MPI_Status status[8];
MPI_Request request[8];
MPI_Init (&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, …
Run Code Online (Sandbox Code Playgroud) 当我尝试在四个处理器上运行问题时收到以下错误序列。我使用的 MPI 命令是 mpirun -np 4
我很抱歉按原样发布错误消息(主要是由于缺乏破译所给信息的知识)。感谢您对以下内容的投入:
错误信息是什么意思?什么时候收到?是因为系统内存(硬件)还是因为通信错误(与 MPI_Isend/Irecv 相关的东西?,即软件问题)。
最后,我该如何解决这个问题?
谢谢!
收到的错误消息如下: - - *请注意:仅当时间很大时才会收到此错误*。 当计算数据所需的时间很小时(即 300 个时间步长与 1000 个时间步长相比),代码计算得很好
中止工作:
MPI_Irecv 中的致命错误:其他 MPI 错误,错误堆栈:
MPI_Irecv(143): MPI_Irecv(buf=0x8294a60, count=48, MPI_DOUBLE, src=2, tag=-1, MPI_COMM_WORLD, request=0xffffd68c) 失败
MPID_Irecv(64):内存不足
中止工作:
MPI_Irecv 中的致命错误:其他 MPI 错误,错误堆栈:
MPI_Irecv(143): MPI_Irecv(buf=0x8295080, count=48, MPI_DOUBLE, src=3, tag=-1, MPI_COMM_WORLD, request=0xffffd690) 失败
MPID_Irecv(64):内存不足
中止作业:MPI_Isend 中的致命错误:内部 MPI 错误!,错误堆栈:
MPI_Isend(142): MPI_Isend(buf=0x8295208, count=48, MPI_DOUBLE, dest=3, tag=0, MPI_COMM_WORLD, request=0xffffd678) 失败
(未知)():内部 MPI 错误!
中止作业:MPI_Irecv 中的致命错误:其他 MPI 错误,错误堆栈:
MPI_Irecv(143): MPI_Irecv(buf=0x82959b0, count=48, MPI_DOUBLE, src=2, tag=-1, MPI_COMM_WORLD, …