- 博客(638)
- 资源 (3)
- 收藏
- 关注

原创 Linux kernel Memory Pin机制的实现以及测试
提起Memory Pin机制,就不得不提到swap的概念,这两个概念息息相关,为了避免在CPU忙碌的时候,也就是在缺页异常发生的时候,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统的空闲页面数量是否小于预定义的极限,一旦发现空闲页面数太少,就预先将若干页面换出,以减轻缺页异常发生时系统所承受的负担,当然,由于无法确切地预测页面的使用,即使这样做了也还可能出现缺页异常发生时内存依然没有足够的空闲页面。但是,预换出毕竟能减少空闲页面不够用的利率。
2023-01-20 20:55:45
1236

原创 如何分析和解决问题(写给自己的总结)
作为一名软件工程师,大部分的工作时间都是在解决各种问题中度过的,相信大部分的工程师都有类似的感受。这些问题发生在不同的技术领域,不同的技术方向,不同的模块,甚至不同的环境下,不一而足,就像数学中的自然数可数无穷一样,我们可以一个个遍历它,但是无法穷尽所有的问题。这多少有点悲观,难道我们就没有办法了么?不是这样的,问题有无数种,但是解决问题的通用思考方法却是有的,我们从一个数学概念讲起。
2023-01-09 23:28:21
1537

原创 Cuda异步计算并行编程原理和存储管理
优化时遵守的一些原则:1.Grid一定要给足block.2.Block内一定要给足thread,目的是提高并发WARP的数目,隐藏延迟.3.Block内线程的数目一定是warpsize的整数倍.每个warp的执行上下文(execution context,如程序计数器 和 寄存器等)在warp的整个生命周期内都被保存在片上内存(on-chip memory)。因此从一个执行上下文切换到另一个执行上下文是无开销的。
2022-12-17 07:49:21
545

原创 CPU虚拟化技术及QEMU/KVM虚拟机安装实践
计算机可虚拟化的原因是因为计算机是一个离散的系统,由于资源有限,计算机只能描述有限数量的事务,只能计算到某个固定数,然后就会用尽计算机上的所有东西。在离散系统上,让另外一个事务去虚拟化一个已经存在的事物,只不过是复制创造一个和已存在事务完全一样的事件序列。现代物理学,任何有名望的教授都会告诉你,我们的宇宙是离散和有限的,人们首先发现了自然数,接着是0,然后又发现了自然数的对立面负数,进而宣告整数的发现。后来人们觉得整数还是不够用,就发明了比例,也就是分数,所有之前发现的数在一起构成有理数集合。
2022-11-21 22:47:25
803

原创 关于处理器静态&动态内存屏障的原理和应用
barrier();r1 = y;barrier();r2 = x;编译为汇编指令.textrun1:.LFB0:ret.LFE0:run2:.LFB1:ret.LFE1:同样是movl指令,却代表这读和写两个意思,这一点和RISC处理器定义不太一样,无论是ARM,MIPS还是RISCV,读和写分别是两条不同的指令,ARM是ldr/str,MIPS是ld/sw,RISCV则和MIPS是同样的定义。
2022-11-01 23:18:10
244

原创 Verify与Validate的区别
Verification and Validation are the terms used for the checking process of a software. Verification is the checking of a product or software at its development phase either it is being developed to meet the required specifications. Validation is the checki
2022-10-30 15:18:40
869

原创 qemu中中断model虚拟化是如何实现的?
当系统调用CPSR指令关闭ARM IRQ/FIQ中断的时候,QEMU模拟器将其转换为HOST的HELPER cpsr_write调用,调用中修改env->daif值关闭中断标志位CPSR_I/CPSR_F.之后在每次的中断执行入口函数arm_cpu_exec_interrupt中,检测daif的中断标志状态,如果中断被DISABLE,则推出中断处理,执行线程代码。
2022-09-11 23:44:21
479

原创 Img2Col卷积转矩阵的硬件的计算方式
卷积转GEMM神经网络90%以上的计算单元都是由卷积和全链接构成的,所以说,一个具有tensor core矩阵乘法单元的加速卡,已经足以加速绝大部分CNN类型的网络了。
2022-09-04 23:13:54
219

