自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(128)
  • 收藏
  • 关注

原创 无人机在三维空间中的转动问题

这篇博客是对最近一个有关无人机拍摄图像项目中所学到的新知识的一个总结,比较杂乱,没有固定的写作顺序。

2024-01-28 11:51:14 1622

原创 (转载)内存分配器101——写一个简单的内存分配器

之前学习过手写一个简单的内存分配器,原文是英文的,当初学习的时候便将英文翻译为中文的,方便阅读,当然和原文相比少了点味道。同时实现的内存分配器并不快速和高效,我们不会调整分配的内存使其和 a page boundary 对齐,但是它可以工作,就是这样。此外,操作系统提供的堆内存是连续的,所以我们只能释放堆末尾的内存,不能释放中间的内存。首先得到我们想要释放的块的header,我们需要得到一个指针。如果想要在堆上分配更多的内存,我们需要请求系统增加 brk,同样的,释放内存的话,需要请求系统减少 brk。

2024-08-31 15:23:01 956

原创 C++中完美转发std::forward的一点点分析

这一节我们分析了的调用流程,一步一步展示了其调用过程。但是还有很重要的一点是:没有提出一个必须要使用的场景,也就是说,学了这么多,不知道在什么时候使用。等日后遇到了补上吧。

2024-08-25 19:59:37 1198

原创 (转载)我最喜欢的算法:线性时间查找中位数

有一个快速选择算法,当有一个足够好的pivot时,它可以在线性时间内找到数组的中位数。还有一个median-of-medians算法,在时间复杂度为OnO(n)On的情况下找到一个pivot(这个pivot对快速选择算法来说足够好)。将这两者结合,就有一个在线性时间内找到中位数(或者数组中的第K个元素)的算法。

2024-08-22 23:39:57 995

原创 关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(四)

向线程池中提交任务,若提交的任务若有返回值时的处理流程大概就是这样,这里再引出一个问题:**若提交的任务既有参数,又有返回值怎么处理?**上一节分析了任务有参数怎么办,这一节分析了任务有返回值怎么办,那么两个结合起来就可以解决这个问题。return x++;线程池如何初始化线程池如何提交任务子线程如何执行任务线程池如何动态增加或减少线程线程池关闭时会做什么任务以何种方式提交,任务如果有参数怎么办,任务如果有返回值什么办,任务如果既有参数又有返回值怎么办?

2024-08-22 12:22:00 919

原创 关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(三)

这一节简单介绍了线程池支持以哪种方式提交任务,任务如果要输入参数怎么解决,整体面貌给大家展现出来了,但是其中还有一些细节问题没有说清,不过不影响理解。下一节我们会介绍当提交的任务有返回值时该怎么处理。

2024-08-20 12:09:07 438

原创 关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(二)

以上就是本节的所有内容。然后可以解释下开头的那句话:这里的动态可能和你想的动态不太一样。在我没有阅读代码之前,我一直以为动态减少的那些线程会保存起来,待需要动态增加时,再重新拿出来使用。阅读完代码后,才发现自己理解错了。减少的线程会被join,增加线程时会重新创建线程。

2024-08-19 21:35:30 677

原创 中缀与前缀表达式之间的转换

这次对中缀与前缀之间的转换做了说明,有机会的话也会将其它几种做以陈述。

2024-08-03 11:28:11 191

原创 Leetcode136——只出现一次的数字

这道题目没有使用高深的算法,就是一个简单的位运算,但是它充分利用了计算机本身的特性。类似于这样的还有,当我们要给一个数除以2时,我们可以使用**>>**右移运算符替代,等等。

2024-07-31 15:16:45 165

原创 排序算法——快速排序

最近在学习的知识,发现其核心操作还是有些许难度的,这里做个记录。

2024-07-31 12:58:41 403

原创 关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(一)

SafeTask线程池通过重用线程来减少创建和销毁线程的开销。当有任务时,线程池会从池中取出一个空闲线程来处理任务,而不是每次都创建新线程。在这里,任务可以是一个函数,lambda表达式,函数对象或任何可以调用的对象。一般来说,在使用线程波时,任务通常被封装成可调用的对象,然后添加到任务队列里,等待线程池里的线程执行。SafeTask就是Hipe框架中自定义的任务类型,也就是说所有的任务会被封装成SafeTask类型的对象。被封装为SafeTask// 线程池的任务队列/***/

