声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2487|回复: 12

[其它软件] fortran计算时cpu,内存

[复制链接]
发表于 2007-5-22 15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我在用fortran计算时前12个小时cpu利用率100%,后面就基本不用cpu,但是计算并没有完成,是怎么回事?我用的是微软的fortran powerstation,for90

[ 本帖最后由 yxb345 于 2007-5-22 15:38 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-5-22 16:17 | 显示全部楼层
贴程序看看
 楼主| 发表于 2007-5-22 16:31 | 显示全部楼层
real K(1:8922,1:8922),a(1:89103,1:3)
  open(unit=1,file='filestiffness.txt',status='old')
  open(unit=2,file='kk.txt',status='new')
        read(1,*)((a(i,j),j=1,3),i=1,89103)
        do 10 i=1,8922
            do 20 j=1,8922
               do 30 n=1,89103
                   if (a(n,1).eq.i.and.a(n,2).eq.j) then
                             K(i,j)=a(n,3)
       end if
30      continue
20      continue
10      continue
!100     format(1x,8922(e19.12,1x))
  write(2,*) ((K(i,j),j=1,8922),i=1,8922)
        end


这个程序的功能是将数组a的第一列和第二列作为行号和列号给第三列在k中定位.
filestiffness.txt内容如下:
10   9   2558
6    4    5285
3    3  5582
…………
……………

[ 本帖最后由 yxb345 于 2007-5-22 16:39 编辑 ]
发表于 2007-5-22 16:39 | 显示全部楼层
程序好像没有什么问题
kk.txt没有输出吗?

不行再程序中设置个断点看看,比如write前面
 楼主| 发表于 2007-5-22 16:40 | 显示全部楼层
已经算了快24个小时了,还没有结果。
发表于 2007-5-22 16:42 | 显示全部楼层
 楼主| 发表于 2007-5-22 16:44 | 显示全部楼层
后面就不怎么占用cpu了.kk.txt一直是0kb.但是内存好象占用很多.电脑反应很慢

[ 本帖最后由 yxb345 于 2007-5-22 16:45 编辑 ]
 楼主| 发表于 2007-5-22 17:00 | 显示全部楼层
请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进?
发表于 2007-5-22 17:04 | 显示全部楼层
原帖由 yxb345 于 2007-5-22 17:00 发表
请问一下在build的时候出现一个警告,好象是说我的矩正太大,得到的结果可能不正确.这对结果有影响吗?如果有,如何改进?


你这么说估计就是这个问题了,改进算法,不要一次性读入所有数据,可以读一点处理一点
发表于 2007-5-22 17:05 | 显示全部楼层
下面的程序可以检测你的机器最大能开的数组大小,可以看看

Program Tarray
   implicit none
   integer::size,error=0
   integer,parameter::one_mb=1024*1024
   character,allocatable::a(:)
   write(*,*) size,error
   open(unit=9,file='result.txt',status='unknown')

   do while(.true.)
   size=size+one_mb
   allocate(a(size),stat=error)
   if(error.ne.0)then
   exit
   end if
   write(9,"('allocate',I10,'byte')")size
   write(9,"(F10.2,'MB used')")real(size)/real(one_mb)
   write(9,"(F10.2,'MW used')") real(size)/(real(one_mb)*16.0)
   deallocate(a)
   end do
   
   stop
发表于 2007-5-23 21:10 | 显示全部楼层
原帖由 yxb345 于 2007-5-22 16:31 发表
real K(1:8922,1:8922),a(1:89103,1:3)
  open(unit=1,file='filestiffness.txt',status='old')
  open(unit=2,file='kk.txt',status='new')
        read(1,*)((a(i,j),j=1,3),i=1,89103)
        do 10  ...


我不清楚你的完整的数据文件是什么样子的,所以下面提出的几个问题可能不恰当,但是请你参考:
1. 很明显,你的数据文件a的元素个数(仅针对行)不等于K中的矩阵元素个数,所以对K不给初始值可能让某些没有赋值得元素任意赋值,造成想象不到的偏差。
2. 如果a中元素某两行,前两列相同,第三列不同,如何考虑?(如果存在这样的情况)
3. 如果a中的第一列和第二列元素都小于等于8922,那么你完全可以用一个循环实现,即

  1. do ii=1,89103
  2.   K(a(ii,1),a(ii,2)) = a(ii,3)
  3. enddo
复制代码

大大的减少计算时间。

4. suffer说的方法你可以尝试一下,如果你真的要按照你原来的思路做,我建议你缩小矩阵的维数,然后多次读取文件,重复利用这个矩阵空间,不占用那么大的内存。

评分

1

查看全部评分

 楼主| 发表于 2007-5-29 20:28 | 显示全部楼层
多谢高手指点!!
另外还有一个问题请教:
1.filestiffness.txt这个文件的读取方法应该是"DIRECT"还是其它?
2.我把矩阵分块后,为何我算得的结果并不正确?我需要得到的是一个8992列的矩阵,而实际得到的是一个四列的矩阵.是不是读取文件的错误?(我让第一个循环为i=1,1000,第二个为1,8922,只过把判断条件改为(if a(i,1).eq.(i+1000).and.a(i,2).eq.j),后面依此类推,i+1000,i+2000````,i+8000后面再将得到的9个K组合
3.如果采用稀疏矩阵,FORTRAN该如何实现?


另外,在矩阵a中缺少的元素会自动在k中赋0值,我用一个小矩阵试过!

[ 本帖最后由 yxb345 于 2007-5-29 20:48 编辑 ]
发表于 2007-6-3 12:24 | 显示全部楼层
1. DIRECT是二进制文件的读取方式
2. 看看read命令的帮助文件吧
3. 稀疏矩阵一般采用二维存储或者一维存储,比较多的是用一维存储,建议看看有限元方面的书一般对这些存储格式都有介绍的
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-10 00:34 , Processed in 0.092411 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表