游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

CANN算子利用迭代器高效实现Tensor数据切割分块处理

  摘要:本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作。
  本文分享自华为云社区《CANN算子:利用迭代器高效实现Tensor数据切割分块处理云社区华为云》,作者:CatherineWang。任务场景及目标
  在CANNaicpu算子开发实现中,经常需要对n维Tensor进行切片(slice)、切块(dice)、转置(transpose)、交换指定维度数据(shuffle)等操作。上述操作实质上是按照指定规律依次进行数据读取,并将读取到的数据写入新的数据地址中。
  本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作。
  Diagonal算子希望对指定两个维度的数据进行对角元素的提取,最终返回张量的对角线元素。本质上该算子通过属性dim1和dim2确定一个矩阵,返回该矩阵的对角元素(存在偏移量offset),并将其放置在最后一维。非dim1和dim2的维度,将会被当成batch维度处理。常规方案:
  方案一:将shape为s,元素个数为numel的输入Tensor:x转化为Eigen::Tensor:eigenx;对eigenx进行shuffle操作,将dim1和dim2换至倒数第二和倒数第一维;通过reshape操作将eigenx变化为一个三维Eigen::Tensor:reshapex,shape(numels〔dim1〕s〔dim2〕,s〔dim1〕,s〔dim2〕);对后两维数据取对角元素,并将最终数据赋值给输出数据地址。注意:由于Eigen::Tensor不能够动态设置维度,即NumIndices项必须是一个具体的值,因此需要提前定义对应维度的Eigen::Tensor备用。
  方案二:对于一个n维的Tensor,利用n层for循环进行数据的定位读取,并取对角值。
  可以看出上述两个方案对动态大小的输入计算实现处理都较为繁琐,需要提前分情况设置对应维度的Eigen::Tensor或是for循环逻辑结构,即存在维数限制。准备知识及分析
  我们知道再AICPU中,对于一个Tensor,我们能够通过GetTensorShape、GetData等函数获得Tensor形状大小、具体数据地址等信息。但我们不能通过位置坐标的形式直接获得指定位置的数据值。1。步长
  首先介绍步长(stride)这一概念(对这部分知识已掌握的可以直接跳转下一部分内容)。stride是在指定维度dim中从一个元素跳到下一个元素所必需的步长。例如,对于一个shape(2,3,4,5)的Tensor,其stride(60,20,5,1)。因此如果想要获取到上述Tensor中位置坐标为〔1,2,1,3〕的数据,只需要找到数据地址中第108(601202513)位对应值。2。迭代器
  定义迭代器PositionIterator,包含私有成员pos和shape,其中pos为初始位置,shape为标准形状。通过重载符号,对pos进行修改,实现迭代器的自增操作。基于上述迭代器,可以实现对给定的shape依次取位操作。如给定对于给定的shape(d1,d2,,dn),从初始位置(0,0,,0)开始,依次取(0,0,,0,0),(0,0,,0,1),,(0,0,,0,dn1),(0,0,,1,0),(0,0,,1,1),,(d11,d21,,d{n1}1,d{n}1)。
  事实上,可以将上述迭代器理解为一种进制,对于给定的标准形状shape(d1,d2,,dn),第i位运算时便是逢di进1。同时通过PositionIterator。End()控制迭代器的结束。具体实现如下:templatetypenameTclassPositionIterator{public:PositionIterator(){};PositionIterator(){};PositionIterator(std::vectorTstt,std::vectorTsh){if(stt。size()!sh。size()){PositionIterator();}else{for(unsignedinti0;ish。size();i){if(stt〔i〕sh〔i〕){PositionIterator();}}posstt;shapesh;}}PositionIteratoroperator(){pos〔shape。size()1〕1;for(unsignedintishape。size()1;i0;i){if(pos〔i〕shape〔i〕!0){pos〔i1〕pos〔i〕shape〔i〕;pos〔i〕pos〔i〕shape〔i〕;}}returnthis;}boolEnd(){if(pos〔0〕!shape〔0〕){returnfalse;}returntrue;}std::vectorTGetPos(){returnpos;}std::vectorTGetShape(){returnshape;}private:std::vectorTpos;std::vectorTshape;};Diagonal算子的实现
  利用迭代器,在一般情况下,我们只需要两层for循环,便可以实现Diagonal算子的计算过程。第一层for循环用于确定除dim1和dim2维度的位置坐标,第二层for循环用于对dim1和dim2对应维度确定对角元素位置,通过这样的两层for循环,便可将对角元素位置确定。通过这样的取值处理,相较于Eigen实现思路,计算速度有着明显的提升,且无维度限制,st测试结果对比如下:
  具体实现可参见如下代码:templatetypenameTuint32tDiagonalCpuKernel::DoComputeType(CpuKernelContextctx,constint64toffset,constint64tdim1,constint64tdim2){GettheinuputandoutputTensorinputxctx。Input(0);Tensoryctx。Output(0);GetsomeinformationofinputautoxshapeinputxGetTensorShape();std::vectorint64txshapexshapeGetDimSizes();constint64txdimxshapeGetDims();autodataptrreinterpretcastT(ctx。Input(0)GetData());autoydataptrreinterpretcastT(yGetData());Compute首先计算出对角线元素个数int64tdsizeOffsetSize(offset,dim1,dim2,xshape);生成输入Tensor的步长向量xstridestd::vectorint64txstrideConstructStrideint64t(xshape);分情况讨论,2维和大于2维的情况if(xdim!N2){setthevxshapeandvxstride生成xshape和xstride中除去dim1和dim2对应值的vxshape与vxstridestd::vectorint64tvxshape,vxstride;for(unsignedinttmpdim0;tmpdimxshape。size();tmpdim){if(tmpdim!dim1tmpdim!dim2){vxshape。pushback(xshape〔tmpdim〕);vxstride。pushback(xstride〔tmpdim〕);}}settheyshape,ystride,vystride生成输出Tensor的形状及步长向量:yshape和ystridestd::vectorint64tyshapevxshape;yshape。pushback(dsize);std::vectorint64tystrideConstructStrideint64t(yshape);生成输出Tensor的出去最后一维的步长向量:vystridestd::vectorint64tvystrideystride;vystride。popback();读取对角数据std::vectorint64tvstart(vxshape。size(),0);for(PositionIteratorint64tmyiter(vstart,vxshape);!myiter。End();myiter){利用迭代器确定除dim1和dim2维度的位置坐标autopmyiter。GetPos();通过步长向量和位置坐标计算出输入和输出的基础位置值basepos1和outbaseposint64tbasepos1MulSumint64t(p,vxstride);int64toutbaseposMulSumint64t(p,vystride);for(inti0;idsize;i){结合前面计算出的基础位置值,对dim1和dim2对应维度确定对角元素位置,并赋值给输出数据地址(getdata涉及对上对角还是下对角取元素,不影响对迭代器作用的理解)int64tbasepos2i(xstride〔dim1〕xstride〔dim2〕);int64tarr〔N2〕{xstride〔dim1〕,xstride〔dim2〕};ydataptr〔outbaseposi〕getdata(basepos1basepos2,offset,arr,dataptr);}}}else{for(inti0;idsize;i){int64tbaseposi(xstride〔dim1〕xstride〔dim2〕);int64tarr〔N2〕{xstride〔dim1〕,xstride〔dim2〕};ydataptr〔i〕getdata(basepos,offset,arr,dataptr);}}returnKERNELSTATUSOK;}迭代器的其他用法
  1、数据切条:如Sort算子中,用迭代器对Tensor数据关于tmpaxis维度进行取条,以进行后续的排序操作。for(positioniteratorint64tmit(vstart,vshape);!mit。end();mit){autopmit。getpos();intaxisleninputshape〔tmpaxis〕;std::vectorValueIndexTdata(axislen);intbaseposmulsumint64t(p,vstride);for(int32ti0;iaxislen;i){data〔i〕。valuexdataptr〔baseposiinputstride〔tmpaxis〕〕;data〔i〕。indexi;}
  2、数据切块:切块处理可以利用两个迭代器循环叠加,也可以利用一个迭代器和两个坐标位置for循环
  3、关于指定维度dim,对Tensor降维拆分为N子Tensor:如UniqueConsecutive算子中,首先需要关于属性axis维,将原本的Tensor数据拆分为inputshape〔axis〕个子Tensor(此处用vector存储Tensor中的数据)。std::vectorstd::vectorT1data;for(int64ti0;idim0;i){std::vectorT1tmpv1;for(PositionIteratorint64tmit(vstart,vshape);!mit。End();mit){autoposmit。GetPos();tmpv1。pushback(xdataptr〔MulSumint64t(pos,vstride)iinputstride〔axis〕〕);}data。pushback(tmpv1);}
  点击下方,第一时间了解华为云新鲜技术
  华为云博客大数据博客AI博客云计算博客开发者中心华为云

研究数据AppleMusic在谷歌Play安装量超4000万SensorTower商店数据显示,AppleMusic在全球GooglePlay的预估安装量已经达到4000万次。SensorTower预测,本季度该服务在GooglePla……外媒汇总苹果iPhone9(iPhoneSE2)爆料信息IT之家2月20日消息据IT之家此前报道,种种传闻显示今年三月份苹果将发布全新的iPhone9手机(也有称之为iPhoneSE2),尽管苹果一直保持沉默,但有关这款手机的泄露信……Wedbush富士康复工推迟将对苹果造成冲击IT之家2月11日消息Wedbush分析师DanielIves表示,富士康推迟复工将对系统造成冲击,并进一步扰乱苹果公司的供应链。Ives认为,这种中断对苹果公司造成了打……富士康决定推迟2月10日复工计划,包括郑州iPhone工厂IT之家2月9日消息据日经新闻报道,富士康原本计划在下周一(2月10日)复工,以便于在农历春节假期之后继续生产苹果设备。不过受肆虐的新型冠状病毒的影响,富士康取消了复工计划。……地震预警iOS版2019。0。0发布电波跑赢地震波,适配苹果感谢IT之家网友风陵渡客的线索投递!IT之家10月24日消息昨日,地震预警2019。0。0版本上线苹果AppStore,新版本优化了iOS预警信息推送与登录注册功能,并补……梅西不排除参加2026年世界杯,廉颇老矣,尚能饭否?莱昂内尔梅西不排除代表阿根廷参加2026年世界杯的可能性,但他承认,年龄会让参加比赛变得困难。在下一届世界杯期间将年满39岁的梅西去年曾表示,2022年卡塔尔世界杯将是他……电子科技大Angew在BiOBr基底生长应力BiMOF实现高电子科技大学向全军等报道通过修饰在BiOBr基底表面的BiMOF能够作为一种可操作的平台。这种修饰在BiOBr表面的BiMOF能够进行具有特定位点控制应力从而调节CO2光催化转……分析师苹果AirPods今年销售额达60亿美元,明年或将更高伯恩斯坦(Bernstein)的托尼萨克纳吉(ToniSacconaghi)表示,苹果AirPods的销售额今年几乎翻了一番,达到60亿美元,明年应该会有新的飞跃。这位分……广达回应退出AppleWatch组装业务赚钱就做,赚钱最重要新浪科技讯11月14日上午消息,据台湾地区《经济日报》报道,市场盛传广达为了获利问题,将退出AppleWatch组装业务。对此,广达董事长林百里强调,赚钱的就做,赚钱最重要,如……张一山,终为自己的放荡付出了代价阅读此文之前,麻烦您点击一下关注,既方便您进行讨论和分享,又能给您带来不一样的参与感,感谢您的支持文章以宁编辑酒馆茶社前言我想把这玩意染成绿的这就是当年……苹果公司开盘报163。22美元,大涨5。52IT之家1月30日消息苹果发布业绩后的第一个交易日,该公司开盘报163。22美元,大涨5。52。苹果今天发布2019财年第一财季(即2018自然年第四季度)业绩,业绩显示……华尔街多家投行下调苹果目标价北京时间3日消息,苹果周三盘后下调本财年第一季度营收预期,是近20年来首次下调营收预期,受此影响,华尔街多家投行纷纷下调对苹果未来12个月股价的预期。至少四家投行将苹果的……
科学家们认为阿拉斯加下有一颗地质定时炸弹科学家们在阿拉斯加一些最偏远的地区,在冻土带下钻了一个深孔。在钻了这个洞后,他们目睹了一些可怕的事情。然而,科学家发现的异常危险在这个时刻被封存在永久冻土中。尽管如此,这并不能……塑料代替混凝土,蘑菇丝瓜也能造房子?建筑业或迎来革命。。混凝土是继水之后地球上使用第二广泛的材料。制造混凝土所产生的二氧化碳占世界二氧化碳排放量的4。5左右。于是,随着绿色环保的理念逐渐深入人心,在建筑工程中广泛推广新型的绿色……什么是硬查询?对借款有影响吗?什么是硬查询?硬查询有什么影响?今天咱们就来看一看什么是硬查询?所谓的硬查询,一般是指征信记录中出现的贷款审批和信用卡审批,简单来说就是大家的申贷和申请信用卡行为。……被遗忘的污染!二战沉船仍在释放有毒污染物,还有更多古老沉船不研究表明,即使在80年后,第二次世界大战时期的沉船,还在释放污染物。一项最新研究显示,研究人员在一艘沉没的德国巡逻艇附近的海底样本中,发现了多种有毒污染物,沉船还在影响着周围的……冉冉升起!新四巨头轰180分65板35助攻,颤抖吧篮网目前,一年一度的NBA季前赛已经进入尾声,这期间,外界都把目光聚焦在豪门雄鹿、篮网和湖人等队,但他们却未打出应有的豪强战绩,特别是湖人队仍然一胜难求。然而,人们却忽视了一支冉冉……齐鲁青未了文化馆旧事李晓流水它带走光阴的故事,也改变了许多人。我在记忆里逆流而上,重返上世纪90年代歌声满大街的县城。县城里那栋灰白色的小楼,是县城文化馆,寄托着我梦想的地方。那年夏季……双十一商品大促物流成消费者关注重点中国质量新闻网讯(闫冬记者王向龙)一年一度的双十一商品大促如约来到。每年这个时候都是消费者的购物狂欢节。多家电商平台以及商家们也是一如既往甚至折扣力度更大、大促的时间更长、折扣……西安高新区领跑2022奋楫四个高新2022年,同样的12个月,同样的365天,却非同寻常。在这个不寻常的年度,西安高新区踔厉奋进,勇毅前行,用一条又一条新政、一项又一项举措、一个又一个突破,推动四个高新建……花钱最多挨揍最狠!本轮欧冠英超四队零胜绩,而意甲三队全胜南都讯记者陶新蕾花最多的钱,挨最狠的揍!北京时间2月23日凌晨,本赛季欧冠18决赛首回合结束,曼城客场1比1战平莱比锡红牛,国际米兰主场1比0绝杀波尔图。谁能想到,在淘汰赛首回……为思考点赞无论是解决当下的困境,还是人生道路上的难题,进行深度思考显然更为有益。如何进行深度思考?关键的第一步在于稳定情绪。我们只能在水面平静的时候才看得清上面的倒影,……扯什么trycatch性能问题?你看着这鬼代码,竟然在for循环里面搞了个trycatch,不知道trycatch有性能损耗吗?老陈煞有其事地指着屏幕里的代码:for(inti0;i5000;i){try{d……我国空间站将配人形机器人,可持枪防卫,相比特斯拉擎天柱如何?我国空间站目前的编制,除了在天上交接班之外,一般都是3人常驻,不过,很快可能就有第4名航天员了。根据网络消息,国防科技大学与浙江大学的研究人员在一篇论文中,提出了一种名为Tai……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网