分类目录归档:计算机体系结构

ChakraCore Var数据类型指针疑惑

我最近看ChakraCore的源码做CVE分析的时候,一直不知道为什么Object Array能存储所有类型的对象。对于Native Value,它在高16位打Tag直接存进void * ,对于Object Pointer,它在void * 存入原封不动的指针。判断的时候,用SHR右移48位,看剩下的高位是否为0,若不为0,就是Tagged Native Value,否则就是Object Pointer。

今天分析CVE的时候突然想明白了48位是怎么定出来的了。因为x86_64现在的Virtual Address Size是48位。而且还有一个原因是,x86用户态的Canonical VM Address高16位是0000h开头。换个架构,这玩意貌似就不适用了。也没准随着Arch发展一下,VA Size增大一些,ChakraCore就彻底倒闭了。

注:微软不支持,应该已经倒闭了。

计算机科学与技术一级学科二级专业分类

1、计算机系统结构

  • 并行与高性能计算
  • 分布式系统
  • 存储系统
  • 多核/众核编程系统
  • 处理器微体系结构
  • 大数据与云计算
  • 计算机网络体系结构
  • 网络科学与大数据
  • 网络与系统性能评价
  • 路由与交换
  • 网络与信息安全
  • 密码理论与网络通信编码
  • 网络管理与测量
  • 移动互联网与传感网

2、计算机软件与理论

  • 数据管理与知识工程
  • 数据挖掘与知识发现
  • 电子系统设计自动化方法与软件
  • 智能系统与物联网安全
  • 可信芯片设计方法及软件
  • 计算机算法与复杂性
  • 量子计算与量子信息
  • 理论计算机科学

3、计算机应用技术

  • 机器学习理论与应用
  • 互联网智能信息处理
  • 认知与神经计算
  • 智能控制与机器人
  • 生物信息与计算生物学
  • 计算机视觉
  • 计算机图形学与可视化
  • 网络多媒体与社会媒体
  • 普适计算
  • 人机交互

CUDA上的自旋锁(SpinLock)实现问题

最近在研究CUDA。其中有一个需求是要对一段代码加锁。CUDA里只提供了现成的对单个变量进行操作的原子操作库[1],而没有提供对一段代码加锁的机制,于是我就想怎么改造一下这个原子库。

一开始自己写了一段代码,差不多是这个样子的[2]。

1
2
3
4
5
6
__device__ inline void lock(int* p_mutex ){
    while(atomicCAS(p_mutex, 0, 1) != 0); // compare and swap
}
__device__ inline void unlock(int* p_mutex ){
    atomicExch(p_mutex, 0);// exchange
}

调用了之后发现从加锁的循环里压根就跑不出来。自己想了半天死活也搞不懂。然后从StackOverFlow上查到资料。发现这个和CUDA的Warp有关[3]。每个Warp由32个线程组成,它们必须同时执行相同的指令。如果用上述代码实现自旋锁。假定Warp中有一个Thread获得了锁,需要向下执行才能够释放锁。但是其他Thread却没得到锁,因此整个Warp就不能向下执行,始终卡在while循环里形成死锁。这种死锁叫SIMD死锁(SIMD DeadLock)。

之后翻了一大堆文献和网站,里面成堆的人都是实现同上,没有一个能用的。最后翻到了这篇文章[4],解决了问题。整理出的自旋锁的模板如下:

继续阅读