自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编写自定义的LLVM Pass

今晚反思了一下,自己最近看的东西太发散了,只有一个模糊的主题——LLVM,然后看了很多作者的一系列文章,但是这些文章比较多而杂,大多数都是一个系列,且较为发散,近来又喜欢发现一个作者便将该作者的一系列文章进行阅读,然后其中引用了另一个作者的文章,又要读一大箩筐,这样铺的太开而没有线,今后还是以一个较为固定且细致的主题发布博文,这样也方便读者查找和掌握重点,用到的资料以链接的形式附在文中,如果某天的资料没有看完,仍可以将链接附在文中,以飨读者。本文主要是阅读LLVM的。

2024-01-06 23:13:36 704

原创 【算法】leetcode刷题心得(三)

心得一:使用string代替char,也即用C++的一些更加安全的操作代替C语言,例如C++中通过定义string类很好的封装了字符串相关的操作,比如定义一个指定长度的字符串,或者修改字符串的长度,这是C中的字符数组代替不了的功能。心得二:注意区分数字和字符,一个数字如果按照字符理解的话转换出的int不是自身,而是数字在ascii中的位置。一个数字不能简单的看作字符与’0’的转换,因为存在进制和多位数。

2025-03-25 23:19:03 71

原创 【C++】提倡指针符号与数据类型分隔的对齐规范

因此最好将指针和变量名贴在一起,这样就可以提醒自己定义指针一定要带上指针符号。我平时编写C++代码时有一个习惯,会将指针符号后置,也即。这样代码无法进行编译,因为end的数据类型是。

2025-03-23 15:11:27 93

原创 【算法】【算法】leetcode刷题心得(二)

继续记录。

2025-03-19 11:36:29 211

原创 【算法】完全二叉树最后一个非叶节点的索引(备份笔记)

111

2025-03-19 11:13:05 84

原创 【算法】leetcode刷题心得(一)

力扣官方的题解其实已经很详细了,如果我再写文章去po我自己的算法方案看起来很班门弄斧,因此开一个新的坑,不定期更新刷leetcode等算法题的心得,一篇集中3到5个吧,读者朋友们可以当段子来读。

2025-03-18 17:31:52 260

原创 【算法】牛客笔试系统挖的坑(笔前必看)

我采取的措施是每次读取一个字符,直到读取到换行符时说明读取完成,跳出循环,但在实际操作中发现,牛客的系统会一直读取最后一个字符,循环不停。因此就造成可能读取不到换行符的操作。上周的笔试,三道编程题做出来了两道,但是本地自测过了提交过不了,强烈建议所有用力扣刷题的同学注意使用一下牛客等需要自己编写输入输出的OJ。看题解推荐的读取方式是以string的形式每次读取一个string,然后利用size()获取长度之后循环读取。推测存在的问题是对输入字符串的处理逻辑上。祝同学们笔面顺利吧!

2025-03-16 13:05:43 87

原创 【AscendC】自定义适用于ops-contribution仓的ascendcl调用流程笔记

111

2025-03-13 13:56:52 72

原创 【AscendC】关于AscendCL运行的笔记

111

2025-03-13 13:55:52 107

原创 【算法】线段树的应用-力扣3479. 将水果装入篮子 III

这个题就是线段树的应用,但是与之前的文章相比,此处构建的线段树相当于“最大树”,每个节点存储的不是子节点的和,而是子节点中的最大值。注意此处就涉及到之前说的那个s + t 会溢出的问题,因此不能用移位操作来实现。

2025-03-11 13:52:44 254

原创 【算法】线段树

如果用数组来存储线段树,那么就需要存储一颗完全二叉树,假设所有区间长度为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 403

原创 【算法】矩阵置零

针对这道力扣写一点笔记。

2025-03-07 13:10:16 502

原创 【C++】可变模板参数和完美转发

