- 博客(78)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 一图说明tensor and pipeline model parallelism
self-attention是按照multi-head attention,两个GPU一边一个head计算各自出半个Y,然后各自半个Y再跟row tiling的B算出结果矩阵中50%的psum,然后两个GPU all-reduce做一下加法在两个GPU都合成出最终结果。其中MLP是A按列Tiling成两半,两个GPU各出半个Y,然后各自半个Y再跟row tiling的B算出结果矩阵中50%的psum,然后两个GPU all-reduce做一下加法在两个GPU都合成出最终结果。
2024-04-07 16:14:25
326
原创 训练-backpropagation
f(x,y)=xyx和y方向偏导(derive the partial derivative):最终就有可视化起来,(x+y)*z的back propagation会是这样的;是不是跟数字电路、神经很像。
2024-04-03 19:36:56
671
原创 Cache Coherent的代价
1. 有,可能独占可能share,CPU1的addr0状态变share,然后返回exclusive或share,然后CPU0读数据,这里是允许CPU0抢先读数据的(就是不用等CPU1返回,CPU0就读回数据来,等CPU1返回了再决定数据能不能用)CPU0和CPU1都Cache了addr0的数据,CPU0改掉了addr0的数据,但CPU1并不知道,然后CPU0给CPU1发了个内部中断,通知CPU1接收addr0的更改,结果CPU1看了看addr0,摇了摇头。真是不知道咋解决的。好像也是可以无的吧?
2024-03-21 21:40:05
744
原创 PASID 2022.3.7
1. 我认为的PASID意义无论在PF还是VF,PASID都是为了使Device(DMA/XPU)具备直接访问Host用户态进程内存空间的能力;在AMD和ARM,PASID都是通过与PRI/ATS合作,完成SVA(Shared Virtual Addressing),使设备具备与进程能共享虚拟地址空间。2. 为什么不将设备内存mmap到用户态,提供给用户使用PASID是使能Device master→Host DDR过程使用进程地址空间3. 我查到的PASID的应用状态。
2024-03-21 17:42:31
1186
原创 照着PCIe 4.0 spec的目录写点东西 2021.1
高中有个挺不错的历史老师教给我们,看书不要先进入内容,要整本书都看以下再开始方的不片面。这个习惯我一直延续到现在,现在下定决心要解PCIe 4.0的spec,并且我对PCIe 4.0的熟悉程度远不如ARMv8 spec一般,所以还是按老路子走,先从目录和名词解释开始,虽然其实内容已经看过两章了。。。现在的PCIe的标准主要是一个叫做PCI SIG(Special interest group如果我没记错的话)的组织维护的,PCIe base specification 4.0 v1.0有1293页。从目
2024-03-21 17:25:59
974
1
原创 对VIPT PIPT VIVT这个事儿不能有局限性 2024.3
VIPT PIPT VIVT这几种Cache命中形式、Cache索引形式当然都是有非常多非常详细的解释,如果需要科普请直接在地址栏输入百度并回车。无非就是这仨大哥谁好谁不好,啥啥啥有缺陷,但在这里我要写的是一点其他的:好或不好其实都有用。
2024-03-20 17:47:16
1272
原创 ARM和RISCV的barrier指令设计的思考 2024.3
回到最初的barrier设计的初衷,我们假设一个3G Hz主频的CPU,在访问cache的时候,可能只需要1个HZ,而在访问DDR的时候,需要等待100Hz-200Hz才能返回结果是是很稀松平常的事。而连续的data barrier是可以很容易的将CPU性能打到30M的(单片机),3G Hz的CPU只有30MHz的性能是多么可怕的事情,为了在这100Hz中减少CPU流水停滞,CPU在设计上会尽可能的将load/store早的发出,在load/store返回之前执行与此无关的指令。
2023-06-29 11:14:13
547
原创 x86在虚拟机里对由另一个线程atomic修改的变量polling,出现了长时间拿不到更新的变量数据的情况,不知为何?
改由__atomic_load()之后可正常获得更新后的变量值。
2022-05-29 00:02:19
247
原创 对比线程,一个VCPU是什么
1. VCPU是线程不?2. VCPU的线程是在用户态创建还是在KVM创建?3. 进入Guest代码的点?4. 退出Guest代码的点?5. VCPU的调度与用户线程的调度有何不同?7. 那么EL1的特殊寄存器集合是如何在每次context切换中保存/恢复的:
2022-05-28 23:59:47
1498
1
原创 __kvm_hyp_vector如何成为最终的EL2异常向量表
对于无VHE的情况 1. kvm_get_hyp_vector会给出__kvm_hyp_vector(A12/17/15似乎有不同的处理) 2. kvm_arch_hardware_enable->_kvm_arch_hardware_enable->cpu_hyp_reinit->cpu_init_hyp_mode-> __cpu_init_hyp_mode->kvm_call_hyp(pgd, stack, vector) 需...
2022-05-28 23:57:54
695
原创 从两个独立地址空间发起的对同一物理地址的atomic操作,是否会有效?
分析:atomic操作是ldrex/strex之类的指令,基于MESI或类MESI协议, 而MESI对与cache一致性是基于物理地址实现(如invalid), 所以,如果两个独立地址空间中映射同一个地址,那么这个地址就应该可以被atomic...
2022-05-28 23:56:16
183
原创 Qemu class和instance(存在其他更优秀的文档解释此命题,请自行搜索)
1. Qemu的type_init是在constructor属性中执行的,也就是在main之前,也就是所有type_init的设备都会在main之前执行其type_register_static;2. type_register_static会malloc TypeImpl数据结构,存放class_init/instance_init等回调函数和class_size/instance_size; 需要重点说下class_size:这是所注册设备Class数据结构的sizeof,比如 ...
2022-05-28 23:54:21
596
原创 为了在内核中可靠的持有一个进程,分析一下PID
出现一个新的pid的时机是在创建或操作进程;在较新的内核中,描述进程pid这个事儿由于掺杂了namespace变得复杂;以Flag CLONE_NEWPID为界,决定在create_new_namespace时,是否创建一个新的pid_namespace问题:PIDTYPE_PID/PIDTYPE_PGID/PIDTYPE_SID这几个不同的type的处理
2022-05-28 23:48:44
363
原创 CRIU内核补丁分析
1. 将procfs的proc_get_link中使用的inode传参改为dentry传参2. 在procfs添加/proc/pid/map_files/目录用于建立本进程到其所用动态库、进程的二进制文件的软链接,以文件在内存映射的VA地址段即文件名2.1 当dump一个进程的映射的时候,需要确切的知道其所用的二进制/动态库文件的映射地址,添加了map_files目录可以直接拿到这些映射2.2 用map_files做对比,也可以确定出此进程共享的匿名映射2.3 当restore一系列进程,这
2022-05-28 23:35:51
658
原创 Qspinlock的分析(仅分析快速获取部分,剩下部分是mcs锁的原理)
pending的加入使qspinlock对3竞争状态有极好的适应性A lock B pending C watch wait until timeout
2022-05-28 23:35:11
416
原创 Needleman–Wunsch algorithm
尼德曼-翁施算法这是一种对两个序列的相似性进行对比的算法(比如基因序列对比、蛋白质序列对比)偶尔看到一个硬件spec上有写对smith-waterman算法的优化,然后好奇学习了一下,结果就看到了它的爷爷needleman-wunsch算法。简单记录一下1. 对于两个序列首先形成如下带空行、空列矩阵,头一个空格置0GCATGCGGATTACA G C A T G C G 0 -1 -2 -3 -4
2022-05-28 23:32:09
1144
转载 霍夫曼编码的透彻示例
之前认真学过霍夫曼编码,但是时间一长又有点遗忘,偶然在维基百科看到霍夫曼编码的介绍,看到了一个很经典的示例,忍不住复习一下并裁剪过来以备再查,这是详细全文链接。霍夫曼树常处理符号编写工作。根据整组资料中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长。假设我们要给一个英文单字"F O R G E T"进行霍夫曼编码,而每个英文字母出现的频率分别列在下图。演算过程(一)进行霍夫曼编码前,我们先创建一个霍夫曼树。⒈将每个英文字母依照出现频率
2021-03-02 11:16:19
2475
2
原创 Hypervisor这个层次对TLB的使用与EL0/1比有限制吗
我在利用虚拟化这篇文章中出现了一个错误,这是一个不起眼,但是细思恐极,再细思安心的错误,我有这样一句话:对于在EL2中,这条尤其重要,很多cortex都会有IPA-PA相对于VA-PA的缩水,所以EL2中的代码要怎么做也是需要思考的问题。当然,现在我已经在这段话后面添加了一些解释,表述了自己的错误,我之前想当然的认为了:1阶段页表的虚拟地址是VA,对应EL1/0所用的地址,2阶段页表的...
2020-03-27 10:02:20
766
原创 iptables的背后
每次修改iptables为子设备做转发上网都要瞎搜索很久,iptables太踏马的复杂了,这次搜索完我一定要写点东西记住哪条规则让子设备上了网。背景:一台独设备A,只连接B设备;一台能上网设备B,有网卡与A连接;B设备B1网卡与A设备连接;B设备B2网卡上外网;完毕。目标:A设备上外网;完毕。实施:1. iptables的PREROUTING确保通常(一...
2020-03-13 20:27:32
1427
原创 GICv3-4宏观视图
按照主题来讲,首先是GIC本身这个大主题的拆解。从功能器件来看GICv3-4已经开始对虚拟化提供大量支撑,从物理硬件上,按照功能器件可以拆解成:Distributor、ITS、Redistributor、CPU interface的集合。先将图给出来:Distributor其中Distributor连接外设承载SPI(Shared Pheripheral Interrupts)...
2020-03-13 20:26:31
2542
11
原创 原子操作、MESI和内存屏障引起我对锁理解的智障2020.3
前言:先向已经贡献大量公开文档的前辈们致敬,不管是中文的、英文的;再鄙视一下ARM文档中关于DMB之类的文字,赤裸裸的鄙视,我截一段大家感受下:“The DMB instruction ensures that all affected memory accesses by the PE executing the DMB instruction that appear in program ...
2020-03-09 11:09:36
946
2
原创 内核中的DRM词汇解释
AGP(Accelerated Graphics Port)一种高速总线,允许图形卡从系统内存读数据,基于GART使不连续的内存在图形卡眼中作为连续处理,并使用DMA传输(还记着scatter-gather模式)。GART(Graphics Address Re-Mapping Table)我的理解就是IOMMU/SMMU之类的东西,外设的页表,然后外设可以访问不连续内存。GTT...
2020-02-28 15:32:52
743
原创 DRM的GEM
GEM(Graphics Execution Manager)主要完成:内存申请释放、指令执行、执行命令时的光圈管理(what?!)。缓存对象的申请主要与linux提供的shmem层相关。设备相关操作如指令执行、pinning、buffer读写、映射、域所有权的转移等,还是归设备驱动的ioctl。初始化使用GEM的驱动必须在struct drm_driver->driver_feat...
2020-02-28 15:32:03
6145
2
原创 三代DRI的变化
DRI1首先要说,DRI1已经不在考虑使用了,这里说一下它的原理:DRI1由于当时图形卡内存大小,只有一个屏幕front buffer+back buffer由所有DRI clients和X server使用,front buffer和back buffer就像现在显示系统的双缓冲一样,所有要做渲染操作的实体都直接渲染到back buffer,然后执行swap就更新画面,front变bac...
2020-02-28 15:30:34
2253
翻译 重用page->mapping
翻译自LWN.NET因为要在struct page这一小段内存中填入最大量的信息,linux kernel中的结构体page是最复杂的结构体之一。struct page中每一个区域都重度过载,开发者们都倾向于:若能避免,绝不对struct page做修改。不过,这并没有阻止JérômeGlisse在2018年Linux存储,文件系统和内存管理峰会的两次全体会议上提出重大更改的建议。建议提供了一...
2020-02-28 15:11:34
1066
翻译 向struct page里塞更多东西
翻译并篡改更新自LWN.NET 2013年8月的一篇文章。通常,内核开发人员更倾向于设计可读性和可维护性高的数据结构。当人们理解一段代码使用的数据结构时,对代码本身的理解通常就不会遥远。因此,内核使用最频繁的数据结构之一也是其可理解性最差的之一,这个事实可能会令人惊讶。这个数据结构就是struct page,代表物理内存的页面。最近的一个补丁集,使struct page更加复杂,当然,这也为快...
2020-02-28 15:10:58
343
原创 信息量爆表的struct page->flags
先把kernel4.15的一段注释截图送上:很明显我关注的是之前crash中0x1ffff0000000000与0x5ffff0000000000的含义,然后再来一个神级大图:上面这个图很不错,但是对于不同的平台通过配置了.config中的参数如CONFIG_NODES_SHIFT、CONFIG_NR_CPUS等,flags中各段占据的字节数和bit分段点是不一样的,不过安排的顺序...
2020-02-28 15:10:22
634
原创 struct address_space解读
首先说的是Page Cacheaddress_space的操作将“文件”的某些部分映射到Linux page cache中的页面中。此page cache表示已映射到内存的某些物理设备(例如磁盘)上的数据。物理设备通常对应于磁盘,但不一定必须如此。以这种方式,page cache包含来自最近访问的“文件”的整个页面。在页面I / O操作(例如read()])中,内核检查数据是否驻留在page ...
2020-02-28 15:09:36
2066
原创 linux外设虚拟化的几个概念
VFIO(Virtual Function I/O)这是一个设备直通的方案,与Xen中的passthrough概念是一致的;主要是基于IOMMU和中断重映射,将制定的一个或几个设备安全的分配给某一个虚拟机使用,注意,是分配给单个虚拟机使用,它是在硬件支持的情况下解决单个设备多个虚拟机的问题。它是通过在硬件支持虚拟化如SR-IOV等特性的时候,将SR-IOV虚拟化出的物理设备实例直接映射给虚拟机...
2020-02-28 15:07:03
1510
原创 SMMUv3(2)
流的编号做一次转换需要地址、size以及相关属性如读/写/安全域/非安全域/可共享性/可缓存性;如果超过1个client设备使用SMMU流量,那么他们还要有StreamID来区分;StreamID在系统里的构建传送是具体实现决定的,逻辑上讲,一个StreamID就关联到一个发起转换的设备。物理设备到StreamID的映射必须描述给系统软件,ARM推荐StreamID用密集命名空间,从0开始;每...
2020-02-10 20:35:40
3320
12
原创 SMMUv3 (1)
一些词汇。DVM: Distributed Virtual Memory,相互传递广播TLB维护操作的消息的协议;RC: PCI-E的Root Complex,如下图:Endpoint(EP): 一个PCIE功能,用于一个SMMU client节点设备的contextPASID: Process Address Space ID,一个PASID是一个Endpoint的本地ID,...
2020-02-10 20:34:32
5630
原创 GICv3-4零散的寄存器解读(1)
ICC_SRE_EL3:控制EL3下选择系统寄存器接口,或内存映射接口,作为GIC CPU接口;(非正规表述就是对ICC_*/ICH*寄存器的访问是通过寄存器接口还是内存映射接口,如果使用内存映射接口,则访问寄存器会发生异常,并被本异常等级捕获) bit3 Enable:使能低异常等级对ICC_SRE_EL1/2的访问; 0-将Secure/non-SecureEL1...
2020-02-04 14:35:34
1628
原创 折书纸-一个快乐的小问题
给出要打印的页数n;打印时1张纸分4页,一摞纸从中间订成书后的页码要正确;页数n不能填满书的话,多余的页数要填NA。解决(代码不考虑输入过滤、溢出等问题):#include <stdio.h>#include <stdlib.h>void main(int argc, char* argv[]){ int n; char* arn; if(argc==2...
2020-02-03 22:39:45
186
翻译 Android内核似乎要向主线内核靠拢
2018.11.15Android设备都基于linux内核,但是这些设备从一开始并没有跑主线内核,因为添加了很多不在主线上的代码,这些主线外代码的内核代码的问题,正在想办法处理;虽然说现在就在这些Android设备上运行主线内核代码并不容易,但是比我们预想的可能更接近。Android内核从主线LTS内核而来,添加了Android指定代码来得到Android Common K...
2020-01-16 19:58:20
648
原创 DRM中的思路
linux已经有过fbdev管理图形适配器的FB,但是不能处理现代基于3D加速GPU的图形硬件。3D加速设备一般需要设置、管理一个在其硬件内部内存的指令序列,然后分发指令。DRM暴露有设备节点在/dev/dri/cardX,libdrm封装了对这个设备节点的操作。DRM包含两部分,generic DRM core,以及DRM Driver,DRM Driver是硬件相关部分。DRM cor...
2020-01-15 14:24:55
2593
原创 关于DRM(Direct Rendering Manager)的地位
1. 将关键的图形卡初始化放在内核,如上传固件,设置DMA区域2. 在多个用户态组件间共享渲染硬件,调度访问3. 控制用户态程序对DMA的使用,以防读写了不该动的数据,4. 通过提供显示内存alloc,管理图形卡内存5. 实现modesetting,FB放在了DRM内图片发自简书Appmodsetting是设置图形卡上的显示模式,从VGA中断或VESA调用,到直接操作图...
2020-01-15 14:24:46
438
原创 linux 图形栈的演进
1. 最开始,就是一段代码直接访问图形卡:XFree8 server;root运行XFree86 server,使之从用户态访问图形卡,不需要内核支持2D加速,非常容易在各操作系统间移植,不需要内核组件,就像这样:图片发自简书App2. 然后Utah-GLX 3D加速设计出现,也是从用户态访问图形卡,与2D完全独立,于此同时FrameBuffer驱动也开始推广,FB实现了另外的组件可以...
2020-01-15 14:24:36
1566
vb.net中在执行form_load()函数之前都会对程序函数执行什么操作?
2016-02-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人