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

来源:互联网 发布:儿童汉语拼音拼读软件 编辑:程序博客网 时间:2024/06/15 04:04

大规模的程序可能要注意的地方
最近在调试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,真是没有明白怎么回事?

0 0
原创粉丝点击