目前ncnn中支持了arm,x86,risc-v,mips等向量计算优化,但是他们的kernel计算基本相同,只是用到的intrinsic不一样,造成了大量backend中代码重复,一种有效的方法是:使用一种General Intrinsic,通过宏来控制各种backend的指令实现,可以让同一套kernel在所有平台适用。
vcirk6k61#
不想统一。
统一就意味着每次 PR 都很困难、读的人也很烦躁,就拆开白嫖很开心。
s6fujrry2#
写汇编我理解确实也没有必要统一,写intrinsic统一应该也可以白嫖啊,这不冲突啊。
iyfamqjs3#
想扣走 ncnn kernel 的人,就要把那层抽象也扣走。不好嫖。
5ssjco0h4#
当初 channel gap 的设计已经很恶心人了。不用为了指令抽象搞那么复杂。
就简简单单的,读的人舒服、改的人也好改,就很好。毕竟又没有 DDL 在催。
rbl8hiat5#
如果写好了,其实这个抽象应该就是一个头文件,不影响可读性,倒是代码修改更方便了,比如arm下面有一处bug,不需要在risc-v,mips,x86下面都修改一次,维护等都好啊,减少重复代码,重复劳动力。
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 风格就是这样。
4smxwvx57#
关键区别:
pbossiut8#
BTW,我并不是说哪边需要改。这些差异仅仅是在适应不同生产方式。
唯物主义信念:如果 ncnn 拿到了一堆 p7/p8 hc,也要体现价值观(AKA 抓手)的话,相信也会变成那种代码结构、也要写那些横向对比的 PPT。
beq87vna9#
赞同楼上大佬的说法,现在市面上的端侧推理框架越来越多,但NCNN真的是最简单最适合入门端侧推理部署的那个,就是因为代码简单直白,现象不对或者崩溃了,或者需要加定制功能,调试和修改真的非常方便
9条答案
按热度按时间vcirk6k61#
不想统一。
统一就意味着每次 PR 都很困难、读的人也很烦躁,就拆开白嫖很开心。
s6fujrry2#
写汇编我理解确实也没有必要统一,写intrinsic统一应该也可以白嫖啊,这不冲突啊。
iyfamqjs3#
想扣走 ncnn kernel 的人,就要把那层抽象也扣走。不好嫖。
5ssjco0h4#
当初 channel gap 的设计已经很恶心人了。不用为了指令抽象搞那么复杂。
就简简单单的,读的人舒服、改的人也好改,就很好。毕竟又没有 DDL 在催。
rbl8hiat5#
如果写好了,其实这个抽象应该就是一个头文件,不影响可读性,倒是代码修改更方便了,比如arm下面有一处bug,不需要在risc-v,mips,x86下面都修改一次,维护等都好啊,减少重复代码,重复劳动力。
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 风格就是这样。
4smxwvx57#
关键区别:
pbossiut8#
BTW,我并不是说哪边需要改。这些差异仅仅是在适应不同生产方式。
唯物主义信念:如果 ncnn 拿到了一堆 p7/p8 hc,也要体现价值观(AKA 抓手)的话,相信也会变成那种代码结构、也要写那些横向对比的 PPT。
beq87vna9#
赞同楼上大佬的说法,现在市面上的端侧推理框架越来越多,但NCNN真的是最简单最适合入门端侧推理部署的那个,就是因为代码简单直白,现象不对或者崩溃了,或者需要加定制功能,调试和修改真的非常方便