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

大规模的程序可能要注意的地方
最近在调试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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值