• 理解Memory Order

    经典计算机指令的先后顺序往往也意味着逻辑关系,我们总是会直觉性的认为程序指令是从上到下一个个执行的。虽然这种直觉在很多场景下是没有问题的,但真相不止于此。如果你对memory order这个概念还不是太了解,下面这个test应该会带来一点“惊喜” ^_^

    // 代码段1
    // store-buffering校验
    P0(int x0, int x1)
    {
        int r2;
        WRITE_ONCE(x0, 2); r2 = READ_ONCE(x1); 
    }
    
    P1(int x0, int x1)
    {
        int r2;
        WRITE_ONCE(x1, 2); r2 = READ_ONCE(x0); 
     }
    
    exists (1:r2=0 / 0:r2=0)
    

    这个test的形象使用场景是——两个线程各自持有一个buffer,业务逻辑是写一次自己的buffer后读一下对方的buffer。P0和P1分别代表在两个处理器上跑的逻辑(刚开始x0,x1… 【查看更多】

  • LLVM IR简介

    对于LLVM这样的编译框架来说,IR是非常重要的。LLVM IR(Intermediate Representation,中间表示)连接着编译器前端和编译器后端。IR的设计很大程度体现着LLVM插件化、模块化的设计哲学,LLVM的各种pass其实都是作用在LLVM IR上的。同时IR也是一个编译器组件接口。通常情况下,设计一门新的编程语言只需要完成能够生成LLVM IR的编译器前端即可,然后就可以轻松使用LLVM的各种编译优化、JIT支持、目标代码生成等功能。

    LLVM IR的表示形式

    LLVM IR有三种形式:

    内存中的表示形式,如BasicBlock,Instruction这种cpp类;
    bitcode形式,这是一种序列化的二进制表示形式;
    LLVM汇编文件形式,这也是一种序列化的表示形式,与bitcode的区别是汇编文件是可读的、字符串的形式。
    内存中的IR模型

    内存中IR模型其实就是对应LLVM实现… 【查看更多】

  • 读《传习录》之【答罗整庵少宰书】

    前记:最近读到这篇文章,实在是非常精彩,因此记录一下。

    文章的背景应该是罗整庵和王阳明通信,罗质疑了王阳明的一些观点,王阳明为此做了一些回应。在看这篇文章之前,我并不知道罗整庵。查了下才知道,也是一位非常厉害的人。大概是在当时的思想圈里可以和王阳明分庭抗礼的人物。而且从王阳明的行文语气来看,可以猜测罗当时的地位(政治地位或者学术地位)是高于王的。两位都是明朝杰出的哲学家,但他们的思想却并不一致。这也是为什么我会觉得这封信非常有看点。

    1. “见道固难,而体道尤难。道诚未易明,而学诚不可不讲。恐未可安于听见而遂以为极也。”这个质疑其实挺直接的,可能罗认为王比较固执己见。
      对此,王阳明首先表达了感激之情,他说他提出自己的学说以来,常常被人嘲讽、辱骂或者不屑一顾。但是为他着想、提出建设性意见的人却非常少。
      然后,王阳明表示自己并没有那么狂妄,并说他
    【查看更多】
  • [量子计算]相位估计算法

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    量子相位估计算法

    量子相位估计算法(Quantom Phase Estimation)也称作量子特征值估计算法,是一个比较基本的算法。它的作用直观说来就是来估计一个酉变换的特征值。由于酉矩阵拥有一个性质:酉矩阵的特征值都是模为1的复数。所以对酉矩阵而言,其特征值和相位基本是对等的(因为模长已经确定了)。

    量子傅里叶变换

    在量子相位估计算法中,需要使用到量子傅里叶反变换。因此,我们简单了解一下量子傅里叶变换的相关知识。经典的离散傅里叶变换作用于一个复向量(x_{0}, x_{1},\cdots,x_{N-1}),并把它映射到另一个向量(y_{0}, y_{1},\cdots,y_{N-1}),其映射关系如下:

    y_{k}=\frac{1}{\sqrt{N}} \sum_{j=0}^{N-1} {x_{j}e^{-2\pi ijk/N}}【查看更多】

  • 简单分析ARCore和SceneForm

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    从ARCore去年下半年发布到现在已经半年有余了。之前其实一直有点手痒,想玩玩AR应用开发。之前有参考一本书,玩过一个简单的基于OpenCV和OpenGL的AR应用,但的确太简陋了。然而之前ARCore只支持Pixel之类的亲儿子手机,所以一直没有机会把玩一下。前两周偶然发现mix2s已经支持ARCore了,所以就乘放假的机会玩玩demo,分析一下ARCore的应用开发。

    ARCore支持Java, C, Unity以及Unreal这几种开发方式。在最近的Java SDK中新增了SceneForm api来支持渲染。这确实是一个比较大的进步,毕竟裸写OpenGL还是有点麻烦的。本人没弄过Unity和Unreal这些渲染引擎,所以就从Java SceneForm的SDK入手了,毕竟比较熟悉(其实就是懒)。

    虽然前文废话已经说了不少,… 【查看更多】

  • 关于Fuchsia OS的一些思考

    fuchsia

    去年年中的时候,就听说了Fuchsia。不过当时也没特别关注,毕竟Google对OS的执念很重,一不开心就启动一个新的OS项目。这几天官方公布了Fuchsia的一部分文档,这个文档目前还不太全面,不过也能粗略了解一下Fuchsia吧!限于个人水平有限,博文不免会有错误,还望多多指教。

    一、“瞎掰向”分析

    对于顶级IT公司来说,“操作系统”一直是一个独特的东西。从正面看,操作系统意味着生态系统、用户粘性。所以OS成就了很多公司,Solaris之于Sun,Windows之于微软。然而成功背后总有很多失败,而做OS的风险非常之大,强如微软和Facebook,都在移动操作系统领域一败涂地。

    Google作为一个后来者,Andriod目前在移动市场的份额已经非常成功了。即使在美国,iOS【查看更多】

  • 线程同步技术之RCU

    本文出自:【InTheWorld的博客】

    多核程序设计其实挺困难的,就拿RCU(Read-Copy-Update)技术来说,我现在已经不知道自己看《深入理解并行编程》的RCU多少次了。到现在为止,还是有一些东西没有完全理解。这篇blog算是对我所领会到的RCU知识的暂时性总结。

    • RCU背景

    从个人的理解来讲,RCU其实是对rwLock的一种优化。从不区分读写的粗粒度锁到读写锁,然后到RCU机制,这就体现着并行程序设计的不断演进。rwLock的思路是,多线程读取不存在同步问题,所以放宽了读取锁,提高了并发读取的效率。而RCU的思路是,维持临界区多个版本(完整的非中间版本),同时取消读取锁,这种优化将会进一步的提高读取效率。事实上,在多数的多线程应用场景上,读取频率都是远远大于改写频率的。特别是在Linux内核中,很多全局数据结构会被同时读取,其次数远高于写入次数。

    image

    Figure… 【查看更多】

  • 基本线程同步总结(C与Java)

    本文出自:【InTheWorld的博客】

       《Posix多线程程序设计》是我读的第一本关于多线程程序设计的书籍。这本书生动且深刻地讲解了多线程程序设计的难点与Pthread库的使用方式,我从中收获颇丰。Pthread作为操作系统接口标准,直接用于应用层开发难免会让人感觉到有些单薄。Java对多线程程序设计模式进行了一定的封装,以方便大家的使用。然而在基础功能上,Java的多线程程序与Pthread其实非常相似,这也是这篇blog是使用这个标题的原因。

    • Mutex(Pthread) vs Lock/synchronized(Java)

        Mutex是Pthread提供的最基本的线程同步工具,Mutex的功能突出一个简单粗暴,类似于操作系统中的自旋锁(当然,Mutex会【查看更多】

  • RxJava设计原理与解析<2>

    本文出自:【InTheWorld的博客】

    在上一篇blog中,我们通过一个简单的例子探索了RxJava的设计原理。而这篇博客的主要内容是研究RxJava的高阶算子。然而,RxJava中的高阶算子非常之多,每一个分析是不太现实的。所以,这篇文章的内容主要以map和flatMap为例,分析一下RxJava中算子的实现方式。

    • map算子的原理

    image

    有过函数式编程语言学习经验的同学大概对map算子都不会感到陌生。即使没有学习过functional programming,也大概听过MapReduce。map算子的功能是把一个值作为输入,对应地输出一个值,实现了
    “一一映射”的功能。在RxJava中,map的简单用法如下:

     Observable simple = Observable.just( 2, 3, 5, 8);
        Observable duplicate = simple.map(v -2*v);
        duplicate.subscribe(
    【查看更多】
  • Qt on Windows实现解析

    就窗口系统而言,我对C/S架构的更为熟悉一些。以前看过基于X window的一些实现,比如qtopia以及其他一些嵌入式窗口系统。C/S架构的GUI系统的结构比较清晰。其中,窗口服务器负责监听输入时间、屏幕绘制以及窗口状态维护,应用程序负责接收服务器的消息并进行处理、并把状态改变反馈给窗口服务器等。

    但是,Windows窗口系统使用的却是基于共享库的实现方式。共享库中保存着所用图形客户端的窗口信息,共享库和每一个客户端程序都运行在同一个进程中。基于共享库的图形系统具有响应速度快、资源开销小的优点,这也是Windows窗口系统表现非常优秀的原因。这种窗口系统带来的问题就是对共享信息访问的安全性。

    在虚拟内存管理的前提下,对这些共享信息的访问无疑要借助内核态的帮助。Windows下的图形应用之所以需要提供回调函数,是因为这个… 【查看更多】