CANN/pto-isa库开发者规则与限制
This file lists some rules and limitations on the implementation of this library for pto-isa developers.【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa这篇文档列出一些针对pto-isa库开发者在auto模式下的编程规则和限制。不遵守这些规则可能导致以下任何后果无法编译包括源码层面编译报错或者编译器挂掉结果错误例如精度问题差劲的性能1 - 记住pto::(Conv)Tile::data()在auto模式下返回的是vector类型而不是指针Tilestruct的.data()成员函数返回类型为TileDType其在manual和auto模式下定义是不同的manual模式下就是指针类型然而在auto模式下是clang的vector类型。 请务必将此牢记于心避免在调用tile function以外的地方直接调用.data()来尝试获得Tile的地址指针。2 - 避免在struct/class的成员上使用default-initializer在C中直接在struct/class成员上默认初始化是很常见的struct ConvTile { public: ... int shape[ConvTileDetail::MAX_CONVTILE_DIM] {1}; };然而这样会对AUTO编译器产生问题编译器内的SROA pass无法消除此成员对应的AllocaInst指令以及其对应的load和store指令会对后续的内存分配产生不利影响。请尽量避免默认初始化struct/class成员至少auto模式下不要:#ifdef __PTO_AUTO__ // In auto mode, do not have default initialization in the class definition itself for its members int shape[ConvTileDetail::MAX_CONVTILE_DIM]; #else int shape[ConvTileDetail::MAX_CONVTILE_DIM] {1}; #endif虽然是用C但是我们还是鼓励鼓励尽量使用PODplain old data来靠近C语言。3 - 在tile function以及被其调用的函数内依然需要开发者手动同步TL;DR:在tile function内包括被其调用的函数内调用set_flagwait_flag或者pipe_barrier在其他地方尽量调用PtoSetWaitFlag或者TSYNC原因PTO编译器的分析以及优化都是建立在tile这一抽象层级上的而tile function是这一抽象层级的最后一层一旦进入tile function就脱离了tile的层级范围进入了CCE的领域。因此tile function内部对于PTO编译器来说就是一个黑盒子完全不关心里面是什么。因此如果在tile function内部需要同步依然需要库开发者手动插入同步因为进入这一层已经超出了PTO编译器的使用范围。所以在tile function内部不能使用PtoSetWaitFlag或者TSYNC因为它们在auto模式下都是no-op。4 - 避免使用TASSIGN来实现PTO指令目前有一些PTO指令的内部实现直接调用了TASSIGN_IMPL。这在auto模式下是行不通的。如果开发者的意图是想alias两个tile那应该使用TRESHAPE或者TSUBVIEW来实现其余任何用途在auto模式下都不能达到正确的结果。比如如果开发者直接调用TASSIGN来分配tile的地址而这个分配的地址是基于一些算法或者代码逻辑实现的那auto编译器肯定无法感知到具体的算法逻辑而实现和manual模式下相同的内存分配结果。毕竟auto模式下的自动内存分配是完全基于每个tile的liveness analysis的没有其他任何context信息。这就是为什么目前TPUSH和TPOP的实现在auto模式下不可能正确运行。5 - 一些*_IMPL层函数的规则Some consistency must be ensured for*_IMPLand tile function interface:*_IMPL层接口需要遵守如下规则函数签名必须有PTO_INTERNAL接口其内部实现必须直接调用tile function如果需要调用其他非tile function的函数则必须被inline。确保对每个Tile调用.data()的同时调用tile function或者确保.data()返回的值是reference。示例TExp(dstTile.data(), srcTile.data()); // correct auto dst dstTile.data(); // wrong: return by value auto src srcTile.data(); // correct: return by reference TExp(dst, src);The function signature must havePTO_INTERNALmacroIts implementation should directly call tile functions inside, dont call any non-tile functions unless theyre inlined.Always call.data()function to pass into tile functions6 - tile function层接口的规则确保函数参数中使用typename ...::TileDType而不是typename ...::DType *来表示tile类型确保这些typename ...::TileDType参数是pass-by-value, 而不是pass-by-reference或者pass-by-pointer的确保所有typename ...::TileDType参数都有__in__或者__out__标记在实现中确保对每个typename ...::TileDType参数都调用__cce_get_tile_ptr来获取其buffer指针除非是unused的参数返回类型必须为void不然会违反编译器对于TF接口的假设而且是未定义行为。如果开发者想让tile function有返回值请使用pass-by-reference的入参即使对一个scalar输出也是如此。7 - 在TF层以上尽量避免动态控制流动态控制流对自动同步一直是一个巨大的挑战。我们鼓励开发者要么在tile function层以上避免使用动态控制流如果不是必须或者将控制流移到tile function内。tile function层以前有动态控制流的典型接口包括TROWEXPANDDIV_IMPL和TMULS_IMPL。【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考