RenderScript on LLVM笔记

Android 为何引入 Render Script:

3D 可移植  ( 直接用 opengl 也可以移植呀?)

性能

易用性 ( 让 opengl 难入门的人,用 Render Script ?)

Render Script 使用类似 C99 语法  + 一些扩展

目前使用 Render Script的  APP ( BOOKS, YouTube 等)

Render Script 包含的构件

llvm-rs-cc: 

1) 把 RS 编译为  bitcode

2) 同时生成 调用 RS的 Java Layer  层代码

========= 背景知识 =========

对于一个 helloworld 程序

#include <stdio.h>

int main() {
  printf("hello world\n");
  return 0;
}

可以用 Clang 直接编译,并运行

% clang hello.c -o hello

也可以生成  bitcode

% clang -O3 -emit-llvm hello.c -c -o hello.bc

而后用 lli 来解析运行

% lli hello.bc

可以用bitcode反编译为 llvm 的中间汇编代码

% llvm-dis < hello.bc | less

可以把 bitcode 用 llc 编译为 native的汇编

% llc hello.bc -o hello.s

再用 gcc 编译为 可执行文件

% gcc hello.s -o hello.native 

==================

这里针对的是 C语言,而 RS 是一种类C语言,它通过改写 Clang扩展其语法

libbcc

libcc  llvm-rs-cc 的生成的全部代码都再次使用 JIT生成 machine code (CPU/GPU/DSP)

RS编译得到的 bc 通过 libcc 生成 machine code

而调用 RC 的 Java代码也通过 Dalvik的 JIT生成 Native code

libRS ( runtime support)

1) 在 Dalvik Layer  管理  Script

2)  加入支持库 math funcs

总结:

Render Script 提供了一种 3D语言,并且编译平台无关中间代码,节约了APP Launch的时间

Render Script 有学习的代价,但学会应该比用 opengl简单

Render Script 可能还不够成熟

单就GPU, 直接使用 opengl ( 包括 Shader Language) 应该还是足够快的

Opengl 比较复杂,最好使用已经包装 opengl的引擎

参考:

http://llvm.org/docs/GettingStarted.html

https://events.linuxfoundation.org/slides/2011/lfcs/lfcs2011_llvm_liao.pdf

http://llvm.org/docs/BitCodeFormat.html

RenderScript on LLVM笔记

时间: 2024-10-15 16:14:14

RenderScript on LLVM笔记的相关文章

LLVM 笔记(四)—— three-phase 设计的收益

ilocker:关注 Android 安全(新手) QQ: 2597294287 采用 three-phase 的设计方式,便于编译器支持多种语言和多种目标平台. 如果在优化器阶段采用通用的 IR (中间语言) 表示 (LLVM 就是这么做的),那么就可以为任何语言编写一个前端,只要能编译生成 IR 就可以了.后端也一样,可以为任何目标平台编写一个后端,只要能从 IR 编译生成该目标平台的指令代码就可以. 采用这种设计方式,如果想支持一种新的编程语言,只需要实现一个新的前端就可以了,而优化器和后

LLVM 笔记(五)—— LLVM IR

ilocker:关注 Android 安全(新手) QQ: 2597294287 LLVM 的 IR (Intermediate Representation) 是其设计中的最重要的部分.优化器在进行代码优化时所进行的分析和转换都是针对 IR 的. 在设计 IR 时,考虑到了很多明确的目标,包括:支持轻量级的运行时优化.交叉函数/过程间优化.整体程序分析和侵入式调整转换等等. 原文:including supporting lightweight runtime optimizations, c

LLVM 笔记(二)—— PHI node

ilocker:关注 Android 安全(新手) QQ: 2597294287 什么是 PHI node? 所有 LLVM 指令都使用 SSA (Static Single Assignment,静态一次性赋值) 方式表示.意思是所有变量都只能被赋值一次,这样做主要是便于后期的代码优化. 1 a = 1; 2 if (v < 10) 3 a = 2; 4 b = a; 假设 v 的值小于 10,变量 a 就要被赋值为 2,但 a 已经被赋值了一次,由于 SSA 性质的约束,只能赋值另外一个“a

LLVM 笔记(一)—— phi 指令

ilocker:关注 Android 安全(新手) QQ: 2597294287 语法: <result> = phi <ty> [ <val0>, <label0>], ... 示例: Loop: ;Infinite loop that counts from 0 on up... %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ] %nextindvar = add i32 %indv

llvm学习笔记-2015-11-6

llvm 学习总结#1Type define int类型 IntegerType::get(mod->getContext(), 32) long类型 IntegerType::get(mod->getContext(), 64) double类型 Type::getDoubleTy(mod->getContext()) float类型 Type::getFloatTy(mod->getContext()) char类型 IntegerType::get(mod->getCo

Android高效计算——RenderScript(二)

3 RenderScript运行时层与反射层 3.1 RenderScript运行时层 RenderScript运行时层是指.rs代码运行时所在的层级.当对安卓项目进行编译的时候,.rs或者.rsh中编写的代码都会被llvm编译器编译成字节码.当该安卓应用在设备上运行的时候,这些字节码将会被设备上另外一个llvm编译(just-in-time)成机器码.这些机器码是针对该设备进行了优化的,且缓存在设备上,等到下次被应用的时候就不需要重新编译了,以加快速度.虽然RenderScript运行时层很像

Android高效计算——RenderScript(一)

高效计算——RenderScript RenderScript是安卓平台上很受谷歌推荐的一个高效计算平台,它能够自动把计算任务分配到各个可用的计算核心上,包括CPU,GPU以及DSP等,提供十分高效的并行计算能力.可能是由于应用开发时的需求不够,关于RenderScript的相关文章很少,刚好我在工作中应用到此平台,做了一些笔记,因此决定整理成博文分享给大家.内容主要来源于官方文档.StackOverflow以及自己的理解,如有错误,请大家指正.本篇主要介绍RenderScript的基本概念.

安卓第十三天笔记-服务(Service)

安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台,默认是运行当前的应用程序进程里面. 2.建立服务 建立一个类继承Service类 public class ServiceDemo extends Service { 在清单文件中注册service <service android:name="com.ithiema.servicequic

C++Primer第5版学习笔记(一)

C++Primer第5版学习笔记(一) 第一.二章的重难点内容 本篇文章主要记录了我在学习C++Primer(第5版,中文版)中遇到的重难点及其分析.因为第一.二章比较简单,因此这里合并这两章我遇到的问题.        第一章 开始 这一章在第一部分之前,是一个helloworld式的章节,包含基本的函数,io流以及类的介绍. 知识点1:P19,1.5,文件重定向 可以在windows下的cmd中或者mac,linux系统的终端窗口中用输入命令的形式执行程序并使它从一个文件中读入数据,再把标准