2024-07-30 17:00:51 972

原创 C++中的函数名与函数名取地址

的相关代码时,遇到了一些疑惑,特意记录下来。运算符本来的意义,它要求其操作数是一个对象。根据上面所讲,此时的。是整个数组的首地址。虽然它两的值相同,但是类型不同。其它情况下会被转化为指向该函数的指针,那么这时的。是没有区别的,那么它们两本质的区别是什么呢?除过上面的两种情况外,还有第三种情况,那就是。是数组名,表示的是整个数组的首地址;的操作数时,它的类型才是函数对象;的值是一样的,那它们的类型一样吗?这个函数对象的地址。可以取得这个函数对象的地址。都可以得到函数的地址,也就是。的类型是函数对象,所以。

2024-07-26 14:47:01 450

原创 C++中的万能引用,引用折叠,完美转发

是 C++11 引入的一个标准库函数模板,用于在泛型编程中实现完美转发(perfect forwarding)。这意味着参数的值类别(左值或右值)和所有修饰符(如 const、volatile 等)都能被保留,从而使被调用的函数能够正确处理参数。是一个特殊的引用类型,经常在模版编程中使用。它即可以绑定到左值,也可以绑定到右值,也就是说,使用万能引用的。所有的引用折叠最终都代表一个引用,要么是左值引用,要么是右值引用。时,运用引用折叠的规则,此时。时,运用引用折叠的规则,此时。函数,一次传入的参数是。

2024-07-26 11:15:49 1407 1

原创 数据结构——堆,堆排序

我们都知道内存分布中的出来的空间都在堆区上。和有一个名字很相近的数据结构——,虽然名称相近,但两者是完全不同的东西。因为十大排序算法中有一个,所以从头开始了解下这个数据结构, 终学习下。

2024-07-18 17:36:57 1182

原创 C++之static关键字

有int a = 5;/*=======这是重点======*/#endifint main()print();程序说明:在test.h定义了一个int的变量a,我们想在main.cpp中输出这个a,使用gcc进行编译。可以看到是链接期间的错误,多重定义。我们分析下为什么会出现这个错误。首先明白程序编译的过程。将源代码编译为可执行文件有四个阶段:预处理——>编译——>汇编——>链接。define定义的替换,includemain.cpp中include了test.h,编译器会将。

2024-07-06 16:04:51 1085

原创 cmake组织C++工程

这里的工程复杂度还是比较简单的,就是直来直去。我们没有在include和src文件夹下进行嵌套,也没有使用条件编译等,接下来如果有机会我会把这部分补上,给自已挖个坑。

2024-07-05 12:45:51 243

原创 程序中的Reduce(CPU和GPU)

最近在看Reduce(归约)的相关知识和代码,做个总结。这里默认大家已经明白了Reduce的基础概念。

2024-06-29 14:42:11 495

原创 cmake使用make和Ninja构建对比

make和Ninja是两个常见的构建工具,在网上查阅了一些资料,说是Ninja比make构建速度要快很多。但是具体不知道快多少,所以趁着这次编译clang的机会,分享下它们在时间方面差多少。

2024-06-09 16:38:46 1065

原创 论文Compiler Technologies in Deep Learning Co-Design: A Survey分享

深度学习的应用飞速在发展,但是在硬件方面因为摩尔定律的失效导致通用的处理器无法满足深度学习模型的需求,因此需要专用的硬件来加速深度学习计算。本文详细阐述了过去有关深度学习中编译器以及协同设计的工作。最后,作者针对典型的深度学习协同设计系统提出了一种特定领域的编译框架——Buddy Compiler。作为一个编译器框架,buddy Compiler基于MLIR和RISC-V致力于构建一个可扩展和灵活的硬件-软件协同设计的生态系统。在神经网络的历史上,软件和硬件彼此相互推动,在过去的十年中,协同设计越来越重要。

2024-06-03 15:28:15 916

原创 用 C 语言进行大模型推理:探索 llama2.c 仓库(二)

int dim;} Config;float *wq;float *wk;float *wv;float *wo;float *w1;float *w2;float *w3;float *xb;float *xb2;float *hb;float *hb2;float *q;float *k;float *v;float *att;} RunState;int fd;llama2.c中的Transformer是一个结构体,其中最重要的三个成员变量是。