C++中有一个常见的误区,在对pair处理时,有时候需要通过花括号{将pair的元素包裹起来作为参数传递,否则编译器会报错;有时候又可以直接将多个元素直接作为参数传递,编译器不会报错,例如priority_queue的emplace方法。

2025-03-03 21:03:28 303

原创 【算法】三数之和

给你一个整数数组 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 319

原创 【AscendC】使用MindStudio调优算子

主要参考,本文相当于一个简略不完全版本的笔记。

2025-02-26 13:57:56 267

原创 【AscendC】使用Mindinsight调优算子

主要参考官方文档和这篇文章。笔者的环境是910A远程服务器(无ssh,无远程服务),因此需要将分析数据下载到本地再打开。笔者在启动mindinsight服务时遇到了一个端口占用的报错,查看官方文档发现,在使用mindinsight start时有一个–port的选项可以指定其他的端口,因此使用mindinsight start --port xxxx就可以丝滑的使用mindinsight服务了。但是要注意,如果在上一步中指定了其他的端口启动服务,在使用mindinsight stop时同样要通过–port

2025-02-25 12:37:47 235

原创 【AscendC】复现AI原生创新算子挑战赛S1(九)

该算子的实现过程中用了两种方法,一种是针对单个元素的计算,一种是使用一个规约求和的函数加速计算。在官方给出的实现文件中,基本与上述式子一致。

2025-02-23 20:19:23 148

原创 【AscendC】复现AI原生创新算子挑战赛S1(八)

这篇文章介绍ScatterSub的复现,主要是复现逻辑是:通过将每个updates中的数据进行取相反数的操作,然后利用之前讲过的SetAtomicAdd这个API将其写入到index指定的内存位置上,从而实现了sub的操作。选中位置的updates是-4.9258,计算应该是用3.8613 + 4.9258,然而并没有发生加法,而是将其赋值为了4.9258,推测是发生原子加之前将此位置的内存清空了。

2025-02-23 14:57:07 156

原创 【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 309

原创 【AscendC】复现AI原生创新算子挑战赛S1(六)

而通过手动计算asinh_grad得到的结果是:0.43123266328354374418597915357568。这就很离谱了,和golden和output的结果都不同。怀疑是因为精度不同导致的。

2025-02-20 16:13:43 230

原创 【AscendC】复现AI原生创新算子挑战赛S1(六)

不得不说这个式子本身还是很难的,笔者只是验证了其正确性就花费了3张A4纸的草稿。

2025-02-20 06:30:00 103

原创 【AscendC】复现AI原生创新算子挑战赛S1(五)

接上文,910A在实现上述算法时遇到了一个问题,也即如何通过compare和select实现对绝对值较大的元素和绝对值较小的元素进行分别对待。经过社区提醒发现此报错是在run.sh中提示的,通过调整run.sh中的baseline可以解决该报错的问题。接下来再梳理一下fastgelu中所有的测试用例的情况。目前已提交社区,正在等待回复中。

2025-02-19 17:50:47 192

原创 【AscendC】复现AI原生创新算子挑战赛S1(四)

在复现FastGelu的过程中,发现第三赛季自己在尝试Asinh这个题时之所以会有一个测试用例过不去,主要在于Asinh的标准公式在处理较大的正数时会发生溢出。我的实现方式是-ln(sqrt(x^2 + 1) - x),但仍然存在对x进行平方可能造成的溢出的问题,使得计算结果错误。经过deepseek的提醒,发现对于较大的正整数有一种近似的计算方式,也即计算ln(2|x|)。这可能就是当时实现Asinh一直有一个测试用例无法通过的原因吧。

2025-02-19 16:30:33 198

原创 【AscendC】复现AI原生创新算子挑战赛S1(三)

今天调试FastGelu算子,在910A上遇到了一个问题,所有的测试用例均失败,经过调试发现是由于Mins这个API在910A上无法正确执行,因此采用DeepSeek给出的公式。

2025-02-18 23:21:53 82

原创 【学习】验证数独的正确性

使用三个与数独相同尺寸的二维数组,作为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 1203

原创 【AscendC】复现AI原生创新算子挑战赛S1(二)

第一个算子是AddcMul,经过测试,发现该算子不能正确的实现广播操作,在多个维度上进行广播时无法成功,参考。实现的广播操作可以正确的完成。

2025-02-17 21:22:25 153

原创 【AscendC】复现AI原生创新算子挑战赛S1(一)

最近开一个新坑,复现一下AI原生创新算子挑战赛前两个赛季的代码,由于前两个赛季的代码已经开源,且第二赛季有满分战队,因此本次复现工作基于前两个赛季的冠军塞队的开源代码,同时参考一些论坛中的代码和其他赛队的代码,以学习代码,增强测试、代码修复为主。第一赛季的获奖队伍是0xCCCCCCCC,在预赛中获得了88分,虽然没有满分,但是可以参考他们的代码进行测试覆盖。第二赛季的冠军队伍是重生之我在昇腾摸鱼。

2025-02-17 21:18:27 289

原创 【ascendc】在ascendc中实现张量的广播

j / this->y_sumndarray[k]相当于获取对应的位置在x数组中的对应维度的长度,再对this->y_ndarray[k]进行取余,相当于获取到对应维度的信息。对于j等于8时的场景,原始的对应维度分别为1, 4, 8, 括号内的值为0, 0, 0,所以最终得到的偏移量为0,也即原数组中第一个数。k的遍历分别表示目标维度,那么this->x_sumndarray[k]表示的是在对应维度的原始数组上的长度。,用一种较为完备的方式实现了数组的广播,现结合文章中提供的例子分析文中的代码。

2025-02-05 13:51:58 275

原创 起猛了,看到CUDA都成护城河了

如果中国的公司可以做出有同等计算能力的显卡,在此显卡上构建软件算法实现一套自己的编程框架,不能说在全方面碾压,但是实现在某一个领域或者方面进行突破是可行的。第一个类比,如果你知道编译器,学过编译原理,你应该知道编译器中有一个IR的中间结构,各种高级语言会转为IR,然后由IR转成对应平台的汇编或机器语言,PTX就相当于是CUDA的IR,因此如果你不用高级语言编写程序,直接用IR编写(很少见,但也可以承认这种行为是可行的),或者是在IR的基础上进行针对的优化,使得产生的汇编代码更加高效,这也是可行的。

2025-01-30 21:26:23 177

原创 【AscendC】tiling方案设计不当引起的一个时隐时现的bug

对于补齐的位置,通常是以补0作为典型的补齐手段,此时如果原数据的最大值为大于等于0的值,那么在计算max的过程不会产生影响,但是在计算x-max之后就会造成补0的位置的值变成了负数,从而经过指数操作之后会产生正值,如果其后有规约求和的操作就会造成求和的数目过大从而造成结果错误。但是上述过程可能会出现无法检测的情况,也即补齐的数目非常少(例如只有1个位置需要补0),此时可能出现没有影响到最终结果的情况。因此在tiling设计中尤其要注意非对齐场景,这些补齐的位置是否会对计算产生影响。

2025-01-13 17:13:48 376

原创 【笔记整理】记录参加骁龙AIPC开发者技术沙龙的笔记

首先了解了一个概念叫AIoT,我的理解就是AI + IoT + 5G,通过AI的发展使得边缘计算、数据整合和处理变得快捷方便,不仅限于传统的云端数据处理,在边缘的IoT设备上也可以进行智能化打造,通过5G的通信能力扩展可以实现海量边缘数据的处理和整合,不仅仅在智能家居领域,在智慧城市,智慧交通,智能安防等等多个场景都有应用,可以说具有IoT设备和智能化需求的场景都可以使用。

2025-01-12 12:01:45 445

原创 【AscendC】记一个诈尸的细节

在做算子开发的时候,因为提供的例子里面有128个数,又涉及到规约操作,不方便我手敲计算器验算,因此写了一个小的例子,把长度指定为了3个,结果试了好久结果一直是错的,我就很纳闷为什么一个ReduceSum操作也能出现错误,看官方文档也只说了4字节对齐的情况(float类型),并没有提到count的限制。试了很多条路径实在无奈了,最后尝试了一下把长度设为32B的整数(我设置的是8),然后就很丝滑的通过了。那我付出的努力算什么?已提单,等官方回复。

2025-01-05 19:36:47 108

原创 【AscendC】基于LpNorm分析如何在AscendC算子中处理维度信息

维度信息的处理在算子中是常见的,对于二维矩阵就存在行和列两个不同的处理方式,对于高维张量可以处理的维度信息就更丰富了。受限于我们生活在三维的世界,直接将一个高维数组完全展现出来是很难的,因此本文将采用一种更显见的二维化的方式展现出来。对应的startIndex 分别为0,1, 2, ……本文使用的例子是一个三维张量,三维长度分别为3,5,7。对于第一个xLocal,其取数据对应的索引分别为0,35,70,和我们的分析是一致的。j的取值可能是0,1, 2,。对应的索引分别为0,35,70。

2024-12-25 17:15:56 1076

原创 【AscendC】ReduceSum中指定workLocal大小时如何计算

对于tensor前n个数据计算接口,firstMaxRepeat为count/elementsPerRepeat,比如在half类型下firstMaxRepeat就是count/128,在float类型下为count/64,按需填入,对于count<elementsPerRepeat的场景,firstMaxRepeat就是1。首先注意到api的调用,分为高维切分模式和指定数量模式,两种模式的计算是不同的,主要在于repeattimes这个变量的大小。此处指定的srcDataSize是288,由图1的注释,

2024-12-24 22:14:24 455

原创 【AscendC】记录LpNorm的tiling方案中用到的一些变量

LpNorm的官方仓库链接在operator_contrib/LpNormV2CustomSample/FrameworkLaunch/LpNormV2Custom。观察其tiling方案可以看到,有几个比较特殊的变量:pType,pValue,stepSize,unitCount,totalLength。下面结合代码分别对其进行分析。

2024-12-24 22:11:43 271

原创 【pytorch】pytorch的缓存策略——计算机分层理论的另一大例证

PyTorch 会在后台管理内存池(memory pool)。当你删除或覆盖一个变量时,PyTorch 并不会立即将这块内存归还给操作系统,而是将其加入到缓存中,以便后续再分配给其他变量。这样,后续的内存分配可以直接从缓存中拿到空闲内存,从而避免了频繁的内存分配和释放,提升了程序的性能。经过ptrblck大神的解答,似乎是pytorch中有缓存的策略,可以将变量使用到的内存留在缓存池中重复使用。这就相当于在内存上加了一层pytorch的内存池,原来使用完直接释放的模式变为了使用后通过内存池再释放的模式。

2024-12-03 11:59:06 391

原创 【python】记录python编译器封神的一段代码

编译器在识别到del之后就报了一个error,同时进行了智能提示。

2024-12-01 18:39:33 299

原创 【Pytorch】pytorch中内存的计算

常用的pytorch计算环境是包含GPU在内的异构计算环境,因此内存的计算分为CPU内存的计算和GPU内存的计算。

2024-12-01 18:22:56 276

原创 【ascendc】精度转换笔记存档

2024-11-25 14:35:53 120

原创 【AscendC】constexpr别忘记,编译器检查很严厉

使用AscendC编写算子时,不可避免的遇到对多种不同类型的输入采取不同的方式进行处理,此时就需要编写一个分支处理逻辑,在实际开发和调试代码的过程中,笔者发现有个分支无论怎么处理都会报错。经过反复检查后发现,在对应的else if之后没有添加constexpr,这就造成了编译器不知道此种情况下的类型信息是什么,因此无法顺利完成推理。

2024-11-21 20:34:47 108

空空如也

空空如也

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

TA关注的人

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