Tablegen Language Tutorial

Tablegen Language Tutorial

很难想象,网络上竟然搜索不到可以称为"教程"的Tablegen资料. 唯一可靠的资料是官方的ProgRef, 作为一个Reference, 它是非常合格的, 详尽而精确, 但是如果把它作为教程来阅读, 则有一些缺点:

  1. 过于详尽, 即便是一些不太重要的特性,也需要用完整精确的内容来描述.
  2. 过于严谨, 即便是一些简单的特性,也需要用严格的方式来描述,比如 EBNF 风格的 syntax notation,
Read More

Lit and FileCheck

Lit And FileCheck

LitFileCheck 是 LLVM 测试中常用的工具, 尽管二者功能上是完全独立的,但是搭配起来使用会显得更加方便.

Lit

Lit总的来说仅仅是一个 test-launcher, 它的主要功能就是发现测试,执行测试,收集结果.

"发现测试"主要依赖于lit.cfg(或lit.site.cfg)文件标记来实现, … Read More

比较运算符, Min, Max, Sort 和 Order

惭愧,突然发现又是没有blog的一年。这一年不断在尝试搞大新闻,写点大东西,到现在也没憋出来。倒是又在学习新东西的过程中看到了一些零碎的小知识,很有意思.

很巧,这个也是和比较运算符相关的,和一年前的blog竟然有所重合。

还是先上结论: 当需要为类型T定义比较运算符时,所有运算符最好保证语义整体一致
* 一般来说,这很容易达到,我们只需要实现operator<(lhs,rhs),即可引申定义出其余几个比较运算符.
* 定义operator<=!(rhs < lhs)
* 定义operator>rhs Read More

IEEE 754 的 inf 比较问题

首先上结论: 当涉及浮点数比较时,一定要考虑比较符号两侧都是inf的情况.

原因: inf==inf,inf<=inf,inf=inf 这三个比较都为真(-inf同理),而这种结果可能与我们的期望不符.

解决方法:
1. 如果为真是可以接受的,那么直接使用比较运算符,例如a<=b
2. 如果为真是不可以接受的,那么应当使用作差,例如(a-b)<=0, 这种情况下,当a和b都为inf时,inf之间的运算会输出NaN,从而导致比较结果为false

例如,我有这样一个应用场景:

有射线R和两个平面S0及S1,我们需要求射线R与平面S0的交点p0,以及射线R与平面S1的交点P1. 且要求p0不能比p1离射线起点更远(可以重合)

假如我们用直线的参数方程来描述交点,显然,上面的目标很容易用 t0<=t1 … Read More

CSAPP-记录

  • Question In CSAPP:
    • switch比if-else高效吗?
    • switch可能更高效,比较相关的开销移动可能会移动到编译期.
    • while比for高效吗?
    • 二者相同
    • 指针比数组索引更高效吗?
    • 二者相同
    • 为什么在求和时,将结果存在本地变量中要比存储在传入的指针中更快?
      • 本地对象一般是在寄存器中, 而通过指针IO时,可能会触发内存操作
    • 为什么表达式的求值顺序会影响性能(括号的位置)
      • 限定求值顺序会影响编译器的优化.
      • 限定求值顺序有可能会改善内存访问的模式.
    • 函数调用的开销到底有多大?
    • 现代编译器中,一般可以忽略,部分toolchain甚至有链接期inline的机制.(用栈来模拟递归通常是得不偿失的,损失的可读性要远大于性能的微弱提升)
    • 主要是需要避免系统调用,系统调用将触发context switch
    • 为什么有些链接错误是在运行时触发的?
Read More

KD树与SKD树

KD树与SKD树

首先给出两个搜到的有点内容的KD树文章,论述的比我说的更完整(更冗长),可以先看,也可以看完本文再看.
* https://www.zybuluo.com/l1ll5/note/967681
* http://www.whudj.cn/?p=920

主体思想

  • KD树和SKD树都使用坐标轴对齐的最小包围盒来描述空间.
    • 例如,平面内,一堆点的点集对应的空间可以用点A=(min(all_x),min(all_y)),B=(max(all_x),max(all_y)) 对应的矩形空间来描述. 当点的个数变为1时,这个矩形空间也会自然地退化为一个点.
  • 构建时的主要思想: 每个节点
Read More

设计模式

For C/C++ user

很多设计模式相关的资料都是用Java来描述的,有必要简单补充一下JavaC++OOP技术层面上的区别

  • Java不支持任何形式的运算符重载
  • Java明确区分接口和类,类只能从一个类派生,但是一个类可以实现多个接口
  • 在Java中,所有方法默认是虚(virtual)的
  • 对CPP而言,Java风格的接口可以视为一个只有pure virtual
Read More

QT5编程基础

QT Module中的Qt Core和Qt GUI是唯二有必要仔细学习的部分, 这两部分涉及了QT的所有核心功能, 其余部分都可以在此基础上现学现卖.

本文主要介绍QT中比较重要的机制,其他知识相对来说都很独立,可以直接现学现用.

QT开发基础

  • Qt的很多特性都使用到了thread_local变量, 在多线程环境中,与QObject相关的功能只有两种保险的策略.
      1. 不直接跨线程使用QObject对象
      1. QObject
Read More