1

这是一个简单的问题,一直困扰着我一段时间。

我正在尝试将我的代码重写为并行,在此过程中,我需要拆分一个总和以在多个节点上完成,然后将这些小总和相加。我正在使用的作品是这样的:

def pia(n, i):
        k = 0
        lsum = 0
        while k < n:
                p = (n-k)
                ld = (8.0*k+i)
                ln = pow(16.0, p, ld)
                lsum += (ln/ld)
                k += 1
        return lsum

其中n是极限,i是整数。有没有人有一些关于如何拆分并最终得到相同结果的提示?

编辑:对于那些询问的人,我没有使用pow()自定义版本,而是使用浮点有效地做到这一点:

def ssp(b, n, m):
    ssp = 1
    while n>0:
            if n % 2 == 1:
                    ssp = (b*ssp) % m
            b = (b**2) % m
            n = n // 2
    return ssp
4

2 回答 2

1

由于从一次传递到下一次传递的唯一变量是k,并且k每次仅递增 1,因此很容易拆分计算。

如果您还传入kpia那么您将拥有一个可定义的起点和终点,您可以将其拆分为任意数量的部分,最后将所有结果相加。所以像:

# instead of pia(20000, i), use pia(n, i, k) and run
result = pia(20000, i, 10000) + pia(10000, i, 0)

此外,由于n既用于设置限制又用于直接计算,因此需要将这两种用途分开。

from math import pow

def pia(nlimit, ncalc, i, k):
        lsum = 0
        while k < nlimit:
                p = ncalc-k
                ld = 8.0*k+i
                ln = ssp(16., p, ld)
                lsum += ln/ld
                k += 1
        return lsum

if __name__=="__main__":
    i, ncalc = 5, 10
    print pia(10, ncalc, i, 0)
    print pia(5, ncalc, i, 0) + pia(10, ncalc, i, 5)
于 2013-08-07T16:55:29.733 回答
-1

看来我找到了办法。我所做的是让每个节点计算一部分的总和(例如,节点一计算 k=1,节点 2 k=2,节点 3 k=3,节点 4 k=4,节点 1 k=5... ) 然后将它们收集起来并添加它们。

于 2013-08-07T18:49:58.453 回答