2024-05-09 09:41:12 651

原创 manim实践(一)相关API介绍

Title带有下划线title的mobject。:下划线的宽度是否与文本对齐:下划线与文本之间的举例在了解了这么多的组件以后,再结合动画分析代码,就能够对如何产生这么一个动画的过程有所了解。在了解了要使用的工具后,我觉得要想制作这种数学解释动画,尤其还是用代码做一个。必须要在写代码之前,将整个动画的流程构思出来,细分到每一小步,然后再进行编码。

2024-05-03 09:31:54 783

原创 用 C 语言进行大模型推理:探索 llama2.c 仓库(一)

直接使用Meta发布的llama2来对程序进行运行分析的话,我的计算机因为配置问题运行不了,所以我们在huggingface社区中找一个和llama2有相同结构的模型,但是decode的层数要少很多的模型进行运行。是一个参数量115M左右的超微型小模型,采用Llama2架构,我们选择这个模型替代Meta的llama2对llama2.c仓库中的代码进行分析。注意:在本文中,我们只关心推理代码的架构,以及代码是怎么写的,不关心llm的输出结果是否正确、是否合理。模型的权重文件是huggingface的格式。

2024-04-27 17:51:11 1186 1

原创 manim前言

Manim 是一个解释性数学视频的动画引擎,它通过编程的方式来创建动画,最早由3Blue1Brown频道的创建人Grant Sanderson开发。之后有其他开发者又根据自己的需求开发出了不同的Manim版本,例如:manimGL、manimCE,以及manim3(这是由国人开发的)。我们的所有教程,笔记等都是基于manimCE做的,因为manimCE现在在世界上用的人最多,社区最完善,遇到问题也容易向别人请教。

2024-04-27 14:15:58 382

原创 C++中unordered_map数据类型添加自定义Struct作为Key

最近在工作中,遇到了要将定义的变量使用自定义的作为key,然后使用int作为value,遇到了一些问题,下面做个简单的总结。

2024-04-27 11:34:31 864

原创 设计模式入门(三)单例模式

我这次的应用场景是:程序中有一组寄存器要维护(寄存器在实际中有且只有一组),无论何时我访问这组寄存器,这组寄存器的值和上一次我访问是的值要一样,不会发生变换(除非用户去手动去改变)。因此不用“延迟初始化”(延迟初始化在这里的意思就是:只有我们调用了GetInstance()方法时,才会申请资源)。它的思想就是: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。,但是一直没有机会实际应用到项目中,这次从项目入手简单地对。

2024-04-26 21:28:13 1203 3

原创 C语言中与内存操作有关的一些函数

最近在使用C语言在开发项目时,要对内存进行操作。刚开始写的时候有一点迷糊,看了一些东西后才发现为什么说,因为它可以对内存直接进行操作,多么帅的事情,真的是太帅了。

2024-04-19 18:37:46 464

原创 libtorch中API介绍

这篇博客我们介绍了一些libtorch中tensor的相关操作,请记住:libtorch和pytorch基本上是一一对应,要学会举一反三。

2024-04-13 21:09:53 949

原创 CMake命令介绍

来来回回使用cmake已经多次了,有一些cmake中使用的命令还是比较模糊,这里进行简单地梳理并进行记录。如有问题,欢迎大家指教。

2024-04-13 19:17:49 1203

原创 Linux下使用update-alternatives管理软链接

现在我们从官网下载了3个版本的cmake,同时还有我们本地通过安装的cmake。如下图所示:我们输入cmake,本质上调用的是我们通过安装的cmake。现在我们要编译A工程,需要cmake的版本为3.26,也就是说输入,输出的是3.26。该怎么办呢?在使用update-alternatives进行操作之前,我们先对该名为cmake-,加上它的版本号,方便我们观察。cmake-3.10.2,路径: /usr/bin/cmake-3.10.2。

2024-04-05 22:21:04 804

原创 从头开发一个RISC-V的操作系统(五)汇编语言编程

通过上面的图片就可以明白一条汇编指令是如何到二进制代码的。同时这一块视频中也有详细地讲解。

2024-04-05 19:07:16 1711

原创 从头开发一个RISC-V的操作系统(四)嵌入式开发介绍

目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。

2024-04-05 17:19:21 877

原创 从头开发一个RISC-V的操作系统(三)编译与链接

