繁体   English   中英

Z3中的并行求解

[英]Parallel solving in Z3

Z3 4.8.1的新功能之一是并行求解:

并行模式可用于某些理论,包括QF_BV。 通过设置parallel.enable = true,Z3将产生与可用CPU内核数量成比例的辅助线程,以应用多维数据集并征服目标。

它提到只需要设置parallel.enable=true ,但是我在代码中找不到该parallel结构。

有人可以提供一些示例代码来查看如何实现此新功能吗?

谢谢

简短答案:正如@LeventErkok指出的那样, parallel.enable=true的语法在z3可执行文件本身的命令行中使用。 正如他所说的和@Claies的链接所指出的那样 ,如果您使用绑定,则需要使用相关的set_param()方法。 对于C ++是set_param("parallel.enable", true);

当我将其添加到C ++绑定示例中时 ,它给出了基本相同的输出...尽管它向stderr吐出了一些额外的信息,但类似以下几行:

(tactic.parallel :progress 0% :closed 0 :open 1)
(tactic.parallel :progress 100% :status sat :closed 0 :open 0)

使用z3工具在另一个问题上匹配@LeventErkrok的观察到的差异。


它提到只需要设置parallel.enable = true,但是我在代码中找不到该并行结构。

(我很好奇Z3的全部含义,所以我也一直在C ++源代码中寻找parallel.enable。因此,这是我的答案从哪里开始的,在知道更多答案的人们之前。我的发现留给了任何感兴趣的人... )

长答案:如果您正在查看z3本身的源代码,则不会在编写parallel.enable = true;地方找到名为parallel的C ++对象parallel.enable = true; 它是存储在由字符串名称管理的配置对象中的属性。 该配置对象称为parallel_params ,它不在GitHub中,因为它是在构建过程中生成的,生成到src/solver/parallel_params.hpp

这些属性及其默认值的规范是.pyg文件中的每个模块的.pyg 这只是Python,它由构建准备过程加载,并通过eval()定义了一些东西 并行求解器选项位于src/solver/parallel_params.pyg ,例如:

def_module_params('parallel',
    description='parameters for parallel solver',
    class_name='parallel_params',
    export=True,
    params=(
        ('enable', BOOL, False, 'enable parallel solver ...'),
        ('threads.max', UINT, 10000, 'caps maximal number of threads ...'),
        # ...etc.

如果要在构建z3时更改这些默认值,则似乎必须编辑.pyg文件,因为python scripts/mk_make.py parallel.enable=true.pyg文件似乎没有参数化。

作为如何改变该文件影响限定并行属性生成的头一个例子,我直接修改parallel_params.pyg说“真”,而不是“假”为默认值。 结果是对生成的src/solver/parallel_params.hpp文件进行以下两行比较:

-- a/src/solver/parallel_params.hpp
+++ b/src/solver/parallel_params.hpp
@@ -9,7 +9,7 @@ struct parallel_params {
   parallel_params(params_ref const & _p = params_ref::get_empty()):
      p(_p), g(gparams::get_module("parallel")) {}
   static void collect_param_descrs(param_descrs & d) {
-    d.insert("enable", CPK_BOOL, "enable parallel solver by default on selected tactics (for QF_BV)", "false","parallel");
+    d.insert("enable", CPK_BOOL, "enable parallel solver by default on selected tactics (for QF_BV)", "true","parallel");
     d.insert("threads.max", CPK_UINT, "caps maximal number of threads below the number of processors", "10000","parallel");
     d.insert("conquer.batch_size", CPK_UINT, "number of cubes to batch together for fast conquer", "100","parallel");
     d.insert("conquer.restart.max", CPK_UINT, "maximal number of restarts during conquer phase", "5","parallel");
@@ -23,7 +23,7 @@ struct parallel_params {
      REG_MODULE_PARAMS('parallel', 'parallel_params::collect_param_descrs')
      REG_MODULE_DESCRIPTION('parallel', 'parameters for parallel solver')
   */
-  bool enable() const { return p.get_bool("enable", g, false); }
+  bool enable() const { return p.get_bool("enable", g, true); }
   unsigned threads_max() const { return p.get_uint("threads.max", g, 10000u); }
   unsigned conquer_batch_size() const { return p.get_uint("conquer.batch_size", g, 100u); }
   unsigned conquer_restart_max() const { return p.get_uint("conquer.restart.max", g, 5u); }

从命令行

如果使用z3可执行文件,则只需在命令行中传递设置即可。 也就是说,如果您的脚本位于文件a.smt2 ,请使用:

 z3 parallel.enable=true a.smt2

z3将在处理基准测试时使用并行求解器。 例如:

$ cat a.smt2
(set-logic QF_AUFBV )
(set-option :produce-models true)
(declare-fun a () (_ BitVec 32))
(declare-fun b () (_ BitVec 32))
(assert (bvult a b))
(check-sat)
(get-model)

常规电话:

$ z3 a.smt2
sat
(model
  (define-fun a () (_ BitVec 32)
    #x00000000)
  (define-fun b () (_ BitVec 32)
    #x00000001)
)

并行模式:

$ z3 parallel.enable=true a.smt2
(tactic.parallel :progress 0% :closed 0 :open 1)
(tactic.parallel :progress 100% :status sat :closed 0 :open 0)
sat
(model
  (define-fun a () (_ BitVec 32)
    #x00000000)
  (define-fun b () (_ BitVec 32)
    #x00000001)
)

请注意有关在第二次运行中执行并行模式的额外注释。

编程

如果您从编程API询问如何使用它? 对于Python,它看起来像:

from z3 import *
set_param('parallel.enable', True)

我确定其他API也有类似的调用。 (注意:我自己尚未真正使用/测试过此功能;由于它是新功能,因此可能并非所有编程API都支持它。希望如此,您会得到很好的警告/错误!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM