Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Z3中的并行求解_C++_Z3 - Fatal编程技术网

C++ Z3中的并行求解

C++ Z3中的并行求解,c++,z3,C++,Z3,Z3 4.8.1中的一个新功能是并行求解: 并行模式可用于选择的理论,包括QF_BV。通过 设置parallel.enable=true Z3将产生大量工作线程 与应用多维数据集和 战胜目标 它提到只需设置parallel.enable=true,但我在代码中找不到parallel结构 有人能提供一些示例代码来看看如何实现这个新特性吗 谢谢简短回答:正如@LeventErkok指出的那样,parallel.enable=true的语法用于z3可执行文件本身的命令行。正如他所说,如果您使用的是绑定

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

并行模式可用于选择的理论,包括QF_BV。通过 设置parallel.enable=true Z3将产生大量工作线程 与应用多维数据集和 战胜目标

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

有人能提供一些示例代码来看看如何实现这个新特性吗


谢谢

简短回答:正如@LeventErkok指出的那样,
parallel.enable=true
的语法用于z3可执行文件本身的命令行。正如他所说,如果您使用的是绑定,那么您将需要使用相关的
set_param()
方法。对于C++,它是代码> SETIOPARAM(“并行。启用”,TRUE);<代码>

当我把这个添加到 ,它给出了基本相同的输出…尽管它向stderr输出了一些额外的信息,一组行如下:

(tactic.parallel :progress 0% :closed 0 :open 1)
(tactic.parallel :progress 100% :status sat :closed 0 :open 0)
这与@LeventErkrok在另一个问题上使用z3工具观察到的差异相匹配


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

(我很好奇Z3是什么,所以我也去C++中寻找并行的。启用。这就是我的答案开始的地方,在知道更多答案的人之前。我的发现留给了任何感兴趣的人…) < >强> >长>:<强> >如果您查看了Z3本身的源代码,则找不到C++对象,称为<代码>并行< /代码>,在这里您将编写“代码>并行”。代码>。它是存储在由字符串名称管理的配置对象中的属性。该配置对象称为

parallel_params
,它不在GitHub中,因为它是作为构建过程的一部分生成到
src/solver/parallel_params.hpp

这些属性及其默认值的规范是
.pyg
文件中的每个模块。这就是Python,它是由构建准备过程加载的。并行解算器选项位于中,例如:

如果您想在构建z3时更改这些默认值,那么看起来您必须编辑
.pyg
文件,因为python脚本/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); }
从命令行 如果您使用的是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都支持它。如果是这样,希望您能收到一个很好的警告/错误!)

以及pip在官方python绑定中启用并行模式?@user2284570只要看一眼,看起来那里也有一个暴露的地方。我会从该文件中的注释中收集语法为
solver.set_-param(parallel_-enable=True)
,但另一个答案建议
set_-param('parallel.enable',True)
…所以YMMV。谢谢,启用此参数时如何使用多个线程?谢谢,但是,启用此选项后,如何获得多个独立线程?
from z3 import *
set_param('parallel.enable', True)