与掩码和do循环的和的性能

时间:2015-12-22 10:37:57

标签: performance sum fortran

内在函数sum的掩码是否比旧式的循环慢?

我正在为Fortran 90中的财务应用程序编写程序。 有一个用户定义的类型,它将a的50个属性混为一谈 单一债券,如账面价值,时间价值,利率,原子类型为整数,真实和特征。

type(portfolioElementType)
    real(8) :: timeValue
    real(8) :: bookValue
    real(8) :: maturityInYears
    + many, many more
end type

整个投资组合包含一个二维矩阵,其中包含3000次10个portfolioElementType

类型的元素
type(portfolioElementType), dimension(:,:), pointer :: portfolio
allocate(portfolio(1:3000,1:10))

我想通过maturityInYears汇总投资组合。在SQL中,您可以将其称为逐个语句。

目前由

完成
do bond = 1 to numberOfBonds
    do part = 1 to numberOfParts
        if (portfolio(bond,part)%maturity .eq. 10) then
            sum10Years = sum10Years + portfolio(bond,part)%bookValue
        end if
    end do 
end do

我希望纯粹出于美学原因,只能这样做:

sum10 = sum(portfolio%bookValue, mask = portfolio%maturity .eq. 10)

Booth选项给出相同的结果,但sum-approach似乎比do-loop慢。这让我感到惊讶,因为总计大约3万个元素 应该几乎毫不费力?

我的假设是,"大"用户定义的类型正在减慢速度。 我不知道Fortran如何处理它的内存结构,但我想是的 " bookValues"位于"远"在记忆中相互对立?

你认为我是否使用"大"用户定义的数据结构与" big"的用户定义数据结构相比较矩阵在某种意义上说:

portfolio(a,b)%bookValue versus 
bigPortfolio%bookValue(a,b)

type(bigPortfolio)
   real(8), dimension(1:3000,1:10), pointer :: bookValue
   ...many more matrices
end type

0 个答案:

没有答案