您的位置:首页 > 其它

大规模的程序可能要注意的地方

2016-07-19 02:18 417 查看
大规模的程序可能要注意的地方

最近在调试AWP大规模程序时,至少学习到以下几点:

1.直接定义大数组是不可行的

这样直接定义大数组,可能会导致stack益处,运行时出现Out of memory, Segment fault,用valgrind检查出现 Access not within mapped region at address。

有个叫ulimit的Linux命令可以解决一些这方面的问题。

int nptotal = 1474560; //orginal
//float buf[nptotal]; //这种申明方式对于大数组来说不是好的方式
//int blocksize[nptotal];
//MPI_Aint tpmap[nptotal];
tpmap = malloc(nptotal * sizeof(MPI_Aint));
buf =   malloc(nptotal * sizeof(float));
blocksize =malloc(nptotal * sizeof(int));
if(tpmap==NULL||buf==NULL||blocksize==NULL)
{
printf("Not enough memory\n");
return -1;
}


2.long long int计算时是需要类型转换的

应该是int计算溢出的问题。

MPI_Aint 是MPI中64bit的整形,用来保存地址,如同long long int。

在c中的测试结果就是: t1,t2 OK, t3, t4 Error。

int nptotal = 1474560; //orginal
int size = 2048, rank = 0;
MPI_Aint t1= ((long long)nptotal*(long long)size+(long long)rank)*(long long)sizeof(float);
MPI_Aint t2= ((long long)nptotal*(long long)size+(long long)rank)*sizeof(float);
int t3= (long long)(nptotal*size+rank)*sizeof(float);
long long int t4= (long long)(nptotal*size+rank)*(long long)sizeof(float);
printf("%d) nptotal:%d,size:%d.\n",rank,nptotal,size);
printf("%d) t1:%lld,t2:%d,%lld, t3:%lld, t4:%lld,%d.\n",rank,t1,t2,t2,t3,t4,t4);


以下是Fortran有对应例子,好像也有这个问题,但是我还不知道如何在Fortran中正确的写法。(该问题已经在Dawei Mu的帮助下修正了。)

!  compile line: mpif90 -fno-range-check fmpitest.f90 -o fmpitest
program hello
include 'mpif.h'
integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
integer(KIND=MPI_ADDRESS_KIND) ::tpmap,pmap

call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
print*, 'node', rank, ': Hello world', MPI_ADDRESS_KIND
rank = 2048
tag = 1474560
tpmap = rank * tag *4
print*, '1   tpmap', tpmap
tpmap = int(rank, 8) * tag *4
print*, '10  tpmap', tpmap
tpmap = int(rank,KIND=MPI_ADDRESS_KIND) * int(tag,KIND=MPI_ADDRESS_KIND) *4
print*, '20  tpmap', tpmap
tpmap = 1
tpmap = tpmap * rank * tag *4
print*, '50  tpmap', tpmap
tpmap = 1
tpmap = tpmap + rank * tag *4
print*, '100 tpmap', tpmap

tpmap = 12079595520
print*, '300 tpmap', tpmap, huge(tpmap)
call MPI_FINALIZE(ierror)

end


./fmpitest

node 0 : Hello world 8

1 tpmap -805306368

10 tpmap 12079595520

20 tpmap 12079595520

50 tpmap 12079595520

100 tpmap -805306367

300 tpmap 12079595520 9223372036854775807

3.MPI-IO输出好像并不是很快

在2048个Cores上输出1474560大小的float数组,运行了4:00:00都都没有完成,我想应该是我的程序有了问题。

但是测试输出14745大小时,也花费了1h,真是没有明白怎么回事?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: