核心系统数据库组 褚霸(余锋) http://blog.yufeng.info 2013-5-7 CPU高效编程技术 核心系统数据库组 褚霸(余锋) http://blog.yufeng.info 2013-5-7.

Slides:



Advertisements
Similar presentations
什么是SOPC: SOPC是英文System On a Programmable Chip的缩写,称为片上可编程系统。SOPC将传统的EDA技术、计算机系统、嵌入式系统、数字信号处理等融为一体,综合了各自的优势,且在结构上形成一块芯片。 为什么用SOPC:SOPC是现代电子技术和电子系统设计的发展趋势,建立了电子系统设计的新模式。用户利用SOPC开发平台,自行设计高速、高性能的DSP处理器、特定功能的CPU及其外围接口电路,创建结构最为简洁的电子系统。
Advertisements

程序的执行 程序执行和指令执行概述 数据通路基本结构和工作原理 流水线方式下指令的执行
第 2 章 中央處理單元.
多核结构与程序设计 杨全胜 东南大学成贤学院计算机系.
环科系12级毕业实习动员会 -平安、感恩、责任
任科教师: 孟老师 办公室:二楼成教2 时 间: 14年5月 电 话:
Chapter 10 效能測量與分析.
C语言程序设计 主讲教师 :张群燕 电话:
新建本科院校 应用型人才培养若干问题探析 张德江.
Loops.
创新实验 课程说明 计算机学院 孙彤 计算机学院 张明.
我们会赞叹生命之花的绚丽和多姿,也会歌颂生命之树的烂漫和青翠,但是生命是如此脆弱……
第一章 C语言概述 计算机公共教学部.
資料庫設計 Database Design.
新世代計算機概論 第3章 電腦的系統單元.
编译原理上机实习
第4章 VHDL设计初步.
第四章 存储体系.
第4讲 企业财务管理.
C++程序设计 王希 图书馆三楼办公室.
單晶片原理與應用 魏兆煌 整理 南台科技大學 電機系 Sep
第 2 章 中央處理單元.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
CH2 開發環境介紹 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇.
CPU資料處理 醫務管理暨醫療資訊學系 陳以德 副教授: 濟世CS 轉
指令集架構 計算機也跟人類一樣,需要提供一套完整的語言讓人們跟它充分溝通,以完成正確的計算工作。
5 Computer Organization (計算機組織).
第2章 16位和32位微处理器 位微处理器8086/ 位微处理器80386
核心系统数据库组 余锋 了解内存 核心系统数据库组 余锋
Chapter 3 行程觀念 (Process Concept)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
CH.8 硬體管理.
Lesson 17 Renting an Apartment 租房子
第三章 栈和队列.
語法:Variables & Functions 實作:Digital out (Button+LED) 簡報:廖崇義
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
Ch9 Communicating with Hardware
逆向工程-汇编语言
C++语言程序设计 第二章 C++简单程序设计.
CPU结构和功能.
寄存器分配 影响程序速度的因素 cpu, register, cache, memory, disk
第三节 整数类型.
如何赢一个机械键盘
計算機概論 第3章 計算機組織與結構概觀.
CISC vs. RISC 複雜指令集電腦(Complex Instruction Set Computer: CISC)
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
資料庫 靜宜大學資管系 楊子青.
運動競賽制度 授課教師:鄭俊傑副教授.
第一次上机安排 第六周 第七周 周一晚(提高1、2,通信001~012) 周二上(通信014~085) 周四上(通信086~154)
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
Architecture and Systems 研究群 報 告 人:單智君 陳昌居 鍾崇斌 中華民國95年11月30日
第2章ARM/THUMB微处理器结构及指令系统
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
计算机系统结构(2012年春) ----存储层次: Cache基本概念
单片机原理与应用 主讲人:张荣刚 福建师范大学福清分校.
本节内容 字节对齐.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第二章 类型、对象、运算符和表达式.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
清华大学计算机科学与技术系高性能计算研究所 郑纬民 教授 2005年5月
變數、資料型態、運算子.
第2章 Arduino编程.
Presentation transcript:

核心系统数据库组 褚霸(余锋) http://blog.yufeng.info 2013-5-7 CPU高效编程技术 核心系统数据库组 褚霸(余锋) http://blog.yufeng.info 2013-5-7

微处理器的核心技术 流水线处理 运算器高速化 RISC和CISC 超标量执行 乱序执行 分支预测 缓存 多核心

了解处理器Nehalem E5620 长流水线 >= 15级 X86指令解释为微指令后乱序执行 等待执行的微指令放在Reserveration Station 多个ALU运算单元并发、乱序执行 Reorder Buffer中实现串行化 Instruction Retirement

