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

null值在in/not in的陷阱

背景

在某个项目统计数据时,发现以外丢掉了部分数据,仔细查找,是null值在in/not in出现了判断问题。

问题

在统计数据时,需要去除某些值,使用了not in逻辑。

select null not in ('1', '2')

这行代码,要完成的逻辑是,null 不属于 '1' 或者 '2'。

想当然认为应该返回 true,实际上返回了null,null值映射为false。

最终统计丢失了这一部分null值。

继续测试

继续测试了各种null使用in/not in的例子

select null in ('1', '2', null);
select '3' not in ('1', '2', null);
select null not in ('1', '2');
都出现了与想当然不符合的结果

 

该问题的详细原理可以参考这篇文章 http://www.itpub.net/thread-1325582-1-1.html

小结

null值不应该参与in/not in逻辑判断。

 

macOS Mojave(10.14.2)系统上好用的Python调试器

以前在ubuntu系统上调试Python脚本,都是使用 Spyder,就是图标是一个蜘蛛网的软件。很好用!

Windows下都是使用 PyScripter 轻量,简便,好用。

但是迁移到macOS Mojave之后,没有找到比较好用的对应软件,后来发现微软开源的 Visual Studio Code 配合微软自己开发的 Python插件,是在macOS Mojave下调试Python脚本的利器。

具体的安装步骤如下图所示:
继续阅读macOS Mojave(10.14.2)系统上好用的Python调试器

基于Vulkan的GPGPU计算框架Vuh

发现一个写的比较好的基于VulkanGPGPU计算框架Vuhgithub上的代码地址为:

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默认是使用GLSLOpenGL Shading Language)语言,然后编译完成后的操作符被直接映射成Vulkan的定义操作符。

换句话说,我们只要执行如下命令,

能编译通过,就可以随意指定#version的版本。

这个版本号仅仅是GLSL语言在进行语法检查的时候需要的,而Vulkan是没有这个版本号需要的。

如果不使用GLSL语言编写,上述的#version应该都不会在语法中出现。

继续阅读Vulkan中的"#version 430 core"的理解

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来配合。

继续阅读Vulkan中的gl_GlobalInvocationID, local_size_x的理解

WordPress 5.0禁用古腾堡(Gutenberg)编辑器

最近升级到WordPress 5.0,这个版本的一个重要功能改进就是Gutenberg 编辑器,但是遗憾的是,这个版本的编辑器目前跟很多插件不兼容。我们只能是暂时禁用Gutenberg 编辑器,而是使用以前的经典版本的编辑器。

另外,目前试用来看,这个编辑器,也不好用。

最简单的办法就是安装官方提供的Classic Editor这个插件,如下图:
继续阅读WordPress 5.0禁用古腾堡(Gutenberg)编辑器