- 博客(156)
- 收藏
- 关注
原创 编写自定义的LLVM Pass
今晚反思了一下,自己最近看的东西太发散了,只有一个模糊的主题——LLVM,然后看了很多作者的一系列文章,但是这些文章比较多而杂,大多数都是一个系列,且较为发散,近来又喜欢发现一个作者便将该作者的一系列文章进行阅读,然后其中引用了另一个作者的文章,又要读一大箩筐,这样铺的太开而没有线,今后还是以一个较为固定且细致的主题发布博文,这样也方便读者查找和掌握重点,用到的资料以链接的形式附在文中,如果某天的资料没有看完,仍可以将链接附在文中,以飨读者。本文主要是阅读LLVM的。
2024-01-06 23:13:36
1014
原创 HPC101-lab2.5 rvv intrinsics实现整数乘法
证明对于连续数据使用不带stride的读写会显著优于带stride的读写。同时推荐使用printf的方式对rvv用到的一些向量进行打印。使用直接load的方式加载。
2025-10-29 16:03:49
141
原创 【leetcode】由矩阵旋转说起
至于为什么是N - 1,而不是N,这是因为索引是从0开始的,也即0, 1, …N - 1,利用高斯的思想就可以得到。可以简单理解为,在有负号的轴上发生了累积,在同号的轴上发生了抵消,因此y1结果不变,y2多出了一个n - 1。此处的推导结果显示其不涉及连续与离散的区分,以及方阵与否的影响,且结果显示与M无关。,想用临时变量存放矩阵旋转过程中各个点旋转之后的位置,这就需要推导他们的关系。但在旋转之后,中心点坐标发生了变化,变成了。
2025-10-24 11:16:29
252
原创 一道有关树的考察多方面知识的笔试题
基础知识就是:如果只给一个树的某个遍历结果,是无法得到唯一的一棵树的,因此这道题的巧妙之处是约束了完全二叉树.一个输入数组,是一个完全二叉树的中序遍历结果,要求输出广度优先搜索的结果.关键在于如何确定左子树(必须是完全的或者尽量多的)的范围.
2025-10-22 03:03:06
103
原创 笔试中一道数学相关的编程题
给定两个等长的数组a和b,可以任意重排,但不能交换a和b中的元素,然后将a[i] - b[i]构成的新数组,要求新数组具有钟摆特性(也即非边界元素必须比相邻两个元素都大或者都小。用大模型答了一下,其实这题最关键的是用最大值减去最小值可以获取一个最大结果,用最小值减去最大值可以获取一个最小结果,交替使用就可以保证摆动效果存在且摆动范围逐渐变小。
2025-10-19 15:20:37
175
原创 近期笔试心得
常见的移动语义操作是通过std::move实现的,但std::move本身完成的工作只是将左值转成右值引用,从而告诉编译器,创建对象时使用移动构造,而非拷贝构造。理清了左值和右值之后,就会发现,我们常用的引用是左值引用,其作为参数传递时可以理解为将变量本身传递到了函数内。上面的x既出现在了左值又出现在了右值,但因为x是有地址的,所以x是左值。而右值引用可以绑定右值,有一个特例就是常量的左值引用也可以绑定一个右值。中,a+5这个表达式是没有地址的,因此是右值。5. 左值引用和右值引用。
2025-10-19 13:31:59
172
原创 近期的笔试和面试的复盘
且初始化顺序与析构顺序相反。在同一文件中按照从上到下的顺序构造,在不同文件中构造顺序不确定(也即无法保证明确的构造顺序,除非通过一些手段显式的修复这些问题,例如:懒加载,显式初始化等)比如target_link_libraries(A PRIVATE B),那么如果C链接了A,关键字就会影响B对C的可见性,其中比较奇怪的是interface,描述指的是C会链接A,但是B不链接A这种情况。如果对一个类构造const类型的对象,那么其初始化只支持使用初始化列表的方式,而不能使用普通的带参数输入的初始化方法。
2025-10-17 16:39:50
1022
原创 【leetcode】两次遍历的一类题目及其优化
这类型题目中,都存在某个点与其左右两边的元素有依赖关系的情况,例如1中,每个点的值取决于其左右两边的情况,例如序列[1, 3, 5, 4, 3, 2],其中第三个元素也即5,由左边元素决定其为3,由右边元素决定其为4,因此需要从左边遍历一遍,再从右边遍历一遍,得到两种情况下的值取最大值。对于问题2,可以通过左边遍历拿到某个元素左边位置的元素乘积,通过右边遍历拿到右边位置的元素的乘积,二者相乘作为当前位置的结果。
2025-10-09 16:16:27
368
原创 【leetcode】两次遍历的一类题目及其优化
本文分析了LeetCode中两类具有相似解法的题目:分发糖果和除自身以外数组的乘积。这两类问题的共同点是都需要对数组进行两次遍历(从左到右和从右到左),以计算每个元素与左右相邻元素的关系。在分发糖果问题中,每个元素的值取决于左右邻居的比较结果;在乘积问题中,结果等于左右两侧元素乘积的积。文章指出可以通过优化策略,在第二次遍历时仅使用常数空间来存储中间结果,从而将空间复杂度优化为O(1)。这种两次遍历加空间优化的方法适用于具有类似特征的题目。
2025-10-09 16:13:43
144
原创 orangepi RV2环境配置
首先吐槽一句,tf卡重启之后就进不去系统,不知道是香橙派的问题,还是所有部分板子的问题,反正表现就是你装好了系统,但是用了sudo reboot之后,就进不去系统了,调了我好久。最终的解决方案是用U盘方式启动,因为emmc和nvmi都需要购买新的硬件。
2025-10-05 02:33:11
106
原创 【笔试心得】一家没有编程题的牛客笔试
这篇文章总结了六个技术问题: 软中断与硬中断的区分,指出计时器触发属于硬中断 自定义分配器的优化原理(减少碎片、提升速度) 浅拷贝与深拷贝的区别,特别说明浅拷贝对可变子对象的同步影响 运行时多态的正确实现方式及常见错误 volatile关键字的正确理解(禁止特定优化但非全部优化) 软硬链接的本质区别,解释为何硬链接不受源文件删除影响 核心知识点包括:中断机制、内存管理、拷贝机制、多态实现、编译器优化和文件系统链接原理。
2025-08-24 14:28:18
717
原创 【leetcode】买卖股票的最佳时机 II引发的思考
文章讨论了股票买卖问题(II)的两种解法:贪心算法和动态规划。核心论证了贪心算法的适用性,证明将总区间拆分成多个不重叠子区间能获得更大收益。同时指出题目特殊性在于需要二维动态规划来记录"持有/未持有"两种状态,而一维动态规划会退化为贪心算法。作者通过数学公式和实际意义两方面验证了贪心策略的正确性,并强调题目假设了预知未来价格的能力。
2025-08-24 00:08:50
216
原创 【算法】leetcode刷题心得(三)
心得一:使用string代替char,也即用C++的一些更加安全的操作代替C语言,例如C++中通过定义string类很好的封装了字符串相关的操作,比如定义一个指定长度的字符串,或者修改字符串的长度,这是C中的字符数组代替不了的功能。心得二:注意区分数字和字符,一个数字如果按照字符理解的话转换出的int不是自身,而是数字在ascii中的位置。一个数字不能简单的看作字符与’0’的转换,因为存在进制和多位数。
2025-03-25 23:19:03
127
原创 【C++】提倡指针符号与数据类型分隔的对齐规范
因此最好将指针和变量名贴在一起,这样就可以提醒自己定义指针一定要带上指针符号。我平时编写C++代码时有一个习惯,会将指针符号后置,也即。这样代码无法进行编译,因为end的数据类型是。
2025-03-23 15:11:27
139
原创 【算法】leetcode刷题心得(一)
力扣官方的题解其实已经很详细了,如果我再写文章去po我自己的算法方案看起来很班门弄斧,因此开一个新的坑,不定期更新刷leetcode等算法题的心得,一篇集中3到5个吧,读者朋友们可以当段子来读。
2025-03-18 17:31:52
300
原创 【算法】牛客笔试系统挖的坑(笔前必看)
我采取的措施是每次读取一个字符,直到读取到换行符时说明读取完成,跳出循环,但在实际操作中发现,牛客的系统会一直读取最后一个字符,循环不停。因此就造成可能读取不到换行符的操作。上周的笔试,三道编程题做出来了两道,但是本地自测过了提交过不了,强烈建议所有用力扣刷题的同学注意使用一下牛客等需要自己编写输入输出的OJ。看题解推荐的读取方式是以string的形式每次读取一个string,然后利用size()获取长度之后循环读取。推测存在的问题是对输入字符串的处理逻辑上。祝同学们笔面顺利吧!
2025-03-16 13:05:43
156
原创 【算法】线段树的应用-力扣3479. 将水果装入篮子 III
这个题就是线段树的应用,但是与之前的文章相比,此处构建的线段树相当于“最大树”,每个节点存储的不是子节点的和,而是子节点中的最大值。注意此处就涉及到之前说的那个s + t 会溢出的问题,因此不能用移位操作来实现。
2025-03-11 13:52:44
321
原创 【算法】线段树
如果用数组来存储线段树,那么就需要存储一颗完全二叉树,假设所有区间长度为n,那么所有节点的个数应该是2^(up(log(n)) + 1) - 1,其中up表示向上取整,那么特殊情况是什么,也即最后一层只有一个节点时,此时总的节点n为2 ^ x + 1(x为层数),那么计算所有节点得到的结果是4n - 5,因此要分配4n的存储空间。如果用内存池来管理,在创建节点时为其分配内存,那么可以用哈夫曼树的思路,n个叶子节点的哈夫曼树总共是2n - 1个节点,因此只需要分配2n - 1个内存空间。
2025-03-11 11:24:38
446
原创 【C++】可变模板参数和完美转发
C++中有一个常见的误区,在对pair处理时,有时候需要通过花括号{将pair的元素包裹起来作为参数传递,否则编译器会报错;有时候又可以直接将多个元素直接作为参数传递,编译器不会报错,例如priority_queue的emplace方法。
2025-03-03 21:03:28
360
原创 【算法】三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,1,1]输入:nums = [0,0,0]解释:唯一可能的三元组和为 0。输出:[[0,0,0]]
2025-02-27 20:16:36
365
原创 【AscendC】使用Mindinsight调优算子
主要参考官方文档和这篇文章。笔者的环境是910A远程服务器(无ssh,无远程服务),因此需要将分析数据下载到本地再打开。笔者在启动mindinsight服务时遇到了一个端口占用的报错,查看官方文档发现,在使用mindinsight start时有一个–port的选项可以指定其他的端口,因此使用mindinsight start --port xxxx就可以丝滑的使用mindinsight服务了。但是要注意,如果在上一步中指定了其他的端口启动服务,在使用mindinsight stop时同样要通过–port
2025-02-25 12:37:47
282
原创 【AscendC】复现AI原生创新算子挑战赛S1(九)
该算子的实现过程中用了两种方法,一种是针对单个元素的计算,一种是使用一个规约求和的函数加速计算。在官方给出的实现文件中,基本与上述式子一致。
2025-02-23 20:19:23
185
原创 【AscendC】复现AI原生创新算子挑战赛S1(八)
这篇文章介绍ScatterSub的复现,主要是复现逻辑是:通过将每个updates中的数据进行取相反数的操作,然后利用之前讲过的SetAtomicAdd这个API将其写入到index指定的内存位置上,从而实现了sub的操作。选中位置的updates是-4.9258,计算应该是用3.8613 + 4.9258,然而并没有发生加法,而是将其赋值为了4.9258,推测是发生原子加之前将此位置的内存清空了。
2025-02-23 14:57:07
208
原创 【AscendC】复现AI原生创新算子挑战赛S1(七)
假设有3个核,其核内的求和结果分别为 sum1 sum2 和 sum3,分别计算 sum1 / total, sum2 / total, sum3 / total之后再求和,其结果和sum / total一样,因为sum = sum1 + sum2 + sum3。整个Process的总体架构如上图所示,首先每次会将Sum置0,然后执行只有CopyIn 和Compute 的计算,最后利用一个大括号包裹的代码块,实际上完成的是CopyOut 的工作。
2025-02-21 14:15:29
353
原创 【AscendC】复现AI原生创新算子挑战赛S1(六)
而通过手动计算asinh_grad得到的结果是:0.43123266328354374418597915357568。这就很离谱了,和golden和output的结果都不同。怀疑是因为精度不同导致的。
2025-02-20 16:13:43
265
原创 【AscendC】复现AI原生创新算子挑战赛S1(五)
接上文,910A在实现上述算法时遇到了一个问题,也即如何通过compare和select实现对绝对值较大的元素和绝对值较小的元素进行分别对待。经过社区提醒发现此报错是在run.sh中提示的,通过调整run.sh中的baseline可以解决该报错的问题。接下来再梳理一下fastgelu中所有的测试用例的情况。目前已提交社区,正在等待回复中。
2025-02-19 17:50:47
226
原创 【AscendC】复现AI原生创新算子挑战赛S1(四)
在复现FastGelu的过程中,发现第三赛季自己在尝试Asinh这个题时之所以会有一个测试用例过不去,主要在于Asinh的标准公式在处理较大的正数时会发生溢出。我的实现方式是-ln(sqrt(x^2 + 1) - x),但仍然存在对x进行平方可能造成的溢出的问题,使得计算结果错误。经过deepseek的提醒,发现对于较大的正整数有一种近似的计算方式,也即计算ln(2|x|)。这可能就是当时实现Asinh一直有一个测试用例无法通过的原因吧。
2025-02-19 16:30:33
239
原创 【AscendC】复现AI原生创新算子挑战赛S1(三)
今天调试FastGelu算子,在910A上遇到了一个问题,所有的测试用例均失败,经过调试发现是由于Mins这个API在910A上无法正确执行,因此采用DeepSeek给出的公式。
2025-02-18 23:21:53
121
原创 【学习】验证数独的正确性
使用三个与数独相同尺寸的二维数组,作为visited的tag,分别记录行、列和3*3方格的数据。(分别表示行和列信息),将其转化为index也即i / 3 * 3 + j / 3。位操作的方案类似,就是用位操作代替了数组操作从而提高了存储效率。源于面试的一个问题,在leetcode里也有这道题,参考站内的。3小方格里,也即判断当前的数据属于哪个3 * 3小方格。首先i / 3 和 j / 3会将当前的位置映射到3。其中前两个约束条件都是容易满足的,关键在第三个。
2025-02-18 20:04:10
1290
原创 【AscendC】复现AI原生创新算子挑战赛S1(二)
第一个算子是AddcMul,经过测试,发现该算子不能正确的实现广播操作,在多个维度上进行广播时无法成功,参考。实现的广播操作可以正确的完成。
2025-02-17 21:22:25
235
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