Android Studio 3.2.1
上 vuh
库使用的例子,首先使用 基于Vulkan的GPGPU计算框架Vuh 编译出 Android
版本的动态库,然后依照如下步骤建立工程。
分类: Vulkan
Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。
科纳斯最先把VulkanAPI称为“次世代OpenGL行动”(nextgenerationOpenGLinitiative)或“glNext”,但在正式宣布Vulkan之后这些名字就没有再使用了。就像OpenGL,Vulkan针对实时3D程序(如电子游戏)设计,Vulkan并计划提供高性能和低CPU管理负担(overhead),这也是Direct3D12和AMD的Mantle的目标。Vulkan兼容Mantle的一个分支,并使用了Mantle的一些组件
macOS Mojave(10.14.2)系统上编译LunarG/VulkanTools工程的Android版本
参考链接
- Failed to install android-sdk: “java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema”
- 使用新版android sdk tool 的 sdkmanager 安装 android sdk 组件
- Failed to run sdkmanager --list (Android SDK) with Java 9
- How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9
- Android SDK is not installed or is not configured properly, environment looks ok #3139
- Installing specific major Java JDK versions on OS X via Homebrew
- Vulkan 设置
OpenCL代码编译成Vulkan代码的工具clspv
最近接到个任务,就是把OpenCL
的.cl
代码编译成Vulkan
程序。
使用Google
开源的工具clspv
实现这个功能即可。
编译完成后,在 bin
目录下生成 clspv
这个可执行程序。
使用的时候参考项目的文档 OpenCL C 1.2 Language on Vulkan 。
只是需要注意的是,如果使用了 image 类型,比如image2d_t
则需要提供 -samplermap
这个参数,这个参数指向一个文件,文件内容可能如下:
具体的定义跟在 OpenCL
中调用 read_image/write_image 函数时候指定的 sampler
参数一致即可。
参考链接
OpenCL代码编译成Vulkan代码(SPIR-V)的工具
最近接到个任务,就是把OpenCL
的.cl
代码编译成Vulkan
程序。
请使用 OpenCL代码编译成Vulkan代码的工具clspv 实现这部分功能,官方提供的转换库,目前看来暂时没办法使用。
根据官方文档,Vulkan 1.0
支持OpenCL 1.0/2.1
的代码直接编译成Vulkan
程序。
官方提供了一个名为 KhronosGroup/SPIR 的开源项目,支持OpenCL
编译成SPIR-V
代码的功能(Vulkan
使用SPIR-V
)。
这个工具在 macOS Mojave(10.14.2)
系统上使用 Xcode Version 10.1 (10B61)
编译流程如下:
编译完成后的使用方式如下:
<triple>
: for 32 bit SPIR-V use spir-unknown-unknown, for 64 bit SPIR-V use spir64-unknown-unknown.- -D: to enable support for extension. e.g. -Dcl_khr_fp16 compile option will enable half support.
- -O: -O0 (default) is the only tested option value at the moment. It's assumed by design that all optimizations are executed by SPIR-V consumer.
比如:
继续阅读OpenCL代码编译成Vulkan代码(SPIR-V)的工具
基于Vulkan的GPGPU计算框架Vuh
发现一个写的比较好的基于Vulkan
的GPGPU
计算框架Vuh
,github
上的代码地址为:
在macOS Mojave(10.14.2)
中编译方式:
如果编译的时候报错
这个原因是由于新版本的spdlog-1.2.1
变更了basic_logger_mt
这个类的头文件。
在源代码的vuh/doc/examples/spdlog/main.cpp
中,包含如下头文件即可:
如果需要编译 Android
版本,那么如下方式进行编译:
注意最后几个参数,文档,测试用例,例子都不参与编译,原因在于这几个工程不适合 Android
上运行,最后需要定义几个 C++
的编译宏,否则编译不通过。
如果上面编译的时候,提示如下错误信息:
这个错误的原因是 vuh/src/instance.cpp
中定义
的时候,缺少 VKAPI_ATTR
这个宏。貌似只有在 Android
平台上这个宏被赋值,其他平台都是空。因此其他平台编译的时候,没有这个参数也是没问题的。
修改后的结果为:
VKAPI_ATTR
这个宏在 vk_platform.h
这个文件中被定义,定义的具体内容如下:Vulkan官方API文档Vulkan® 1.0.95 - A Specification
Vulkan官方API文档 Vulkan® 1.0.95 - A Specification 对于开发者来说,非常有用。
由于官方网站访问非常缓慢,建议下载PDF版本到本地来查看。
官方文档地址: Vulkan® 1.0.95 - A Specification - Khronos Group
官方PDF版本地址: Vulkan® 1.0.95 - A Specification - Khronos Group
本站的一份PDF版拷贝
继续阅读Vulkan官方API文档Vulkan® 1.0.95 - A Specification
Vulkan中的"#version 430 core"的理解
最近在学习Vulkan
,结果在查看示例代码的时候:
对于如下语句出现了疑问
这句话的意思是OpenGL
必须是4.3
以及以上的版本。
那么是不是意味着,如果设备上的OpenGL
低于这个版本,那么我们编写的Vulkan
代码就不能执行呢?
答案是否定的,目前我们开发Vulkan
默认是使用GLSL
(OpenGL Shading Language
)语言,然后编译完成后的操作符被直接映射成Vulkan
的定义操作符。
换句话说,我们只要执行如下命令,
能编译通过,就可以随意指定#version
的版本。
这个版本号仅仅是GLSL
语言在进行语法检查的时候需要的,而Vulkan
是没有这个版本号需要的。
如果不使用GLSL
语言编写,上述的#version
应该都不会在语法中出现。
Vulkan中的gl_GlobalInvocationID, local_size_x的理解
最近在学习Vulkan
,结果在查看示例代码的时候,对于如下两句出现了疑问:
首先是Invocation
这个单词的理解,计算机语言中他的意思是 "the act of making a particular function start
" ,中文意思是 "调用,启用
"。
其中
意思是初始化,X * Y * Z
个计算单元供我们的代码调用,可以简单理解成线程数。如果不设置这几个值,默认值是 1
,也就是只提供一个计算单元(线程)。
而使用如下的代码
意思是获取当前代码运行的计算单元的编号,也可以理解成获取当前线程的索引。
下面的代码都使用如下的命令编译成Vulkan
使用的SPIR-V
格式的代码
比如下面的代码,就是一个简单的利用gl_GlobalInvocationID
,进行并行计算的例子:
但是,如果传入的数组的大小超过我们设置的计算单元的数量的情况,上述的代码是处理不了的。
可以如下方式处理上述情况:
如果想动态调整计算单元的数量,增加处理灵活性,可以参考下面的代码:
外部通过
函数调用的时候,指定
参数中的
参数中的
参数中的
指定的数值来动态调整所需要的计算单元的数量。
整个参数的设置流程特别长,非常难掌握。具体的使用例子参考 Glavnokoman/vuh以及 Vulkan® 1.0.95 - A Specification - Khronos Group文档中的上述参数的使用例子。
如果内部不指定,也可以通过外部调用
的时候设置,但是这样的设置存在一定的灵活性问题,可能需要多个独立的ComputePipeline
来配合。
Android Studio 3.2.1编译Vulkan示例项目
最近在学习Vulkan
,根据Google
官方给出的文档,是存在一些问题的,总结一下:
如果代码下载不成功,可以本站下载一份拷贝。 点击这里下载 VulkanSamples vulkan-basic-samples
继续阅读Android Studio 3.2.1编译Vulkan示例项目
macOS Mojave(10.14.1)安装Vulkan依赖的工具链SPIR-V Toolchain
目前在研究学习Vulkan
,Vulkan
使用SPIR-V
工具链进行编译,在macOS Mojave(10.14.1)
中使用如下命令安装工具链:
但是,需要注意的是,使用HomeBrew
安装的版本,缺少部分功能,如果使用"-Os
"(代码大小优化)参数的时候,会报告错误,如下:
这是由于代码大小优化部分需要spirv-tools
执行,然而HomeBrew
编译的版本没有关联spirv-tools
导致安装的程序没办法使用这个功能。
如果需要这部分功能,我们只能手动编译安装:
继续阅读macOS Mojave(10.14.1)安装Vulkan依赖的工具链SPIR-V Toolchain