原创 C-Model以及ASIC设计
之前的工作中对C-Model有过简单接触,当时的情况是这样的,在客户现场遇到一个视频解码问题,简单描述就是一段码流经过VPU解码后,显示出来的画面有一点儿轻微马赛克,当时不确定是码流问题还是VPU IP内的解码算法问题,后面对比了样机表现,发现并没有马赛克。于是基本确定是VPU 的解码算法问题,VPU是当时的东家设计的,于是就把码流拿回去请专家分析。专家很快就给出了分析结果以及解决方案,至于为何这么快,后来才了解到,专家把码流在CModel上跑了一遍,很快复现到问题,后面解决问题也水到渠成了。.......
2022-08-30 22:45:52
2575

原创 GPGPU&&渲染GPU的工作原理和认知总结
从系统架构来看,针对GPU的架构转型还在进行过程中,目前GPU依然还处于外设的地位,还没有摆脱其从属身份,因为这个根本特性,对GPU的编程并不像对CPU编程那样直接,而调试和优化GPU程序的难度就根大了,要比CPU程序复杂很多。
2022-08-29 23:41:09
990

原创 Qemu在ARM和X86平台上的运行机制初探
首先编译X86版本和ARM版本两个平台的QEMU3.编译接着执行 make -j44.生成DEB包5.安装结果6.分析由于HOST机是X86架构,所以这里的tcg-target.inc.c一定是X86目录下的tcg-target.inc.c文件。ARM平台上:arm平台上会使用arm目录的tcg-target.inc.c原理:CPU执行程序的本质是通过执行一组组有意义的指令改变内存和CPU内部寄存器的状态,改变后的状态反映在物理世界即是程序的执行结果,那么,执行程序的可以不是机器吗?
2022-08-23 23:06:42
429

原创 利用roofline模型分析异构系统算力VS带宽
roofline模型用于描述在计算平台的算力和带宽的限制下,程序所能达到的理论性能上界。可以看到,roofline模型的纵轴为可达算力:其中A I AIAI为访存比,B W BWBW为带宽。如果把带宽比作水管,把算例比作流过水管的水流,可以形象展示如下:针对这种划分,我们大概可以将模型分为两类:1.算力未发挥型的,对应爬坡图.2.带宽未发挥型的,对应roof图.3.在转折点处,既不浪费带宽,也不浪费算力,算是一个平衡,是不是纳什均衡?...
2022-08-23 10:27:30
472

原创 一种多媒体框架中的零buffer拷贝实现机制
BUFFER管理是多媒体框架设计实现中的重要任务,在常见的多媒体框架,比如FFMPEG,GST等中,BUFFER管理的代码实现都是复杂且代码量非常大的部分。从某种意义上说,多媒体应用的核心在于BUFFER管理,一个高效易用的BUFFER管理框架不但可以提供友好的开发模型,而且还可以最大限度的挖掘VPU的计算能力,提高多媒体应用的效率。为什么可以通过零拷贝来优化多媒体框架?.............................................
2022-08-13 15:40:59
516
1

原创 Linux下的OpenGL 3D渲染接口是谁提供的?Mesa
2D情况下的渲染比较简单,无论软件渲染还是硬件加速,本质上都是生成图像的像素阵列,只不过一个是由CPU来计算的,而另一个是由GPU来计算的,当然,对于硬件加速的情况,也不是完全用不到CPU,在这种情况下,CPU主要充当一个翻译角色,将数学,几何模型按照GPU的要求翻译为其可以识别的指令和数据。
2022-08-06 11:15:28
366

原创 DeadLock(死锁)问题的可视化分析方法
信号量和互斥锁是在RTOS或者Linux系统中提供多线程资源保护和同步的工具,如果正确使用,会保证我们的程序安全稳定可靠的运行,但是如果使用方式不正确,就会引入一种潜在的令人迷惑的错误情况,就是死锁,它指的是一组线程被阻塞了,等待一个永远也不会为真的条件。下面我们用进度图来分析一下死锁的时候发生了什么,为什么会发生,以及如何避免。假设有资源S,它的初始资源量为1,根据P,V操作观察存在两个执行流的情况下的情况,你可以把执行流看是两个并行流向的时间,时间是不会折返的,所以执行流永远指向坐标轴的正向。.....
2022-07-22 18:08:51
589