我们在Linux下经常使用的GCC是由GNU开发的编译器套件。GCC的初衷是为GNU操作系统专门编写一款编译器,现在已经被大多数“Unix-like”操作系统采纳为标准的编译器。现在来说,另一个常见的编译器套件还有LLVM,它是由苹果公司开发的。ELF(Executable Linkable Format)是一种Unix-like系统上的二进制文件格式标准。ELF标准中定义的采用ELF格式的文件分为4类:这里可以看下第四个是核心转储文件,如果你程序崩溃过,那你估计可能对这个文件有所了解。

2024-04-05 16:28:48 1584

原创 从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍

指令集架构(ISA)是底层硬件电路向上层软件程序提供的一层接口规范。这样就为上层软件提供了一层抽象,让使用者不用操心具体的电路结构。

2024-04-04 13:58:18 2302

原创 从头开发一个RISC-V的操作系统(一)计算机系统漫游

目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。

2024-04-04 13:01:35 571

原创 pytorch中关于BF16、FP16的一些操作

类型为FP16的数据也有16bit,1bit为符号位,5bit为指数位,10bit为尾数位。好久没更新博客了,最近在学习过程中遇到了如何生成一个float16的数或者生成一个bfloat16的数,并对其二进制的存储格式进行一些操作的问题,这里做一个简单的记录。首先说明,虽然我们创建tensor时输入的数据为0.785,但是实际数据是0.78515625,这里不做多余解释,只当我们创建的tensor大小为0.78515625。的结果,和我们上面解释的并不一样,这里博主也不太清楚原因,如有了解的,欢迎告知。

2024-03-26 21:52:13 3445

原创 Docker环境安装TVM

之前从源码安装过一次TVM,但是要配置cmake,安装llvm等,太过于繁琐,所以这一次准备在Docker镜像里安装TVM,做以记录。

2024-03-11 22:13:55 1412

原创 wsl2安装docker以及nvidia-docker

想在wsl2(Ubuntu20.04)环境中使用docker以及nvidia-docker来编译一些程序,这里对安装过程进行记录。

2024-03-11 16:57:17 1075

原创 c++和python的互相调用

我们有一个python写的斐波那契数列,但是运行速度太慢,因为Cython中有C语言的特性,所以我们可以使用Cython语言重写斐波那契数列,然后编译为动态链接库,然后在python代码中使用。这是最暴力的一种方法,我们知道,python这个语言也有C的API,所以我们可以直接在C语言代码中使用这些API来调用python模块,下面是一个简单的示例。上面我们已经说过,Cython是python的超集,所以如果我们有一个python脚本或者模块,想要在C语言环境中调用它,那么可以使用cython对这个。

2024-03-01 18:05:34 1450

原创 代码随想录算法训练营第三十六天|435 无重叠区间、763 划分字母区间、56合并区间

这道题目没有一点想法。参考解析,找出每个字母的最大下标,然后根据这个最大下标,不断去更新右边界,总能找到某个字符的最大下标满足左边的字母的最大下标都小于这个下标,然后将这个长度存起来,就是一个符合要求的字符串。同时对左边界进行更新。这道题目的思路以及解法和前面几道题目非常相似。也是找重叠区间,遇见重叠区间则进行合并即可(也就是更新右边界);遇见不重叠的区域则直接添加到结果里。我们找到重叠的区域有几个,那也就是要移除几个区域后剩下的区域不重叠。所以这道题目可以变为找重叠区域的问题。这道题目和昨天最后一道。

2024-02-28 20:25:06 354

原创 代码随想录算法训练营第三十四天|860 柠檬水找零、406 根据身高重建队列、452 用最少数量的箭引爆气球

否则5的个数减一,10的个数加一;遇到20有两种情况,一种是有没有一个10和一个5,另一种是有没有3个5,有的话对应个数减减,没有的话返回。本题目自己看是一点都不会,参考解析后恍然大悟。先对身高从大到小排序,然后再根据人数对数组进行调整,代码也非常简单。这道题目在贪心题目中来说比较简单。遇到5我们直接收下;遇到10我们先看我们有没有5,没有5则返回。的初始值,如果两个气球重叠了,就得更新边界以确保下一个气球也有可能重叠。这道题目画图来解释是最直观的,有难度。

2024-02-27 21:37:50 206

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除