【问题标题】:Evaluating a function at a particular value in parallel并行评估特定值的函数
【发布时间】:2011-01-08 17:48:44
【问题描述】:

这个问题可能看起来很模糊,但让我解释一下。

假设我们有一个函数 f(x,y,z ....),我们需要在点 (x1,y1,z1 ....) 找到它的值。

最简单的方法是将 (x,y,z ...) 替换为 (x1,y1,z1 ...)。

现在假设函数在评估中花费了很多时间,我想并行化算法来评估它。显然,这也取决于函数的性质。

所以我的问题是:在“思考”并行化 f(x,y,z...) 时,我必须寻找哪些约束?

如果可能,请分享学习链接。

【问题讨论】:

  • 请提供更多关于您想要并行化的函数类型的信息。例子会很棒。

标签: algorithm math parallel-processing


【解决方案1】:

以如此笼统的方式提出问题并不能给出非常具体的建议。

我将通过寻找使用密切交互的变量组来评估或重写函数的方法开始分析,创建可用于进行最终评估的中间表达式。您可能会找到一种方法来执行此操作,该方法涉及从变量本身到最终函数的子表达式层次结构。

一般来说,这样的评估树越短越宽,并行度就越高。有两个注意事项需要牢记,这有损于“更多并行性更好”。

一方面,高度并行的方法实际上可能比原来的“串行”方法涉及更多的总计算量。事实上,这方面的一些效率损失是可以预料的,因为串行方法可以利用所有先前的子表达式评估并最大限度地重用它们。

另一方面,与选择提供良好或最佳误差估计的串行评估相比,并行评估通常具有更差的舍入/准确性行为。

在涉及矩阵的评估方面已经做了很多工作,其中函数值如何依赖于它的参数通常有很多对称性。因此,熟悉数值线性代数和在那里开发的并行算法会有所帮助。

另一个广为人知的领域是多元多项式和有理函数。

当函数是超越函数时,人们可能希望进行一些转换或重构,以使依赖关系更易于处理(代数)。

与您的问题不直接相关的算法是在多个参数中分摊计算函数值的成本。例如,在计算常微分方程的解时,可能存在“多步”方法,通过多次重复使用这些值来分担计算中间点导数的成本。

我建议您对加快函数评估的关注表明您计划执行多个评估。因此,您可能会考虑如何利用先前的评估或对相关参数执行评估,以有助于您寻找并行性。

补充:搜索策略的一些链接和讨论

大多数作者使用短语“并行函数评估”来 表示在多个参数点评估相同的函数。

参见示例:

[粗粒度并行函数评估 -- Rulon 和 Youssef]
http://cdsweb.cern.ch/record/401028/files/p837.pdf

用于查找 Gaurav Kalra 要求的材料类型的搜索策略 关于应该尽量避免那些。例如,我们可能包括 在我们的搜索词中“细化”。

专注于特定类型的功能也很有效,例如 “多项式评估”而不是“函数评估”。

这里例如我们对一些众所周知的技术进行处理 对于应用于基于 GPU 的计算设计的“快速”评估:

[如何获得高效的 GPU 内核 -- Cruz、Layton 和 Barba]
http://arxiv.org/PS_cache/arxiv/pdf/1009/1009.3457v1.pdf

(摘自他们的摘要)“在这里,我们解决了快速求和问题 算法(快速多极方法和快速高斯变换), 并应用算法重新设计以获得性能 GPU。性能改进取得进展 说明了制定算法的练习 GPU 的大规模并行架构。”

另一个可能值得排除的搜索词是“流水线”。 这个术语总是讨论可以 在要进行多项功能评估时使用。早期的 计算阶段可以与以后并行完成 阶段,但在不同的输入上。

所以这是一个人们可能想要排除的搜索词。或者不。

这是一篇讨论 n 变量的 n 倍加速的论文 有限域 GF(p) 上的多项式求值。这可能是 对加密应用程序有直接兴趣,但 通过改进的霍纳方法的方法可能对 它的泛化潜力:

