FORTRAN
zhuliting
喜欢简单,安静……
展开
-
FORTRAN的数组-笔记
FORTRAN中的数组是按“列元素优化”的规则进行存储的。C语言中的数组则是按照“行元素优先”的原则进行存储,并且C语言中数组的下标下界固定是从0开始的。在FORTRAN中,使用DO循环进行高效数组操作的代码写法,可能是在C语言中恰恰是最低效的。 FORTRAN读取文件时,逐行读取文件内容,然后在内存中按列存储。原创 2011-03-17 11:46:00 · 3608 阅读 · 0 评论 -
MPI_ALLreduce函数
此函数和MPI_Reduce的意思相同,只是最后结果在所有的进程中。相当于先做MPI_Reduce,然后再做MPI_Scatter. program main include "mpif.h" integer max0, max1, myid, ierr call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) max0 = m原创 2011-05-11 10:01:00 · 10968 阅读 · 1 评论 -
用PAPI测试高速缓存命中率和TLB缺失率
program papitest implicit none#include "f90papi.h" integer, parameter::N = 5000 integer x(N,N),y(N,N),z(N,N)原创 2011-07-29 19:13:33 · 3511 阅读 · 4 评论 -
relocation truncated to fit: R_X86_64_PC32
/home_soft/soft/x86_64/compiler/intel/11.0/081/lib/intel64/libifcore.a(for_diags_intel.o): In function `for__message_catalog_close':for_dia原创 2011-09-02 22:12:34 · 7581 阅读 · 0 评论 -
不执行任何任务的进程,有时也不可或缺
又一次相信存在即是合理的!超算中心的x64_blades刀片部分作业队列限制CPU核心数必须大于70,而当我需要10-70个核的时候,不能直接提交作业,于是。。。于是。。。原来空闲的进程也是有它的作用的,正如某些xxxx,这个社会太邪恶了。。。下面的程序会有所启发 pro原创 2011-07-11 19:19:30 · 869 阅读 · 0 评论 -
MPI_Isend()函数会出现内存耗尽的情况吗
MPI_Isend()函数会出现内存耗尽的情况吗?如何避免呢?考虑到通讯和计算叠加,除了MPI_Isend()之外,有没有其它更好用的函数?我写了如下一段代码测试,在一台4GB的机器上开两个进程,进程1频繁向进程0发送数据,非阻塞通讯,正常结束。结果表明,仅仅是M原创 2011-07-13 11:09:15 · 2186 阅读 · 0 评论 -
Fatal error in MPI_Isend: Internal MPI error!, error stack:
程序调用非阻塞通信函数MPI_Isend(), MPI_Irecv(),接收时有MPI_wait()操作迭代到第5000多次时出现如下错误: 5280 -1.272734378291617E-004 1.271885446338949E-004原创 2011-07-11 13:15:14 · 4428 阅读 · 1 评论 -
循环的计算域划分
假设计算域为[kb, ke],将之分给p个进程,每个进程分到的计算域为[mykb, myke]。 !The iterations are divided into p parts, where p is the number of processors !Written by Albert 2011.7.11 program stagprojection原创 2011-07-20 21:36:46 · 905 阅读 · 0 评论 -
MPI调试--出错信息整理
如果是用FORTRAN写程序,建议加上implicit none,特别是代码比较多时,可以检查出编译过程中的很多问题。1、[root@c0108 parallel]# mpiexec -n 5 ./simpleaborting job:Fatal error in MPI_Irecv: Invalid rank, error stack:MPI_Irecv(原创 2011-06-18 18:29:00 · 26721 阅读 · 1 评论 -
在FORTRAN程序中使用shell命令
原来FORTRAN语言中,也可以使用linux的shell命令,长见识了 program test call system('echo "world" > a.txt') call system('echo "hello" > b.txt') call system('cat a.txt >> b.txt')原创 2012-04-29 11:55:39 · 9209 阅读 · 0 评论 -
MPI程序调试--笔记
有一个不优美但实用的方法,就是在程序中添加如下一段代码: tmp = 0do while(tmp.eq.0)call sleep(2)enddo 其功能就相当于插入一个断点,在MPI程序调试中,还可以用来判断该断点之前的程序是否出现导致程序崩溃退出的错误,个人觉得很好用。[root@c0109 zlt]# cat hello.F program hello implic原创 2011-06-19 09:03:00 · 4802 阅读 · 0 评论 -
FORTRAN “ multiple definition of `MAIN__'”
编译FORTRAN程序时,出现错误信息:“ multiple definition of `MAIN__” [root@c0108 parallel]# mpif90 -o simple stagsimple.F solveuss.F solvevss.F solvewss.F ppoisson.F tdma.F/tmp/ccMt8rzo.o: In function `M原创 2011-06-18 14:57:00 · 4458 阅读 · 0 评论 -
三维数组在内存的中的存储结构
在FORTRAN中,数组在内存中是按列连续存储的;一个数组在内存中也是连续的。对一个三维数组array(x, y, z)来说,x ,y, z分别表示的数组的行、列、页标,在内存中按列连续存储,每一个页面上的元素在内存中的地址也是连续的。 目前的计算机硬件体系结构决定了在读取大批量数据时,如果这一批数据都位于监控的内存中,读取操作会执行的较快。因此,在特定的情况下,我们可能通过程序的执行时间,来验证数组的在内存的中的存储结构。 module variable in原创 2011-05-08 12:10:00 · 13455 阅读 · 0 评论 -
FORTRAN 中的goto/exit/cycle
1,gotogoto 在Fortran77中就流传下来了,它提供一个任意跳跃到所赋值行代码的位置,如果是在一个do 循环中如do 30 i=1,N if(……) goto 3030 continue 上语句的意思就是如果符合if里的条件,则会进行下一次循环。2,pausepause的功能就能跟它的字面意思相同,程序执行到pause 时,会暂停执行,直到用户按下Enter键才会继续执行。3. continuecontinue这个命令没有实际的用途,它的功能就是 继续向下执行程序4,stop它可用来结束程原创 2011-05-10 19:15:00 · 21975 阅读 · 0 评论 -
MPI + FORTRAN 非阻塞通信交换数组边界测试程序
我写了个测试程序,一维情况下是正确的,功能如下:1、每个进程初始化一个数组,全部赋值为进程的IDk号:arr(i) = myid;2、然后各进程将数组的计算域均分,每个进程的计算域为[dp(myid),dp(myid+1)),左闭右开;3、相邻进程,交换数组的边界,采用非阻塞通信方式;4、输出自已计算域内的数组元素; program main! implicit none include 'mpif.h' integer, parameter::imax = 1, jmax = 1, kmax原创 2011-05-12 16:41:00 · 2593 阅读 · 0 评论 -
MPI_gather/MPI_gatherv测试
每个进程上都有一组数据,将它们收集到进程编号为root的进程中,并按进程编号的顺序存放 pragram gather include 'mpif.h' integer maxbuf, len, mp integer,parameter::maxbuf = 200, len = 10, mp = 5 integer myid, p, mycomm, ierr, root, ia(len), iga(maxbuf), & i, displs(mp), counts(mp)原创 2011-05-18 12:51:00 · 7417 阅读 · 0 评论 -
FORTRAN 函数子程序 求二维数组主对角元素和
program main integer,parameter::imax = 4, jmax = 5, N = imax*jmax integer i,j real arr(N) do i = 1, N arr(i) = i enddo do i = 1, imax do j = i, N, imax原创 2011-05-19 14:28:00 · 3345 阅读 · 0 评论 -
MPI + FORTRAN 数据的收集测试
1、将一个三维数组ufew的计算域[ib:ie, jb:je, kb:ke]沿K方向分段,各进程均分计算域,然后对各自计算域内的部分数组赋值。2、最后一个进程,收集各个计算域的值,最后输出,消息传递采用标准的阻塞式通信。3、本程序中,每个进程都拥有完整的数组ufew。 program main implicit none include 'mpif.h' integer i,j,k,nn integer ib,ie,jb,je,kb,ke integ原创 2011-05-21 20:47:00 · 9673 阅读 · 0 评论 -
MPI + FORTRAN 的子例行子程序测试
用MPI实现一个简单的标准发送接收操作,如下,0进程将一个数据发送给1号进程,1号进程接收从0进程发送的数据。 program main implicit none include mpif.h integer myid, ierr,status(MPI_STATUS_SIZE) real(kind=8) i, j i = 3.14159 j = 4.22222原创 2011-06-17 22:05:00 · 12684 阅读 · 0 评论 -
编译FORTRAN程序提示:“编译器内部错误:段错误 请提交一份完整的错误报告”
[root@c0108 parallel]# mpif90 -o simple stagsimple.F solveuss.F solvevss.F solvewss.F ppoisson.F tdma.F 在文件 tdma.F:43 call CarculateBlock(i,MIN(i+tx,ie),j,MIN(j+ty,je),k,原创 2011-06-18 09:12:00 · 3686 阅读 · 0 评论 -
Jacobi迭代并行算法
Jacobi迭代是一种常见的迭代方法,迭代得到的新值是原来旧值点相邻数据点的平均。串行程序片段如下: 并行化方法之一,可以考虑按列划分,边界点新值的计算需要相邻边界其它块的数据,所以在划分后,每一个数据块的两边各增加一列,用于存放通信得到的数据。如下图: program main implicit none includ原创 2012-03-23 14:57:31 · 10503 阅读 · 9 评论