Pipeline 示例:4级和8级的流水线

Intel的长流水线

Front End 读入x86指令, 每个时钟周期 16字节 x86指令解析为微指令(μop) 微指令(μop)缓存

乱序执行-1 寄存器重命名 分配临时寄存器 微指令进入保留站 发射指令 EU EU EU 各种运算 Load/Store

乱序执行-2 按指令顺序写出结果 指令生效,真正写入 内存和物理寄存器 存入临时寄存器 触发具有数据依赖的指令执行 EU中计算结果 Load/Store

指令量化分析 取指令,每个16字节/cycle X86指令解析为微指令 保留站到EU的Port,总共6个 简单指令3条/cycle P0,P1,P5到ALU单元 P2,P3,P4到Load/Store单元 Instruction Retirement,4条μop/cycle Dependency Chain长度

指令优化 长流水线 >= 15级 充分发挥Intel处理器乱序执行的能力 Branch prediction miss性能损耗大 减少/消除conditional branch Bit运算代替比较 Comvg指令代替比较 充分发挥Intel处理器乱序执行的能力 避免指令间存在long dependency chain 避免指令间隐性的依赖关系,例如对eflags的依赖

CPU内部各部件访问速度

充分利用寄存器 # define LZ4_COPYSTEP(s,d) A64(d) = A64(s); d+=8; s+=8; # define LZ4_COPYPACKET(s,d) LZ4_COPYSTEP(s,d) #define LZ4_WILDCOPY(s,d,e) do { LZ4_COPYPACKET(s,d) } while (d<e);

位运算 int r; if (!(val>>32)) { r=4; } else { r=0; val>>=32; } if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } r += (!val); return r;

并行执行 *op++ = *ref++;

消除Conditional Branch 如何消除这个if语句 if (a < b) { r = c; } else { r = d; Bit运算版本1 int mask = (a-b) >> 31; r = (mask & c) | (~mask & d); Bit运算版本2 r = d + mask & (c-d); cmovg版本 r = (a < b) ?c : d;

分支可能性提示 #define likely(expr) expect((expr) != 0, 1) #define unlikely(expr) expect((expr) != 0, 0) while likely(ip<matchlimit-(STEPSIZE-1)) { … }

The Blocking Technique

The Blocking Technique // Increasing memory usage improves compression ratio // Reduced memory usage can improve speed, due to cache effect // Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache #define MEMORY_USAGE 14 #define HASH_LOG (MEMORY_USAGE-2) #define HASHTABLESIZE (1 << HASH_LOG) struct refTables { HTYPE hashTable[HASHTABLESIZE]; };

memchr magic_bits = ((unsigned long int) 0x7efefefe << 32) | 0xfefefeff; /* Set up a longword, each of whose bytes is C. */ charmask = c | (c << 8); charmask |= charmask << 16; charmask |= charmask << 32; /* Instead of the traditional loop which tests each character, we will test a longword at a time. The tricky part is testing if *any of the four* bytes in the longword in question are zero. */ while (n >= sizeof (longword)) { longword = *longword_ptr++ ^ charmask; if ((((longword + magic_bits) & ~magic_bits) != 0) … }

memchr续 { const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); if (cp[0] == c) return (__ptr_t) cp; ... if (cp[7] == c) return (__ptr_t) &cp[7]; } n -= sizeof (longword);

False sharing

对齐cacheline typedef union { GFAllctr_t gfa; char align_gfa[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(GFAllctr_t))]; } ErtsAllocatorState_t; char *states = erts_sys_alloc(0, … + ERTS_CACHE_LINE_SIZE - 1)); states = ((((UWord) states) & ERTS_CACHE_LINE_MASK) ? (char *) ((((UWord) states) & ~ERTS_CACHE_LINE_MASK) + ERTS_CACHE_LINE_SIZE) : (char *) states);

perf list RAW HARDWARE EVENT DESCRIPTOR Even when an event is not available in a symbolic form within perf right now, it can be encoded in a per processor specific way. For instance For x86 CPUs NNN represents the raw register encoding with the layout of IA32_PERFEVTSELx MSRs (see [Intel(R) 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide] Figure 30-1 Layout of IA32_PERFEVTSELx MSRs) or AMD's PerfEvtSeln (see [AMD64 Architecture Programmer's Manual Volume 2: System Programming], Page 344, Figure 13-7 Performance Event-Select Register (PerfEvtSeln)).

致谢 部分图片和代码来自鸣嵩 《treelink比赛分享》

Gtalk: mryufeng@gmail.com 多谢大家! Questions? QQ:526275 新浪微博:@淘宝褚霸 Gtalk: mryufeng@gmail.com