- 博客(106)
- 资源 (1)
- 收藏
- 关注
原创 OpenCL 学习(6)---- OpenCL 内存对象
还提供一种 子缓冲区对象,实际上就是在已有缓冲区对象中映射一小块区域作为子缓冲区对象,对于大块数据处理,每次可以只交换部分缓冲区数据。这两个内存对象,就是属于这种常量内存,这个所有的工作项的内核函数都可以访问,但是只能。寄存器),但是涉及到大块的内存数据,就不能直接通过指针参数的方式来传递了。,就属于这种全局内存,这个是所有工作项的内核函数都可以访问的全局内存数据。): 仅在当前工作项中可以访问的内存数据,在我们示例中,语言中,指针指向的数据都是存放在内存中的,而对于。的内存对象主要是缓冲区对象,包括。
2026-03-08 16:12:02
333
原创 OpenCL 学习(5)---- OpenCL 命令队列
命令队列中的命令,只能是主机发送给设备,而设备不能发送命令给主机,默认情况下命令队列顺序处理接收到的命令,但是在创建命令队列时可以修改默认行为。注意每个命令队列只能关联一个设备,如果要同时使用多个设备,则需要创建多个命令队列,每个命令队列关联到一个设备。中,允许设备向命令队列提交命令,这个过程不需要主机参与,这样的命令队列,需要设置为。,指定了命令队列的属性及其对应的值,每个属性名称后面紧紧跟着对应的值,列表是以。等,命令提交到命令队列,命令队列把需要执行的命令发送给设备。, 这里比较复杂的参数是。
2026-03-08 15:30:06
253
原创 OpenCL 学习(5)---- OpenCL 内核和内核参数
不能查询特定于某个设备的内核对象信息,比如,如何将一个并行负载分派到执行内核的一个或者多个不同设备上,那么 该如何处理?一旦创建了内核对象,开发人员如果想知道内核对象的一些属性信息,可以使用如下函数查询内核对象的属性信息。为内核函数参数的索引,按照从左到右的顺序,第一个(最左边的)参数索引为。创建内核对象,但是注意内核列表中的内核函数名称顺序并不是根据。为查询内核对象的属性名称,可以接受的参数如下表,参数。为内核对象关联的设备列表中的一个特定设备,参数。为内核对象列表中内核的个数,参数。
2026-02-15 15:18:12
578
原创 OpenCL 学习(4)---- OpenCL 上下文和程序对象
代码通常都是实现的一个个独立的函数,称为内核函数,经过编译、加载运行后,最终在。共同定义一个回调函数,这个回调函数报告上下文生命周期中出现的错误的有关信息,为指定的所有设备构建程序对象,实际上等价于在一个C程序上调用编译器和链接器,中执行的内置的开发语言,一般将这部分代码作为一个完整的字符串,提供给。中执行,可以通过命令队列来控制,并且可以使用事件进行同步,这一点是。指定上下属性的属性名称及属性相应的值的列表,规定最后一个值为。)作为标识,相当于后续的并行计算也是在该设备上执行,
2026-02-15 14:40:23
660
原创 Linux 内核学习(17) --- linux 内核编译和 qemu 环境搭建
nographic:禁用图形界面,使用串口输出(适合服务器环境)-machine virt:使用通用 ARM64 虚拟机平台。是一个开源的虚拟机仿真器,可模拟多种硬件架构(如。等),适用于嵌入式开发、内核调试和系统测试。-m 512 :设置内存大小为 512M。-smp 2 :设置处理器为双核。的方法,可以用于测试自己对。另外也提供了一个 编译生成。机器模型会自动生成一个。文件,但是这里使用的。这些节点的内容也可以从。
2026-01-29 22:15:58
370
原创 Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
直接映射是一种最简单的映射方式:在系统启动早期,内核会建立一个从物理地址到虚拟地址的固定偏移映射。),无法映射所有物理内存超出部分称为“高端内存”,使用此标志分配的页面,其物理地址可能没有固定的内核虚拟地址。但在 64 位系统上,由于虚拟地址空间极其庞大,已经废除了高端内存的概念,所有物理内存都可以线性映射。处理程序),分配的物理页面最终会被映射到用户进程的虚拟地址空间,而不是内核的直接映射区。无法处理不连续物理内存:当需要大块虚拟连续但物理不连续的内存时,直接映射区无能为力。分配时需修改页表,可能触发。
2026-01-12 21:59:54
885
原创 Linux 内核学习(15) --- linux MMU 和 分页机制
早期计算机系统的内存是比较小,不过相应的程序也是比较小的,这时程序可以直接加载到内存中运行,后来为了支持多个程序的并行,内存中出现了固定分区,在编译阶段将不同程序,划分在不同的内存区域上内存分区大小与程序大小要匹配,是地址空间无法动态的增长内存动态分区思想便诞生了,内存上线划出一块区域给操作系统,然后剩余的内存空间给用户进程使用,这样用户程序所使用的内存空间,跟随程序大小及数目进行变动不论是静态分析,还是动态分区,都存在一些问题:进程地址空间安全问题(地址空间不隔离)
2026-01-11 14:38:53
1061
1
原创 Linux 内核学习(14) --- linux x86-32 虚拟地址空间
Linux内核一般将处理器的虚拟地址空间划分为两个部分,底部比较大的部分用于用户进程,顶部则专用于内核,虽然(在两个用户进程之间的)上下文切换期间会改变下半部分,区域紧接着直接映射,那么访问将成功而不会注意到错误,在稳定运行的情况下,肯定不需要这个额外的保护措施,但它对开发尚未成熟的新内核特性是有用的。内核自身会试图尽力避免非连续的物理地址,通常会成功,因为大部分大的内存块都在启动时分配给内核,那时内存的碎片尚不严重,段仅为未初始化的静态分配变量预留位置,在目标文件中并不占据空间,这样可减少目标文件体积。
2026-01-11 13:11:49
730
原创 Linux 内核学习(13) --- linux 内核并发与竞态
激活这些检查, 就可能探测到一些内存覆盖和遗漏初始化的错误. 被分配的每一个字节在递交给调用者之前都设成 0xa5, 随后在释放时被设成 0x6b. 你在任何时候如果见到任一个这种"坏"模式重复出现在你的驱动输出(或者常常在一个oops 的列表), 你会确切知道去找什么类型的错误. 当激活调试, 内核还会在每个分配的内存对象的前后放置特别的守护值;),一个进程在内核态执行时(例如正在执行驱动程序的某个函数)也有可能被优先级更高的进程抢占,当它被重新调度的时候,共享的数据已经改变了。
2025-12-20 14:43:11
940
原创 常用软件工具的使用(2) ---- git 命令进阶 和 github
将多笔提交合并为一个提交git rebase -i 命令可以压缩合并多次提交格式:git rebase -i [startpoint] [endpoint]其中-i的意思是。
2025-12-13 20:14:41
1008
原创 常用软件工具的使用(1) ---- git 的安装和基础操作
当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件)这里的配置仅仅针对当前项目有效;每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。tips: 注释信息的格式git没有特别的要求,但是我习惯用下面的格式。填写的时候会用到,默认是。
2025-12-13 19:56:35
971
原创 OpenGL-ES 学习(18) ---- 实例化渲染
可以区分输入的不同的位置,大小或者颜色,实现基于一个物体绘制出位置,大小,形状或者颜色的不同的多个物体。)的目标并不是实现将同一物体绘制多次,而是能基于某一物体绘制出位置、大小、形状或者颜色不同的多个物体。方法绘制出多个 立方体的参考代码, 原理是改变输入立方体的顶点的偏移。调用完实例化绘制函数后,我们便将绘制数据一次性发送给。)是一种只调用一次渲染函数酒能绘制出很多物体的技术,,只使用一次绘制函数,就可以绘制出多个物体。相对于普通绘制,实例化绘制多了一个参数。表示当前正在的绘制的实例的。
2025-12-08 22:39:09
485
原创 OpenGL-ES 学习(17) ---- CubeMap 纹理
立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样。假设我们有一个1x1x1的单位立方体,方向向量的原点位于它的中心使用一个方向向量来从立方体贴图上采样一个纹理值会像是这样note:方向向量的大小并不重要,只要提供了方向,OpenGL_ES就会获取方向向量(最终)所击中的纹素,并返回对应的采样纹理值。
2025-11-29 21:57:57
1186
1
原创 OpenGL-ES 学习(16) ----Pixel Buffer Object
, 也就是像素缓冲区对象,主要用于异步像素的传输操作,暂存区域,结合异步的方式,一点程度上可以解决这个问题。仅仅用做像素的一个暂存区,不连接到纹理,并且和。管理的内存区域) 之间拷贝往往是比较耗时的,使用。读取帧缓冲区数据时,帧缓冲数据可以直接传输到。上图从文件中加载纹理,图像数据首先被加载到。内存),两次加载过程(拷贝和加载)完成由。加载纹理时,文件中图像数据可以直接加载到。的缓冲区的内存地址,再将帧缓冲数据拷贝到。内存区域拷贝,是需要阻塞等待完成的。从 帧缓冲区读取图像数据,需要。
2025-11-22 21:41:40
1015
原创 开源项目学习(7) ---- Google Gtest
Gtest是一个跨平台的(LinuxMac OS XWindowsCygwinWindows CEandSymbianC++单元测试框架,由google公司发布,gtest是为在不同平台上为编写C++测试而生成的,它提供了丰富的断言、致命和非致命判断、参数化、死亡测试等等。
2025-10-07 23:07:35
672
原创 C++ 学习(3) ----设计模式
对上面的简单工厂模式进行修改,不再设计一个统一按钮工厂类来负责所有产品的创建,而是将具体的按钮创建过程交给专门的工厂子类完成,先定义一个抽象的按钮工厂类,在定义具体的工厂类来生成圆形按钮,矩形按钮,菱形按钮等等。在系统运行时,对象不是孤立的,它可以通过相互通信和协作完成某些复杂功能,一个对象的运行也会影响其他对象。我们希望使用这些按钮的时候,不需要知道具体的按钮的名字,只需要知道表示这个按钮类的一个参数,并且提供一个方便调用的方法,传入参数就可以或者一个具体的对象,这个就是简单工厂模式。
2025-10-07 22:52:28
987
原创 AI 基础知识(2) ---- 神经网络原理
是一个抽象类, 允许你从自己的数据源中创建数据集len(self): 返回数据集中的样本数量getitem(self, idx): 通过索引返回一个样本。
2025-10-07 22:31:41
803
原创 Python 学习(5) ---- Python 语法规则
包是一个分层次的文件目录结构, 它定义了一个由模块及子包, 简单说, 包就是文件夹, 但是该文件夹下必须存在文件, 该文件的内容可以为空,用于标志当前文件夹是一个包。
2025-10-07 20:24:52
904
原创 Python 学习(2) ---- Python 数据类型
Python中的变量顶定义不需要指定类型,变量需要再使用前赋值,赋值之后变量才会被创建可以连续的方式为变量赋值也可以为多个变量指定值# ==>a = 1b = 2c = "demo"
2025-10-07 19:57:49
806
原创 Python 学习(1) ---- Python 初步介绍
Python是一个高层次的结合了解释性,编译性,互动性和面向对象的脚本语言Python的涉及具有很强的可读性,比其他语言更有语法特色Python是一种解释性语言,这意味着开发过程中没有编译这个环节,类似于PHP或者PerlPython是交互式语言: 意味着可以在 Python 提示符>>>直接执行代码Python是面向对象的语言,这意味这Python支持面向对象风格或者代码封装在对象的编程技术Python是初学者的语言,广泛的支持程序开发。
2025-10-07 18:59:37
754
原创 Vulkan 学习(20)---- UniformBuffer 的使用
mat4 model;mat4 view;mat4 proj;mat4 view;mat4 proj;mat4 view;mat4 proj;uniformin和out定义在着色器中出现的顺序可以是任意的,任意代码中binding修饰符类似于我们对顶点属性使用的location修饰符,我们会在描述符布局引用这个binding值使用变换矩阵最终得到矩形在三维空间内的裁剪坐标。
2025-09-07 15:24:42
1063
原创 Vulkan 学习(19)---- Vulkan Compute
与OpenGL等较旧的API不同,Vulkan中强制要求支持计算着色器,这意味着您可以在任何可用的Vulkan实现上使用计算着色器,无论它是高端桌面GPU还是低功耗嵌入式设备GPU的计算功能可以用于图像处理、可见性测试、后期处理、高级照明计算、动画、物理(例如粒子系统)等等,甚至可以用于非可见性的工作比如AI和 数字运算等使用 GPU 进行计算的一个明显的优势是降低CPU负载避免CPU和GPU之间交换数据所有数据都可以直接保持在GPU上,无需从缓慢的主存储器中获取数据。
2025-07-20 14:39:46
1176
原创 Vulkan 学习(18)---- 使用 ValidationLayer
Vulkan API的设计是按照最小化驱动程序的开销进行的,所以默认情况下Vulkan API提供的错误检测的功能非常有限,很多基本的错误都没有被Vulkan显式进行处理,遇到错误也是直接错误崩溃,或者直接发生未定义行为,比如使用了一个新的特性,但是在逻辑设备创建的时候没有添加这个拓展Vulkan引入验证层,验证层是一个可选组件,它会hook到Vulkan对照规范检查参数的值是否合法跟踪对象的销毁和创建,找出潜在的资源泄露跟踪调用来源的线程来检查线程的安全性将每个调用及其参数记录到标准输出。
2025-06-29 11:21:25
910
原创 Vulkan 学习(17)---- 使用 IndexBuffer
绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要6个顶点,共享顶点的话,只需要4个顶点就可以可以想象对于更加复杂的三维网格,通过共享顶点可以节约大量内存资源索引缓冲()是一个包含了指向顶点缓冲中顶点数据的索引数组的缓冲,使用索引缓冲,我们可以对顶点数据进行复用。
2025-06-22 16:53:26
828
原创 Linux 内核学习(12) --- Linux workqueue
work queue即工作队列,也是中断下半部的一种work queue将下半部工作推迟给一个内核线程去执行 ==>总是会在进程的上下文执行,重要的是workqueue允许重新调度甚至睡眠如果推迟的工作需要睡眠,则使用workqueue,否则使用softirq或taskletsworkqueue适用于需要分配大量的内存,获得一个信号量,或者执行阻塞的I/O的情况工作队列创建的内核线程称为工作者线程(),工作队列子系统创建了一个缺省的工作者线程来处理这些推后的工作,一般都是使用缺省的工作线程。
2025-06-21 15:47:32
1162
原创 Linux 内核学习(11) --- Linux 链表结构
链表是一种数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针链表可以动态增长或者缩小,适合频繁的插入和删除操作,常见的链表类型有单向链表和双向链表在 linux 内核开发中,开发者无需自己实现链表或者使用第三方库,内核内置了双向链表实现定义在中。
2025-06-12 21:41:09
1521
原创 Linux 内核学习(10) --- Linux sysfs 节点创建
在/sysint retval;if (!kobj)name表示目录名称parent表示父目录,NULL为默认在/sys目录下创建。
2025-06-11 21:28:53
639
1
原创 Linux 内核学习(9) --- Linux sysfs 文件系统
sysfs是一个基于RAM的文件系统,从Linux 2.6内核开始引入,用于导出内核对象()的数据,属性到用户空间,以文件目录的形式为用户空间提供对这些数据,属性访问的支持从驱动开发的角度看,sysfs为用户提供了除了devfs和procfs之外的另外一种访问内核数据的方式,使用sysfs,编译内核的时候要定义,并且通过的方式将其挂载到/sys目录sysfs是一个特殊的文件系统,并没有一个实际存放文件的介质,sysfs的来源是kobject的层级结构,读取一个sysfs的文件,就是动态从kobject。
2025-05-25 16:01:08
1058
原创 Linux 内核学习(8) --- 字符设备操作函数
<\ //30sizeof_IOC0_IOC_IOC_IOC_IOCsizeof_IOCsizeof_IOCsizeof>>>>>>>>type:一般为 magincNumbernr:一般为递增的序列号size:传输数据的sizecmd是一个类型的整形数,大小为 32bitcmd的高位 2Bit cmd[31:30] 是数据的传输方向,可以是_IOC_READ_IOC_WRITE或者和_IOC_NONEcmd[29:16]最多是 14 bit,表示数据的大小。
2025-05-25 15:06:24
859
原创 Vulkan 学习(15)---- Vulkan 完整渲染流程
上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行图像和缓存内容的复制操作等。命令包括绑定顶点缓存(可选)、绑定流水线、设置视口和裁切矩形、录制渲染通道指令、设置绘制指令等。需要注意的是,如果窗口变化或者失效,此时需要重建。的操作关系是以颜色,模板、深度附件的形式关联到。只描述渲染流程,不包括渲染数据,渲染数据需要以。类似于一个图像的容器,里面包含一系列的。),确保图像可用后再显示,它可能涉及。管理的,不能直接访问,需要调用。
2025-05-25 13:15:21
1533
原创 Linux 内核学习(7) --- 字符设备驱动
Linux 中主要有三类设备的驱动程序,分别是字符设备驱动程序,块设备驱动程序和网络设备驱动程序字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等,字符设备的驱动程序结构如下图所示:字符设备可以通过文件节点来访问,设备文件和普通文件差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道,当然也存在数据区特性的字符设备,访问它们可以前后移动访问位置,比如就是这样一个设备,app可以用mmap或者lseek访问获取整个图像主设备号和次设备号。
2025-05-07 21:51:17
979
原创 Linux 内核学习(6) --- Linux 内核基础知识
可以在系统上电或者复位的时候以某种方法执行,执行方法包括:被BIOS引导执行,直接 NorFlash 执行,NAND Flash 代码被 MCU自动拷贝进入内部或者外部 RAM直接执行能将U盘,磁盘,光盘,NAND/Nor Flash ROM SD卡中存储介质,甚至串口网口中的操作系统加载到 RAM,并且将控制权交给内核源代码执行内核镜像不是完全直接可以执行的代码,而是一个压缩过的zImage 小内核bzImage big 大内核。
2025-05-07 21:29:42
1761
原创 OpenGL-ES 学习(15) ----纹理
现实生活中,纹理(Texture) 类似于游戏中皮肤的概念,最通常的作用是装饰3D物体,它像贴纸一样贴在物体的表面,丰富物体的表面和细节在OpenGL-ES开发中,纹理除了用于装饰物体表面,还可以用来作为存储数据的容器所以在OpenGL-ES中,纹理实际上是一个可以被采样的复杂数据集合,是GPU的图像数据结构,纹理分为 2D纹理、立方图纹理和 3D纹理2D纹理是OpenGL-ES中最常见和最常用的纹理形式,是一个表示图像数据的二维数组,纹理中一个单独的数据单元被称为纹素或者纹理像素立方图纹理(
2025-05-01 16:54:33
2200
原创 OpenGL-ES 学习(14) ----顶点指定和基本图元的绘制
绘制图形的第一步就是指定顶点坐标,可以每个顶点指定,也可以是用于所有顶点的常量,或者直接用顶点数组指定,OpenGL-ES标准实现必须支持最少16个顶点属性;顶点着色器处理图元顶点之后进入图元装配阶段,在这个阶段执行裁剪,透视分割和视口变换,往后会进入光栅化阶段;光栅化是指将图元转换为一组二维片段的过程,这些片段最后会由FragmentShader 处理定义顶点属性的坐标并且关联到一个属性索引上,//注意下面的顶点定义方式。
2025-05-01 16:43:33
1231
原创 OpenGL-ES 学习(13) ---- Shader 编译和程序对象
在本节中,我们提供创建ShaderShader和程序对象概述创建和编译Shader创建和链接程序对象设置和获取统一变量获取和设置属性Shader编译器和程序二进制代码想要用ShaderShader对象和程序对象(它们之间的关系类似于C语言链接程序和编译器C语言对象将一段源代码生成目标对象C链接程序将对象文件链接为最后的文件Shader对象是包含多个Shader的对象,源代码提供给Shader对象,Shader对象被编译为一个目标形式(类似于obj文件),编译之后,Shader。
2025-05-01 16:31:59
1287
原创 OpenGL-ES 学习(12) ---- VBO EBO VAO
VBO) 是指顶点缓冲区对象,而EBO)是指图元索引缓冲区对象,VBO和EBO实际上是同一类buffer按照用途的不同称呼编程中,用于绘制的顶点数组数据首先保存在系统内存,在调用或者等进行绘制的时候,需要将顶点数组数据从系统内存拷贝到显存,但是很多时候我们没必要在每次绘制的时候进行内存拷贝,如果可以在显存中缓存这些数据,就可以在很大程度上降低内存拷贝带来的开销OpenGL-ES数组缓冲区对象指定数组缓冲区对象用于创建保存顶点数据的缓冲区对象元素数组缓冲区对象用于创建保存图元索引的缓冲区对象。
2025-05-01 16:22:09
1250
原创 OpenGL-ES 学习(12) ---- GPU 系统结构
每个图元,还需要确认图元是否位于视锥体内,如果没有完全位于,就需要进行裁剪,或者直接剔除,裁剪和剔除之后,顶点位置就被转换为屏幕坐标,传递给管线的下一阶段进行光栅化。着色是一种高度独立的任务,两个顶点或者像素之间谁都不需要关心对方的属性,并且它们之间的行为也几乎完全一致,比如说对一个三角形进行平移,则对它的每一个顶点加上相同的向量,区别只有输入:三个顶点的位置数据不同,如果对指令有一定了解的话,会发现这和。上分点地方放它,对于FB的频繁访问,不再产生DDR带宽,而是变成了低时延,低功耗的。
2025-05-01 11:48:46
1027
原创 OpenGL-ES 学习(11) ---- EGL
OpenGL-ES是一个操作GPU的图像API标准,它通过驱动向GPU发送相关图形指令,控制图形渲染管线状态机的运行状态,但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关EGL---- 因此被独立的设计出来,它作为OpenGL-ES和本地窗口的桥梁EGL是OpenGL ES和底层Native平台视窗系统之间的接口层,EGL API是独立于OpenGL ES各版本标准的独立APIEGL和设备的原生窗口系统进行通信查询绘图表面的可用类型和配置创建绘图表面在。
2025-05-01 11:19:02
1551
原创 OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
结构可以认为是C语言中的结构体的概念struct {vec4 color;float end;} fogVar;
2025-05-01 10:43:19
996
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