[比特级和字级算法评估的比较 有限环上的非结构化函数 -- Sunar 和 Cyganski]
http://www.iacr.org/archive/ches2005/018.pdf

“我们对霍纳的评估算法进行了修改 在有限环和域上定义的任意 n 变量函数。 ...如果域是有限域 GF(p),则复杂度为 多元霍纳多项式评估从 O(p^n) 改进 为 O((p^n)/(2n))。我们证明了所提出算法的最优性。”

多元有理函数可以简单地认为是 两个这样的多项式函数的比率。对于特殊情况 的单变量有理函数,它可以特别 有效逼近基本超越函数 和其他人,可以通过有限(resp。截断)评估 连分数,其收敛(部分分子 和分母)可以递归定义。

连分数求值的话题让我们可以继续 到一个最终链接,将该主题与一些熟悉的主题联系起来 数值线性代数的并行性:

[连分数的LU分解和并行评估 -- Ömer Egecioglu]
http://www.cs.ucsb.edu/~omer/DOWNLOADABLE/lu-cf98.pdf

"一般连分数的前n个收敛 (CF) 可以在对数并行中优化计算 使用 O(n/log(n)) 个处理器的时间。”

【讨论】:

    【解决方案2】:

    您已经问过如何加快对单个函数的单个调用的评估。除非评估时间以小时为单位,否则不清楚为什么值得费心加快速度。如果您坚持要加快函数执行本身,则必须检查其内容以查看其某些方面是否可并行化。您没有提供任何关于它计算什么或如何计算的信息,因此很难就这方面提供任何进一步的建议。 hardmath 的回答提出了一些您可以使用的想法,具体取决于您的函数的实际内部结构。

    但是,通常问您问题的人实际上会针对 x,y,z 的不同值(例如 x1,y1,... x2,y2,... xN)多次调用该函数(例如 N 次) ,yN, ... 使用你的词汇)。 是的,如果您加快函数的执行速度,那么进行集体调用将会加快速度,而这正是人们想要的。如果是这种情况,加速整体执行“在技术上很容易”:对函数进行 N 次并行调用。然后所有逐点评估同时发生。为了完成这项工作,您几乎已经从要处理的值中创建了向量(因此这种技巧称为“数据并行”编程)。所以你真正想要的是:

        PARALLEL DO  I=1,N
              RESULT(I)=F(X[J],Y[J], ...)
        END PARALLEL DO
    

    如何实现 PARALLEL DO 取决于您拥有的编程语言和库。 这通常只在 N 是一个相当大的数字时才有效,但 f 执行的成本越高,有效的 N 就越小。

    您还可以利用函数的结构来提高效率。如果 f 以与常用案例相同的方式计算某些内部值,您可能能够 打破特殊情况,预先计算,然后使用这些结果计算每个单独调用的“其余 f”。

    如果您正在组合(“减少”)所有函数的结果(例如,对所有结果求和),您可以在 PARALLELL DO 循环之外进行。如果您尝试在循环中组合结果,您将获得“循环携带的依赖项”,您将得到错误的答案,或者它不会按照您期望的方式并行运行,具体取决于您的编译器或并行库。如果组合是某种关联/交换运算(例如“sum”),您可以有效地组合答案,方法是构建相当于二叉树的内容并在平行线。这是一个不同的问题,在数据并行计算中也经常出现,这里不再赘述。

    通常并行 for 循环的开销非常高(分叉线程很昂贵)。所以通常人们将开销分配到几个迭代中:

       PARALLEL DO  I=1,N,M
            DO J=I,I+M
                RESULT(J)=F(X[J],Y[J], ...)
            END DO
       END PARALLEL DO
    

    常数 M 需要校准以提高效率;你必须“调整”它。您还必须注意 N 可能不是 M 的倍数;只需要一个额外的干净循环来处理边缘条件:

       PARALLEL DO  I=1,int(N/M)*M,M
            DO J=I,I+M
                RESULT(J)=F(X[J],Y[J], ...)
            END DO
       END PARALLEL DO
       DO J=int(N/M)*M,N,1
                RESULT(J)=F(X[J],Y[J], ...)
       END DO
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多