原创 计算一组Tensor的直方图C算法实现
本文介绍其程序实现首先构造一组TENSOR向量,维度为150528的列向量。观察其原始的直方图分布,其分布特点如下图所示运行3BINS。
2022-07-20 21:24:51
245

原创 等额本金和等额本息还款方式的差异分析
我们在办理按揭贷款的时候,银行一定会问你等额本金还是等额本息的还款方式选哪一个。现在我们就定量的分析一下,这两个究竟有何差别。
2022-07-14 23:29:32
1193

原创 为什么做生意可以让双方生活的更好?
经济学中有个著名的结论,贸易可以让贸易双方都获益,这里我们用一个例子来说明,为什么是这样的。分析如下:馒头对于甲的价值: 0.5瓶啤酒=1个馒头馒头对于乙的价值: 6瓶啤酒=1个馒头结论1:馒头对于乙的价值更大,1个馒头对甲只值半瓶啤酒啤酒对于甲的价值: 2个馒头=1瓶啤酒啤酒对于乙的价值: 0.16667个馒头=1瓶啤酒结论2:啤酒对于甲的价值更大,1瓶啤酒对乙只值0.16667个馒头所以,如果甲1个馒头换乙3瓶啤酒喝,对两个人都划算。乙怎么想?本来我一个馒头值6瓶啤酒,现在我只要出三瓶啤酒,就能换来一个
2022-06-24 23:18:27
521

