跳转到内容

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

用户指南

[编辑 | 编辑源代码]

要构建翻译器

  1. 通过 $ . openk/set.rose 设置 ROSE 环境。注意,set.rose 文件应根据您的机器进行修改。
    1. 或者只需手动导出 ROSE_INS=/home/liao6/workspace/masterDevClean/install
    2. export BOOST_INS=/nfs/casc/overture/ROSE/opt/rhel7/x86_64/boost/1_54_0/gcc/4.8.3
  2. cd 到 openk/tools/rosePrgKnowledgeBuilder 文件夹。
  3. 您可以运行make 来生成 rosePrgKnowledgeBuilder.exe,并运行 make check 来检查它是否与同一目录下的测试文件相符。

rosePrgKnowledgeBuilder.exe

[编辑 | 编辑源代码]

./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

  1. openk/csem 是实现 C 程序基本分析的 Prolog 模块,包括搜索不同类型的程序结构。它们可以被视为库模块。欢迎在 csem 下添加更多模块以扩展库。
  2. 每个基于 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

要针对测试台测试它

  1. cd openk/test/npb2.3-test/
  2. 有一个用于调用测试的脚本。该脚本使用工具 rosePrgKnowledgeBuilder.exe 和 roseNativeCl.exe 以及 prolog 程序。您无需执行任何操作,脚本使用这些工具的相对路径。
  3. $chmod +x analysis.py
  4. ./analysis.py rose-cl 运行原生 Rose 规范循环执行。输出日志将生成在当前文件夹下。
  5. ./analysis.py build-kb 运行解析器以生成数据库,然后 ./analysis openk-cl 在所有测试文件上运行基于 prolog 的规范循环。
  6. 或者简单来说,您只需运行./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.
...
华夏公益教科书