Parsing C++ in Python with Clang

macOS Mojave 10.14.2 llvm 7.0.1

参考链接


python - os.walk忽略隐藏文件

python中进行文件夹遍历的时候,使用os.walk是非常方便的,但是os.walk会把隐藏文件一起遍历,我们有时候需要忽略隐藏文件,可以用如下方法忽略隐藏文件以及文件夹

参考链接


python – os.walk没有隐藏的文件夹

使用ccache加速编译Android NDK项目

如果使用cmake构建项目,配置如下:

也就是定义NDK_CCACHE=ccache

如果使用ndk-build构建项目,配置如下:

也就是增加两个环境变量。

不指定缓存目录的情况下,缓存文件的目录一般在当前用户名下的.ccache目录下,时间长了,可能会产生很多的缓存文件,需要定时清理,当然也可以限制缓存的最大大小,让ccache根据需要进行淘汰。

参考链接


macOS Mojave(10.14.2)系统上编译LunarG/VulkanTools工程的Android版本

参考链接


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 C 1.2 Language on Vulkan

macOS Mojave(10.14.2) 编译KhronosGroup/SPIR项目的spir_12分支(llvm-3.2编译)

官方提供了一个名为 KhronosGroup/SPIR 的开源项目,支持OpenCL编译成SPIR代码的功能

注意: Vulkan使用SPIR-V也就是 spirv-1.0 分支,不使用此分支。本文实际上可以作为 llvm-3.2 在最新的 macOS Mojave(10.14.2) 上的编译指南。

这个工具使用的LLVM的版本非常古老,编译的时候问题多多。

这个工具在 macOS Mojave(10.14.2) 系统上使用 gcc 8.2.0 的编译流程如下:

如果使用 Xcode Version 10.1 (10B61) 编译会报告如下错误:

上述错误产生的原因在于 macOS 官方提供的 C++ 标准库中增加了校验 is_constructible (要求模版中的类必须明确构造函数和析构函数)这个逻辑,这个功能貌似在 C++ 14 中才加入的,显然这个校验有些操之过急了。

如果编译的时候出现如下错误信息:

则说明编译的时候,没有指定使用 macOS 官方提供的 ar , ranlib ,链接这两个程序到Xcode提供的即可。

如果编译的时候出现如下错误信息:

这是由于llvm/tools/clang/include/clang/Sema/AttributeList.h这个文件中的 ~AttributeList() LLVM_DELETED_FUNCTION; 这句话造成的,按理说这个析构函数不应该被调用到才对,但是代码中仍然有地方隐式调用了,我们需要做的就是去掉这行代码的 LLVM_DELETED_FUNCTION 属性即可。

 

编译完成后的使用方式如下:

  • <triple>: for 32 bit SPIR use spir-unknown-unknown, for 64 bit SPIR use spir64-unknown-unknown.
  • Note<OpenCL compile options> appears twice. The command line option -cl-spir-compile-options "<OpenCL compile options>" specifies the compile options that occur in the SPIR metadata.
  • <opencl_spir.h>: download opencl_spir.h from https://github.com/KhronosGroup/SPIR-Tools/blob/master/headers/opencl_spir.h
  • -O: -O0 (default) is the only tested option value at the moment. It's assumed by design that all optimizations are executed by SPIR consumer.

参考链接


macOS Mojave(10.14.2)使用"sed -i"命令时报错'sed: 1: "xxx": extra characters at the end of l command"'

最近在 macOS Mojave(10.14.2)使用"sed -i"命令时报错,类似如下:

刚刚遇到这个问题,百思不得其解。后来搜索了一下,才找到解释。

如下:

sed  -i 需要带一个字符串,用来备份源文件,这个字符串会加在源文件名后面组成备份的文件名。
如果这个字符串长度为 0,就是说是个空串,那么不备份。

这样 sed 不仅会修改文件,并且会生成一个 example.txt_nima 的备份文件。

如果不想备份修改前的内容,可以直接给个空参数,如下:

所以,上面的命令,我们需要修改成如下方式:

蛮扯淡的。

参考链接


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)的工具