ncnn General Intrinsic

qq24tv8q  于 4个月前  发布在  其他
关注(0)|答案(9)|浏览(56)

目前ncnn中支持了arm,x86,risc-v,mips等向量计算优化,但是他们的kernel计算基本相同,只是用到的intrinsic不一样,造成了大量backend中代码重复,一种有效的方法是:使用一种General Intrinsic,通过宏来控制各种backend的指令实现,可以让同一套kernel在所有平台适用。

vcirk6k6

vcirk6k61#

不想统一。

统一就意味着每次 PR 都很困难、读的人也很烦躁,就拆开白嫖很开心。

s6fujrry

s6fujrry2#

写汇编我理解确实也没有必要统一,写intrinsic统一应该也可以白嫖啊,这不冲突啊。

iyfamqjs

iyfamqjs3#

想扣走 ncnn kernel 的人,就要把那层抽象也扣走。不好嫖。

5ssjco0h

5ssjco0h4#

当初 channel gap 的设计已经很恶心人了。不用为了指令抽象搞那么复杂。

就简简单单的,读的人舒服、改的人也好改,就很好。毕竟又没有 DDL 在催。

rbl8hiat

rbl8hiat5#

如果写好了,其实这个抽象应该就是一个头文件,不影响可读性,倒是代码修改更方便了,比如arm下面有一处bug,不需要在risc-v,mips,x86下面都修改一次,维护等都好啊,减少重复代码,重复劳动力。

ahy6op9u

ahy6op9u6#

换成 mge 的语言来解释吧...
类似于
https://github.com/MegEngine/MegEngine/blob/9809871e1316d19ac25a864c166df33006059887/dnn/src/arm_common/convolution/int8x8x32/algos.cpp#L62

这些抽象、一个个的子函数、class 设计,让 newcomer 阅读挺痛苦。我没有说这么写不好,这些确实高效、确实适合大团队开发、能够同时满足各种需求。花费一段时间、熟悉了之后没感觉,但开源项目使用者不会投精力在反推怎么设计软件上、甚至没有能力反推这些

如果封装了,势必要有个 macro/function 叫做 SIMD_INT8_DOT whatever,在思维中增加了负担,这也是实际存在的。当我想给 mge pr kernel 的时候,第一个阻碍不是 kernel 怎么实现,而是那些“思维负担”。这些“思维负担”让我难以独立地找到代码应该放在哪个地方。加文档只是补救方法。

当然可以说“这不是很简单么,几个额外函数而已”... 啊 ncnn 风格就是这样。

4smxwvx5

4smxwvx57#

关键区别:

  • ncnn dev 不是团队,说白了是散兵游勇,除了 @nihui 都是心血来潮/无规划发 pr 。代码复杂了没有人可以问,所以不能复杂
  • ncnn 写了就是让 user 能方便地抄走的,所以不能随便抽象。class/macro 越多越不好抄袭
pbossiut

pbossiut8#

BTW,我并不是说哪边需要改。这些差异仅仅是在适应不同生产方式

唯物主义信念:如果 ncnn 拿到了一堆 p7/p8 hc,也要体现价值观(AKA 抓手)的话,相信也会变成那种代码结构、也要写那些横向对比的 PPT。

beq87vna

beq87vna9#

赞同楼上大佬的说法,现在市面上的端侧推理框架越来越多,但NCNN真的是最简单最适合入门端侧推理部署的那个,就是因为代码简单直白,现象不对或者崩溃了,或者需要加定制功能,调试和修改真的非常方便

相关问题