ROSE 编译器框架/OpenK
外观
一个正在进行的项目,旨在探索知识驱动的高性能计算分析和优化。我们使用 OWL 使用的标准和工具链来正式建模高性能计算领域中的概念和关系,包括程序、硬件、分析和优化等。
该框架包含多个部分
- 一个是生成数据库的 C 程序解析器。
- 源代码位于 OpenK/tools/rosePrgKnowledgeBuilder 下,它从输入程序中提取知识并将其存储为乌龟格式的本体。
- 输出的知识库可以使用 SWI-Prolog semweb 库解析。
- 第二部分是用 Prolog 编写的规范循环分析部分。
- 第三部分是使用 Prolog C++ 接口查询硬件本体的演示
OpenK 已集成到 ROSE 中,位于
以下文档有点过时,需要更新。
列表
- ontology/ - owl 文件。
- projects/ - 包含独立的项目或程序:规范循环检测、指针分析等。
- canonicalloop/ - 使用 Prolog 查询查找规范循环
- cfg_test/ - 使用 Prolog 生成控制流图
- rose_canonicalloop/ - 经典的基于 AST 的规范循环检测,用于比较
- staticCFG_tests/- 经典的基于 AST 的控制流图生成,用于比较
- test/ - 测试基准和脚本
- tools/ - 知识生成器:使用 ROSE 前端解析 C 代码并构建知识库。
您需要安装
- ROSE
- SWI-Prolog
要构建翻译器
- 通过
$ . openk/set.rose
设置 ROSE 环境。注意,set.rose 文件应根据您的机器进行修改。- 或者只需手动导出 ROSE_INS=/home/liao6/workspace/masterDevClean/install
- export BOOST_INS=/nfs/casc/overture/ROSE/opt/rhel7/x86_64/boost/1_54_0/gcc/4.8.3
- cd 到 openk/tools/rosePrgKnowledgeBuilder 文件夹。
- 您可以运行
make
来生成 rosePrgKnowledgeBuilder.exe,并运行make check
来检查它是否与同一目录下的测试文件相符。
./rosePrgKnowledgeBuilder.exe -emit-ttl ut.cc.ttl -c ./ut.cc
openk.git/tools/rosePrgKnowledgeBuilder]./rosePrgKnowledgeBuilder.exe --help
---------------------Tool-Specific Help----------------------------------- This is a source translator to build knowledge base from your C/C++ code. Usage: ./rosePrgKnowledgeBuilder.exe[options][-o output]-c input.c Options: --help This help message. -emit-pl output.pl ontologies in prolog file. -emit-owl output.owl ontologies in OWL format. -emit-ttl output.ttl ontologies in Turtle. -alive true/false embedding Prolog engine.
声明式分析工具位于 openk/projects/canonicalloop
- openk/csem 是实现 C 程序基本分析的 Prolog 模块,包括搜索不同类型的程序结构。它们可以被视为库模块。欢迎在 csem 下添加更多模块以扩展库。
- 每个基于 prolog 的 c 程序分析都应该有自己的目录,其中包含一个 run.pl 作为驱动程序。它们使用 csem 中的模块。
例如,规范循环分析位于 openk/projects/canonicalloop 下。
运行swipl -s run.pl example_knowledge_base.ttl output_report.txt
规范循环的参考 rose 原生 C++ 实现位于 openk/projects/rose_canonicalloop 下。
运行 make
来生成 roseNativeCl.exe
要针对测试台测试它
cd openk/test/npb2.3-test/
- 有一个用于调用测试的脚本。该脚本使用工具 rosePrgKnowledgeBuilder.exe 和 roseNativeCl.exe 以及 prolog 程序。您无需执行任何操作,脚本使用这些工具的相对路径。
$chmod +x analysis.py
./analysis.py rose-cl
运行原生 Rose 规范循环执行。输出日志将生成在当前文件夹下。./analysis.py build-kb
运行解析器以生成数据库,然后./analysis openk-cl
在所有测试文件上运行基于 prolog 的规范循环。- 或者简单来说,您只需运行
./analysis.py all
即可运行所有测试。
cd projects/cfg_test
要从 ttl 文件生成 CFG 报告
- swipl --nosignal --quiet run.pl sp_single.c.ttl sp_single.c.ttl_openk_cfg_report.txt
openk.git/projects/owl_hw_demo
- hpchardware-rdf.owl 高性能计算硬件本体
- load2.pl Prolog 谓词,用于通过 Prolog 语义 Web 库读取本体
- main.cpp C++ 程序,通过 SWI-Prolog C++ 接口与本体交互
我们提供一个 Python 脚本用于运行各种测试:cd /test/npb2.3-test
./run_test.py <option>
选项可以是以下之一
clean: clean the result files. build-kb: build knowledge base from the input codes openk-cl: run the openk canonical loop analysis. Must after the build-kb step rose-cl: run the rose native canonical loop analysis openk-cfg: openk cfg
列表
- openk.git/tools/rosePrgKnowledgeBuilder/
- rosePrgKnowledgeBuilder.cpp
- OntoGeneratorInterface.hpp
命令行
- swipl --nosignal --quiet /export/liao6/openk.git/projects/canonicalloop/run.pl bt.c.ttl bt.c.pl_openk_cl_report.txt
./projects/canonicalloop/run.pl
:- use_module(library(semweb/rdf_db)). :- use_module(library(semweb/turtle)). :- use_module('../csem/canonical_loop.pl'). :- use_module('../csem/url_process.pl').
./projects/csem/canonical_loop.pl
/* CanonicalLoop */ :- module(canonical_loop, [canonicalLoop/1]). :- use_module(c_construct). %% The top level specification canonicalLoop(LoopURL) :- forLoop(LoopURL), hasForInit(LoopURL, Init), isCanonicalInit(Init, LoopVar), hasForTest(LoopURL, Test), isCanonicalTest(Test, LoopVar), hasForIncr(LoopURL, Incr), isCanonicalIncr(Incr, LoopVar). isCanonicalInit(InitURL, LoopVar) :- %% forLoop(LoopURL), hasForInit(LoopURL, InitURL), roseCanonicalInit(InitURL, LoopVar, _), hasType(LoopVar, Type), (intType(Type); Type == pointer_type). %% normal style roseCanonicalInit(InitURL, LoopVar, LB) :- hasChild(InitURL, AssignOpURL), c_is_a(AssignOpURL, 'AssignOp'), !, leftOperand(AssignOpURL, VarRefURL), get_varDecl(VarRefURL, LoopVar), rightOperand(AssignOpURL, LB). %% C99 style %% In this case, rose AST nodes have the same location roseCanonicalInit(InitURL, LoopVar, LB) :- %% hasChild(InitURL, VarURL), c_is_a(InitURL, 'VariableDecl'), c_is_a(InitURL, 'Variable'), !, \+ (hasChild(InitURL, VarDecl), c_is_a(VarDecl, 'VariableDecl')), roseHasInitValue(InitURL, LB), LoopVar = InitURL. ...