【问题标题】:Expression Trees: Alternatives or Alternate Evaluation Methods表达式树:替代或替代评估方法
【发布时间】:2025-12-11 18:05:01
【问题描述】:

我什至不确定这里是否适合提出这样的问题。

作为我的硕士论文的一部分,我正在做一些并行算法的工作。简单地说,我正在做的事情的一部分是并行评估数千个表达式树(表达式如sin(exp (x + y) * cos (z)))。我现在正在做的是将这些表达式树转换为前缀/后缀表达式,并使用常规方法(堆栈、递归等)评估它们。这些是我们在数据结构和基础计算机科学课程中学到的基本知识。

我想知道是否还有其他东西可以用来代替表达式树来处理表达式。我知道编译器在解析阶段大量使用表达式树,所以我假设没有表达式树的替代品(否则有人会在编译器中使用它)。
此类表达式是否有任何替代评估方法(而不是堆栈和递归)。更“并行”友好的东西?用堆栈解析这样的表达式是顺序的,并且会在并行系统中产生瓶颈。 (我的工作也可以接受异国/怪异/理论方法 - 如果有的话)

【问题讨论】:

    标签: cuda parallel-processing expression-trees expression-evaluation


    【解决方案1】:

    我认为评估表达式树可并行化的,你只是不要将它们转换为前缀或后缀形式。

    例如,您给出的表达式的树如下所示:

       sin
        |
        *
       / \
     exp cos
      |   |
      +   z
     / \
    x   y
    

    当您遇到* 时,您可以在一个线程上计算exp 子表达式并在另一个线程上计算cos 子表达式。 (假设您的编程语言支持它们,您可以在此处使用future 来简化代码。)


    虽然如果你的表达式真的像这个一样简单并且你有数千个,那么我看不出有什么理由需要并行计算一个表达式。对表达式本身进行并行处理应该绰绰有余(例如,使用 1000 个表达式和 2 个内核,在一个内核上计算 500,其余的在另一个内核上计算)。

    【讨论】:

    • 感谢您的回答。问题是我过度简化了场景。我有 8000 到 16000 个表达式树,最大深度为 17,每个都必须在数百个测试用例上进行评估。为了使其更具体,我正在使用遗传编程解决视觉问题。 CUDA 是我的并行平台。您认为您提出的模型能很好地映射到 CUDA 的并行模型吗?
    • @M2X 我对 CUDA 一无所知,所以无法帮助您。