Z3 4.8.1的新功能之一是并行求解:
并行模式可用于某些理论,包括QF_BV。通过 设置parallel.enable = true Z3将产生许多工作线程 与可应用多维数据集和 征服解决目标。
它提到只需设置parallel.enable=true
,但在代码中找不到parallel
结构。
有人可以提供一些示例代码来查看如何实现此新功能吗?
谢谢
答案 0 :(得分:3)
简短的回答:正如@LeventErkok指出的那样,parallel.enable=true
的语法在z3可执行文件本身的命令行中使用。就像他和@Claies's link had indicated所说的那样,如果您正在使用绑定,则需要使用相关的set_param()
方法。对于set_param("parallel.enable", true);
当我将此添加到 C++ binding example,它给出的输出基本上相同...尽管它向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
的地方找到名为parallel.enable = true;
的C ++对象。它是存储在由字符串名称管理的配置对象中的属性。该配置对象称为parallel_params
,它不在GitHub中,因为它是在构建过程中生成到src/solver/parallel_params.hpp
这些属性及其默认值的规范是.pyg
文件中的每个模块的规范。这只是由构建准备过程和eval()'d with a few things defined加载的Python。并行求解器选项位于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
这样的参数。
作为更改此文件如何影响定义并行属性的已生成标头的示例,我直接将parallel_params.pyg
修改为默认值为“ True”而不是“ False”。结果是对生成的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); }
答案 1 :(得分:3)
如果使用的是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都支持它。希望如此,您会得到很好的警告/错误!)< / p>