关于MPI里面的SEND函数

shawn102 2007-05-30 05:34:01
请问SEND函数对信息量大小有没有要求,会不会有个上限?
我测试的一个矩阵相乘的MPI程序(cannon),小于500维用4个进程顺利完成,但超过500维程序就会象死掉一样,不知道是不是这个原因,大家有碰到过嘛?
...全文
1392 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
shawn102 2007-06-11
  • 打赏
  • 举报
回复
默认的缓冲区大小可以在 mpich/mpid/ch_p4/p4/;ob/p4_sock_util.h中的(SOCK_BUFF_SIZE)中改写环境变量P4_SOCKBUFSIZE,或者也可以通过命令行, -p4sctrl bufsize=64。

我这边的环境是mpich/gnu/lib.但里面也没有你说的那个p4_sock_util.h头文件,另该程序是用了经典的Cannon算法来做矩阵相乘,是附录在陈国良的<并行算法实践>里的,不知道您有没有看过,希望能和您多进行交流,谢谢
shawn102 2007-06-08
  • 打赏
  • 举报
回复
回france8,我MPICH和MPICH2都试过,都出现一样的情形,请问怎么设置缓存区大小?
另外我试过用MPI_Isend 和 MPI_Irecv了,然后用MPI_WAIT来判断,但还是一样,只要超过500维就死掉,而且不提示,非要手动CTRL+C,郁闷啊
DrPerformance 2007-06-08
  • 打赏
  • 举报
回复
是 mpich/mpid/ch_p4/p4/lib/p4_sock_util.h
DrPerformance 2007-06-08
  • 打赏
  • 举报
回复

另外你的程序算法是不是可以再优化优化,看看是不是可以避免这么大范围地交换数据。
我们过去做几十万阶矩阵运算,也没有遇到过消息缓冲不够的情况。
DrPerformance 2007-06-08
  • 打赏
  • 举报
回复

对于Lam-mpi默认的buffer size是64k。对于ch_p4,MPICH默认的socket buffer size是16k。
默认的缓冲区大小可以在 mpich/mpid/ch_p4/p4/;ob/p4_sock_util.h中的(SOCK_BUFF_SIZE)中改写环境变量P4_SOCKBUFSIZE,或者也可以通过命令行, -p4sctrl bufsize=64。
更详细的选项和细节可以参看MPICH User'manual的 socket read/write operations章节。
DrPerformance 2007-06-07
  • 打赏
  • 举报
回复
消息缓冲区是MPI致命的缺陷,缓冲区大小应该是可以设定的,要看你用的哪个MPI实现,MPICH, MPICH2 还是Lam-mpi?
MPI_Isend 和 MPI_Irecv都是非锁定通信,也就是不只要自己发出去(或者接收)就好了,不管是否进入缓冲区,也不管对象是否收到。通常有些语句不会出现歧义的,就可以很好用它。但是会造成歧义的最好还是用通常的MPI_send,MPI_recv。
详细可见黄铠和徐志伟老师的著作《并行体系结构》。
shawn102 2007-06-07
  • 打赏
  • 举报
回复
回france8,这个信息缓存能自己调整大小吗?另你说的MPI_Irecv是一种阻塞的发送方式,怎么能确定发送完成呢?谢谢你的帮助
shawn102 2007-06-07
  • 打赏
  • 举报
回复
回INTELSUPPORT,你说的mpi_send有上限通过环境变量来调是什么意思?是指P4_GLOBALMEMSIZE吗?请不吝赐教。
DrPerformance 2007-06-06
  • 打赏
  • 举报
回复
显然的问题是MPI是依赖消息缓存的,如果消息量大于缓存接收能力就会出问题,你可以把接收语句变成MPI_Irecv试一试,非锁定的接收。发送也可以用MPI_Isend。当然这样带来的后果就有可能造成内存数据不一致,你最好检查依赖关系。
IntelSupport 2007-06-05
  • 打赏
  • 举报
回复
如果 mpi_send 有默认上限, 应该可以用环境编量来调节上限。
flyingdog 2007-05-31
  • 打赏
  • 举报
回复
似乎没有限制。我碰到过的1M以上的数据量没有问题。
要么你先查查程序是停在什么地方了。
shawn102 2007-05-31
  • 打赏
  • 举报
回复
*函数名:main_shift
*功能:分块矩阵左移和上移,并计算分块c
*/
void main_shift()
{
int i,j,k,l;

for(l=0; l<sp; l++)
{
/*矩阵块相乘,c+=a*b */
for(i=0; i<dl; i++)
for(j=0; j<dl; j++)
for(k=0; k<dl; k++)
c[i*dl+j] += a[i*dl+k]*b[k*dl+j];

/* 将分块a左移1位 */
MPI_Send(a , dl2, MPI_FLOAT, get_index(my_row, my_col-1, sp), 1, MPI_COMM_WORLD);
MPI_Recv(a , dl2, MPI_FLOAT, get_index(my_row, my_col+1, sp), 1, MPI_COMM_WORLD, &status);

/* 将分块b上移1位 */
MPI_Send(b , dl2, MPI_FLOAT, get_index(my_row-1, my_col, sp), 1, MPI_COMM_WORLD);
MPI_Recv(b , dl2, MPI_FLOAT, get_index(my_row+1, my_col, sp), 1, MPI_COMM_WORLD, &status);
}
}


停在这个函数上,不知道哪里出错了,但我把进程数-NP从4进程改到9进程,程序又能跑了,但到了700维又不行...

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