【问题标题】:Why there is no difference when i change the level of optimizaition in llvmlite?为什么当我更改 llvmlite 中的优化级别时没有区别?
【发布时间】:2017-07-18 15:50:27
【问题描述】:

我正在尝试为我自己的程序使用 llvmlite 的优化通道。我为我的代码定义了以下函数作为传递函数:

def create_pass_manager_builder(opt=3, loop_vectorize=False, slp_vectorize=False):
    pmb = llvm.create_pass_manager_builder()
    pmb.opt_level = opt
    pmb.loop_vectorize = loop_vectorize
    pmb.populate = populate
    pmb.add_dead_code_elimination_pass = add_dead_code_elimination_pass
    pmb.slp_vectorize = slp_vectorize
    pmb.inlining_threshold = _inlining_threshold(opt)
    return pmb

我尝试使用以下命令运行它:

module_ref = llvm1.parse_assembly(str(module))
pmb = llvm.create_pass_manager_builder()
pmb.opt_level = 3
pm = llvm.create_module_pass_manager()
pmb.populate(pm)
pm.run(module_ref)

有了这个,我确实对我的代码进行了一些优化。但是,当我将优化级别从 3 更改为 2 或 0 时,优化没有区别。如何更改优化级别并查看区别?

【问题讨论】:

    标签: python-2.7 llvm numba llvmlite


    【解决方案1】:

    优化本身不使用优化级别。这取决于您如何构建通行证管理器,或者在这种情况下,填充函数如何完成它。稍微挖掘一下,我发现在您的情况下,当您仅使用模块传递管理器时,您的填充函数将调用这个 http://llvm.org/doxygen/PassManagerBuilder_8cpp_source.html#l00402 有一些对 optLevel 的引用,您可以检查取决于它的优化是否真的适用于您的代码。如果您优化的代码没有经过这些优化,那么您将看不到任何差异。

    另一个问题是我不确定你是否调用了正确的 create_pass_manager_builder 函数,该函数实际上在 llvmlite 中有一些默认定义,将 opt 级别固定为 2。我想这应该是

    pmb = create_pass_manager_builder()
    

    而不是

    pmb = llvm.create_pass_manager_builder()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 2020-06-08
      • 2020-12-31
      • 2021-11-10
      • 2021-12-27
      • 2022-07-06
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多