原创 ubuntu18.04安装并测试gem5模拟器
开发环境安装依赖:sudo apt install build-essential git m4 scons zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev python-dev python依赖简单介绍如下:SCons:gem5使用SCons作为它的构建环境。SCons类似于make,它将Python脚本用于构建过程的所有方面。这使得构建系统非常灵活(
2022-05-27 06:45:20
975

原创 QEMU&KVM 虚拟机使用实例以及RISCV上KVM的实现分析
实验原理是将一个精简内核注入KVM虚拟机运行,当KVM虚拟机执行到IO指令的时候,借助用户态的MINI QEMU将信息打印出来。主机环境:存在/dev/kvm设备节点:首先编写一个精简内核,代码如下:start:mov $0x48, %aloutb %al, $0xf1 mov $0x65, %aloutb %al, $0xf1mov $0x6c, %aloutb %al, $0xf1mov $0x6c, %aloutb %a
2022-05-02 10:36:06
2159

原创 qemu 启动ARM虚拟机的几点释惑
参考博客linux4.15 arm qemu @ubuntu18.04环境搭建_papaofdoudou的博客-CSDN博客问题1:针对启动命令qemu-system-arm -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic
2022-05-01 12:06:46
2040

原创 linux4.15 arm qemu @ubuntu18.04环境搭建与bootgraph启动优化
系统环境我们用neofetch看一下系统环境信息:neofetch && uname -a|lolcat下载QEMU以及runtime工具sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential安装busybox编译静态busybox库:export ARCH=armexport CROSS_COMPILE=arm-linux-gnue
2022-04-26 20:44:56
1934

原创 mmap 匿名映射及Linux@X86_64 平台验证/dev/mem节点内存映射
以上奇奇怪怪的数据可能和post_alloc_hook中对分配的页面做posion操作有关,post_alloc_hook->kernel_poison_pages->poison_pages->poison_page->memset(addr,根据面向对象的思想,自己定义的成员也应该由自己定义的函数处理,所以,这里定义了一个会回调函数get_unmapped_area来查找空闲的没有经过映射的区域,里所应当,里面会根据mmap_base去查找这样的区域。然后参照如下博客进行编译升级。
2022-04-23 12:43:23
1063

原创 MIPS Linux内核编译构建环境的搭建
AI的端侧应用离不开各种算力平台,目前形成了CPU+NPU,CPU+FPGA以及CPU+GPU的几类算力搭配,他们各有优势,也各有弱点。先看它们的共同点,从组合名字可以看出,那就是他们都依赖CPU,这是因为无论NPU,FPGA还是GPU,它们的架构特点决定了在流水线pipeline,逻辑控制方面要弱于CPU,它们要么作为专用算力加速器,没有完备的指令集系统,比如GPU有简单的流水线,可以完成取指,解码执行的操作,但是它的流水线适合做大量的SIMD并行数据计算,无法完成复杂的执行流以及逻辑控制。另外还有一些没
2022-04-17 21:34:45
1966

原创 Dhrystone DMIPS跑分原理以及CPU&NPU等效算力分析
下载dhrystone,编译,排错,再编译,再排错,编译PASS,一顿操作之后,dhrystone成功被移植到某款Cortex-A7平台,主频跑1.2G HZ的情况下,在melis上测试,结果如下:msh />dhrystone Dhrystone Benchmark, Version 2.1 (Language: C) Program compiled without 'register' attribute Please give the number of runs throu
2022-04-16 19:43:40
3118
1

原创 全连接层的算力计算方式
神经网络的全链接层可以看成两个矩阵相乘的形式,如下图所示,一个MxN的矩阵乘以一个NxP的矩阵,得到一个MxP的矩阵,进行乘法的次数为:(N*N)*(M*P)加法次数为:(N-1)*M*N所以,综计算量为(N*N)*(M*P)+(N-1)*M*N......
2022-04-09 08:56:55
4226
1

原创 Linux ion&dma-buf&iommu&sglist&genpool的原理
1.PTW Logic 通过MBUS从内存中读取页表。2.读取到的页表存储在shared micro tlb中。3.每个外挂IP通过 IOVA-PA翻译模块进行地址翻译,翻译依赖的叶表通过MICRO TLB从shared micro tlb获取。4.CPU可以通过APB接口访问 MICRO TLB, shared micro tlb,prefetch logic电路。5.整个过程可以通过PMU进行监控.6.RISCV CPU can take the IOMMU just as it was a CPU b
2022-04-01 08:13:17
612

原创 V853 RTSP AI人脸检测串流功能开发
本篇介绍的过程并不复杂,原理上比上篇博客介绍的要简单一些,有趣的地方在于将之前的编码落盘和预览转换为了两路RTSP子码流输出,这样码流可以传的更远一些。V833/V831目标检测demo方案开发_papaofdoudou的博客-CSDN博客_v833整个应用方案原理如下:闲言少叙,下面开始技术流水账:第一步,打开Tina EMAC以太网络支持。由于uart2和emac phy是share pin的,所以需要事先将默认配置为uart功能的PIN角修改为emac功能,方法是cconfig
2022-03-23 19:48:36
1352

原创 双线性内插法进行图像旋转算法的C代码实现
原图:代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stddef.h>#include <stdint.h>#include <fcntl.h>#include <unistd.h>#include <assert.h>#include <sys/ioctl.h>#include
2022-03-20 06:45:08
2807

原创 GDB 命令脚本的编写以及调试技巧汇总
在GDB调试程序的时候,如果程序带有很长的参数列表,或者调试命令本身很长,需要频繁启动调试会话时,频繁输入参数或者命令严重拖慢调试节奏,这里记录一个GDB非常有用的参数-x,可以将调试参数和调试命令以调试脚本的形式提供给GDB调试会话,这样就不用频繁输入调试命令和参数了。Linux上,万事不决问”男人”,这个男人就是"man", 我们先man一下 gdb,看官方文档对 "-x"选项的解释。所以,我们可以在gdb -x参数后面,跟随一个gdb命令脚本来进行程序调试,脚本的格式和.gdbinit相同
2022-03-18 12:28:01
2718

原创 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
关于图形scale原理的介绍可以参考下面的文章用最近邻插值(Nearest Neighbor interpolation)进行图片缩放_papaofdoudou的博客-CSDN博客_最近邻插值算法原理个图片缩放的两种常见算法: 最近邻域内插法(Nearest Neighbor interpolation) 双向性内插法(bilinear interpolation)本文主要讲述最近邻插值(Nearest Neighbor interpolation算法的原理以及python实现基本原理最简单的图像缩放算
2022-03-17 17:37:22
1465

原创 Darknet卷积层算力评估
darknet是用C语言开发的一款非常精简高效的推理框架,它的开发者也是YOLO的作者,关于darknet推理环境的介绍网上有很多,不再过多介绍,这里只是尝试解读darknet推理过程中的一些细节知识点,就从推理输出的算力来源开始。一张经典的输出:推理过程中的LOG显示中,BF是BFOPS的缩写,它表示什么意思呢?BFLOPS 有两个不同场景下的解释。 第一种是描述硬件运算性能的单位,这时其全称是Billion Float Operations Per Second,即每秒能进行多少个十亿次
2022-03-15 23:44:37
4125
1

原创 用布雷森汉姆(Bresenham)算法直接在YUV图上绘制图形
Bresenham的线算法以Jack Elton Bresenham命名,他于1962年在IBM开发。是计算机图形学中的经典算法,恰好最近公司项目中需要实现类似的功能,于是就实践了一把,为了以后帕坑方便,记录在此。图形转YUV我们是在YUV裸数据上去绘,而通常的图像都是代容器格式的JPG或者PNG等等,所以需要首先将图片转换为YUV裸数据,我们用FFMPEG这款视频处理领域的瑞士军刀完成此功能。常用的YUV格式有NV12和NV21两种,,NV12 分两个平面,Y 平面和 UV 平面存储,UV 在
2022-03-05 01:54:02
2108

原创 cuda-z/gpu-z/cpu-z工具分析GPU显卡和CPU算力信息
类似于Windows下使用CPU-Z工具查看CPU信息,Linux下也可以使用CUDA-Z工具来查看显卡资源/支持信息。CUDA-Z运行需要主机首先已经安装CUDA和N卡驱动为前提,具体步骤可参考博客:Darknet CUDA/CUDANN环境的快速安装_tugouxp的专栏-CSDN博客之后便可以开始下面的步骤:下载cuda-zcuda-z在sourceforge上开源,主页地址:CUDA-Z根据主页提示进入下载页:下载后得到文件CUDA-Z-0.10.251-64bi
2022-02-06 12:18:45
6602

原创 C++多态性分析和与Linux内核中的多态性实现的共性和差异比较
Linux内核是用C语言开发的,而C是面向结构,面向过程的语言,这种语言的特点是数据结构和数据操作是分离的两个部分,但是这并不代表面向过程的语言无法实现面向对象语言的一些机制,比如多态性,多态的本质在于其抽象的思维方法,而并非是其实现技巧。用C语言,也同样可以实现类似多态的机制。Linux内核中普遍使用了这种思想,比如container_of可以通过一个基类对象得到它的子类对象。而设备驱动最常用的操作模型,open/read/write/ioctl/close则是最能够体现用C语言进行多态实现的最好案例
2022-02-05 12:05:12
1885
1

原创 手搓积分验证大数定律和中心极限定理
关于大数定律的一种程序验证方式,请参考博客辛钦大数定律的Python实践_tugouxp的专栏-CSDN博客本文通过计算,来实际验证一把独立同分布的符合均匀分布的多个变量的加和的分布情况。假设符合均匀分布,记为概率密度函数为此概率密度函数图形即如下图所示:的概率密度分布函数当z<=0的时候,f(x)和f(z-x)如下所示:所以,f(x)f(z-x)乘积为0,积分也为0。当z>0&&z<1的时候,图形为:
2022-02-04 21:56:09
984

原创 dmesg&printk的工作原理
内核调试者对DMESG应该不会感到陌生,DMESG可以将内核打印信息输出到控制台,从而让我们知道内核发生了什么。一句话不足以概括其中的工作细节,那么,DMESG是如何发挥作用的呢,这里我们就探究一下。dmesg的格式在UBUNTU18.04上,DMESG是以ELF可执行文件的形式提供功能的。dmesg工作原理我们用strace跟踪一下dmesg的工作过程,输入strace -e trace=open,read,openat,close dmesg输出如下:可以看到,
2022-02-02 10:22:20
1060
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人