大规模的程序可能要注意的地方
2016-07-19 02:18
417 查看
大规模的程序可能要注意的地方
最近在调试AWP大规模程序时,至少学习到以下几点:
有个叫ulimit的Linux命令可以解决一些这方面的问题。
MPI_Aint 是MPI中64bit的整形,用来保存地址,如同long long int。
在c中的测试结果就是: t1,t2 OK, t3, t4 Error。
以下是Fortran有对应例子,好像也有这个问题,但是我还不知道如何在Fortran中正确的写法。(该问题已经在Dawei Mu的帮助下修正了。)
./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
但是测试输出14745大小时,也花费了1h,真是没有明白怎么回事?
最近在调试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
- 星际地图制作中OB无建筑 退出问题
- 使用WebRTC搭建前端视频聊天室——入门篇
- 单主机部署LAMP
- Android安全:如何逆向分析Android程序
- CCNA_ VTP、VLAN和单臂路由配置
- Flux 普及读本
- leetcode 375. Guess Number Higher or Lower II 解题小结
- iOS页面间传值的一些方式总结
- Leetcode 334. Increasing Triplet Subsequence (Python)
- 大话C/C++语言自增(++)自减(--)运算符
- 多种方式实现lamp
- linux下安装jdk及Intellij IDEA
- Maven总结(二)Maven构建可执行的jar包并且包含依赖jar包
- http指令以及https的练习
- 多种方式实现lamp
- Leetcode 300 Longest Increasing Subsequence(Python)
- django的url()用法总结
- Palindrome Numbers(UVALive 2889)
- EC 经验