ZT - 怎樣提高呼叫數學函式的程式的效能(4)

saintsiro發表於2010-08-08

本文向您提供了對 IBM MASS 庫以及 IBM XL C/C++ 和 XL Fortran 彙編器的自動向量化功能的描述。另外,本文演示了對範例程式(離散 Fourier 轉變)使用各種彙編器選項的操作,向您展示了透過使用 MASS 自動向量化的自動呼叫功能,使得與以前版本相比速度提高了 8.94 倍的效果。

[@more@]

本文向您提供了對 IBM MASS 庫以及 IBM XL C/C++ 和 XL Fortran 彙編器的自動向量化功能的描述。另外,本文演示了對範例程式(離散 Fourier 轉變)使用各種彙編器選項的操作,向您展示了透過使用 MASS 自動向量化的自動呼叫功能,使得與以前版本相比速度提高了 8.94 倍的效果。

這種演示想要透過一種程式來鼓勵使用者,這種程式會訪問數學函式以驗證可用的彙編器選項,並從 IBM XL C/C++ 或者 XL Fortran 彙編器的自動向量化加速中獲益。

  subroutine dft (x, a, phi , n)
    real*8 x(n), a(n), phi(n)
    integer n

    ! Compute discrete Fourier transform of real inputs         
    ! x(i) and convert to polar form.

    real*8, parameter :: pi=3.1415926535897932384d0
    real*8 y_re(n), y_im(n), t, term_re, term_im
    intrinsic exp, cos, sin, sqrt, atan

    y_re(1:n) = 0.d0
    y_im(1:n) = 0.d0
    do k=1,n
      ! compute y(k), k-th DFT output
      do i=1,n
        ! compute i-th term of y(k):
        ! x(k)*exp(-2*pi*I*(k-1)*(i-1)/n)
        ! compute real and imaginary parts of i-th term
        ! using exp(I*t)=exp(t)*(cos(t)+I*sin(t))

        t = -2.d0*pi*(k-1)*(i-1)/n
        term_re = x(i) * cos(t) * exp(t)
        term_im = x(i) * sin(t) * exp(t)

        ! add term to sum
        y_re(k) = y_re(k) + term_re
        y_im(k) = y_im(k) + term_im
      end do
    end do

    ! transform y to polar coordinates
    do k=1,n
      ! compute amplitude of y(k)
      a(k) = sqrt (y_re(k)**2 + y_im(k)**2)
      ! compute phase of y(k)
      phi(k) = atan (y_im(k) / y_reim(k))
    end do

  end subroutine

  ! initialize input data
  subroutine init (a, n)
    real*8 a(n)
    integer n
    intrinsic sin,sqrt
    
    do j=1,n
      a(j)=sin(1.d0/sqrt(real(j,8)))
    end do
  end subroutine

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16896827/viewspace-1036477/,如需轉載,請註明出處,否則將追究法律責任。

相關文章