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

本文总结了在调试大规模程序时需要注意的关键点,包括避免直接定义大数组以防止内存溢出,进行long long int计算时需注意类型转换,以及发现MPI-IO输出速度较慢等问题。

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

### 大规模集群中的可再生能源实施与架构 在过去的几十年里,全球的数据中心数量和规模显著增加。这些数据中心不仅需要大量的物理资源来构建,而且其能源需求也非常庞大。为了减少对化石燃料的依赖并降低碳排放,一些大型科技公司如苹果和谷歌已经开始考虑将部分数据中心建立在靠近可再生资源的地方[^1]。 #### 技术实现 对于大规模集群而言,采用可再生能源的技术实现主要集中在以下几个方面: - **电源管理优化**:通过改进硬件设计以及软件算法提高能效比,从而更有效地利用来自太阳能板或风力发电机产生的电力。 - **储能解决方案**:由于自然条件的变化使得可再生能源供应不稳定,因此有效的能量存储机制变得至关重要。这可能涉及到电池组或者其他形式的能量储存设备的应用程序开发。 ```python def optimize_power_usage(current_load, available_renewable_energy): """ Optimize power usage based on current load and available renewable energy. :param current_load: Current system load :param available_renewable_energy: Available renewable energy from sources like solar or wind :return: Optimized power distribution plan """ if current_load <= available_renewable_energy: return "Use only renewable energy" else: additional_needed = current_load - available_renewable_energy return f"Use {available_renewable_energy} units of renewable energy and supplement with {additional_needed} units from grid" print(optimize_power_usage(80, 50)) ``` #### 架构设计 当规划基于可再生能源的大规模计算环境时,合理的架构设计同样不可或缺。这种设计通常会考虑到地理位置的选择、网络连接的质量等因素,并试图找到最佳平衡点以最大化性能的同时最小化能耗影响。 - **分布式部署策略**:根据不同地区的气候特点合理布局服务器节点位置,以便更好地获取当地丰富的自然资源作为动力源;同时也要注意各站点之间的高效通信链路建设。 - **模块化设计理念**:整个系统被划分为多个独立但又相互关联的小型单元,在不影响整体运作的前提下可以灵活调整各个组件的工作状态(开启/关闭),以此响应实时变化的需求情况。 #### 案例研究 尽管目前还存在诸多工程和技术上的挑战,但是已经有一些成功的尝试正在逐步形成完整的方案框架。例如某些企业已经在探索如何整合不同类型的模型来进行更加精准高效的预测分析工作,这对于未来进一步推动该领域的发展具有重要意义[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值