小编aPh*_*ist的帖子

当阵列大于800,000,000时,我的Fortran筛子会显着减慢

我是一名物理学家,最近我一直在和Fortran合作.最初我使用Java进行广泛的娱乐,因为它是我学习的第一种语言,但我已经放弃了它用于Fortran和C++.我对素数有业余热情,因此我创建了一个素数筛子.我能够在15秒内找到最多2 ^ 31的所有素数.这是Java的最大数组大小,所以这就是结束.我小心地移植了代码(我的意思是,我很沮丧,我的代码很慢,而且我找不到错误,我将我的Fortran代码移植回Java以验证它不是我的错,然后移植回来到Fortran,擦除每次迭代!).问题是大约800,000,000 Fortran将陷入停顿.到目前为止,它击败了Java,但在此之后,它的速度非常慢.我花了几个小时绘制它并拟合曲线.它以指数方式减速,可能需要数百年才能解决Javas级别问题.我问过很多人无济于事.为什么这发生在我身上?!?!有没有明智的Fortran程序员可以帮助我?我正在运行Macbook Pro 2013年末i5.我的代码如下.

program sieve
integer(4),allocatable:: prime(:)
integer(4)::a,max,b,primeCount
write(*,*)"Welcome to the slow prime number sieve!"
write(*,*)"--------------------------------------------"
write(*,*)"Up to what numbers do you need to find primes for?"
write(*,*)"Enter a number below 2^(32-1)"
read*, max

primeCount=0
allocate(prime(max))
prime(1)=1

    do a=2,int(sqrt(real(max))) !the main loop
        if(prime(a)==0)then !if the number is marked as prime procede
            do b=2*a,max,a  !eliminate all the numbers that are multiples of the number
                if(prime(b)==0)then !but only spend time eliminating if the number is still marked prime
                    prime(b)=1 …
Run Code Online (Sandbox Code Playgroud)

performance primes fortran

6
推荐指数
1
解决办法
593
查看次数

标签 统计

fortran ×1

performance ×1

primes ×1