解析)
PyPTO 逐元素向下取整運算 pypto.Tensor.floor 使用指南與實現(xiàn)解析【免費下載鏈接】pyptoPyPTO發(fā)音: pai p-t-oParallel Tensor/Tile Operation編程范式。項目地址: https://gitcode.com/cann/pyptopypto.Tensor.floor是 CANN PyPTO 框架中針對 Tensor 的逐元素向下取整floor運算接口對輸入 Tensor 的每個元素執(zhí)行向負無窮方向舍入浮點元素向下取整整數(shù)元素原樣返回。本文基于官方 API 文檔并結(jié)合倉庫源碼完整介紹該接口的函數(shù)原型、參數(shù)與約束、調(diào)用示例以及從 Python 前端到解釋器后端的實現(xiàn)鏈路與測試驗證幫助開發(fā)者在 PyPTO 向量編程中正確使用取整類運算。功能概述floor是典型的逐元素element-wise一元向量運算遍歷輸入 Tensor 的每一個元素計算其向下取整值并寫入輸出 Tensor 的對應(yīng)位置。對浮點型數(shù)值如1.2、9.8執(zhí)行向下舍入處理結(jié)果沿數(shù)軸負方向取最近的整數(shù)對整數(shù)型數(shù)值直接返回其本身不做任何處理。其數(shù)學(xué)語義為out[i] ?input[i]?。它與同類取整運算的差異如下運算語義示例輸入 -1.2 / 1.8floor向負無窮方向取整-2.0 / 1.0ceil向正無窮方向取整-1.0 / 2.0trunc向零方向截斷-1.0 / 1.0round四舍五入-1.0 / 2.0在倉庫的 Tensor 類中floor、ceil、trunc三個成員方法集中定義于 python/pypto/tensor.py語義相互對照便于開發(fā)者按需選用。產(chǎn)品支持情況該接口在以下硬件平臺上均受支持依據(jù) API 文檔中的產(chǎn)品支持聲明Ascend 950PR / Ascend 950DT支持Atlas A3 訓(xùn)練系列產(chǎn)品 / Atlas A3 推理系列產(chǎn)品支持Atlas A2 訓(xùn)練系列產(chǎn)品 / Atlas A2 推理系列產(chǎn)品支持函數(shù)原型floor同時提供 Tensor 成員方法與頂層函數(shù)兩種調(diào)用形式二者等價# Tensor 成員方法形式 floor(self) - Tensor # 頂層函數(shù)形式 floor(input: Tensor) - Tensor頂層函數(shù)定義位于 python/pypto/op/math.py被op_wrapper裝飾并最終調(diào)用底層實現(xiàn)pypto_impl.Floor(input)成員方法則是在 python/pypto/tensor.py 中通過return pypto.floor(self)直接轉(zhuǎn)調(diào)頂層函數(shù)。兩種寫法使用哪個均可例如x.floor()與pypto.floor(x)完全等價。參數(shù)說明參數(shù)名輸入/輸出說明input輸入源操作數(shù)。支持的類型為 Tensor。Tensor 支持的數(shù)據(jù)類型為DT_FP32、DT_FP16、DT_BF16、DT_INT32、DT_INT16。不支持空 TensorShape 僅支持 14 維Shape Size 不大于 2147483647即INT32_MAX。返回值說明返回 Tensor 類型。其 Shape、數(shù)據(jù)類型與輸入 Tensor 一致每個元素為輸入 Tensor 對應(yīng)元素的向下取整值。約束說明Tensor 類型輸入不支持TileOpFormat.TILEOP_NZ格式即輸入需以ND按維連續(xù)等非 NZ 格式布局。倉庫測試用例中所有 floor 用例均明確標注format: ND見 floor_test_case.py與這一約束一致。輸入不支持空 Tensor且 Shape 維數(shù)需控制在 14 維以內(nèi)總元素數(shù)不超過INT32_MAX。調(diào)用示例設(shè)置 TileShape調(diào)用該 operation 接口前應(yīng)通過set_vec_tile_shapes設(shè)置向量計算的 TileShape其維度應(yīng)與輸出一致。例如輸入 shape 為[m, n]、輸出為[m, n]則 TileShape 設(shè)置為[m1, n1]其中m1、n1分別用于切分m、n軸pypto.set_vec_tile_shapes(4, 16)從源碼看set_vec_tile_shapes 會把各維 TileShape 寫入 scopepypto_impl.SetScope({vec_tile_shapes: concrete_shapes})并支持傳入SymbolicScalar動態(tài)取值為向量計算指定逐維切分粒度。實際開發(fā)中TileShape 各維應(yīng)能整除或按切片方式覆蓋對應(yīng)的數(shù)據(jù)維度以充分發(fā)揮向量單元的分塊計算能力。接口調(diào)用示例x pypto.tensor([5], pypto.DT_FP32) y pypto.floor(x)結(jié)果示例如下輸入數(shù)據(jù)x: [1.2, 4.3, 9.8, 16.5, 25.4] 輸出數(shù)據(jù)y: [1.0, 4.0, 9.0, 16.0, 25.0]完整內(nèi)核編寫示例結(jié)合pypto.frontend.jit、pypto.loop、pypto.view與pypto.assemble可將 floor 組織為完整的向量內(nèi)核。倉庫系統(tǒng)測試 test_floor.py 給出了標準寫法pypto.frontend.jit(debug_options{runtime_debug_mode: 0, compile_debug_mode: 0}) def floor_2d_1input_kernel(input0: pypto.Tensor(), output: pypto.Tensor(), config: FloorConfig): pypto.set_vec_tile_shapes(*config.tile_shape) for index_0 in pypto.loop(config.loop_ranges[0]): for index_1 in pypto.loop(config.loop_ranges[1]): offsets [index_0 * config.execution_view_shape[0], index_1 * config.execution_view_shape[1]] input0_offset [0 if config.input_shapes[0][axis] 1 else offsets[axis] for axis in range(2)] input0_view pypto.view(input0, config.input_view_shapes[0], input0_offset) result pypto.floor(input0_view) output_offset [ 0 if config.output_offset_map[axis] 0 else offsets[config.output_offset_map[axis]] for axis in range(len(config.execution_view_shape)) ] pypto.assemble(result, output_offset, output)該模式體現(xiàn)了 PyPTO 向量編程的典型四步設(shè)置 TileShape → 雙層循環(huán)遍歷分塊 → 用view取輸入子塊 → 對子塊執(zhí)行floor并用assemble寫回輸出。底層實現(xiàn)鏈路從源碼結(jié)構(gòu)可以梳理出floor的完整調(diào)用鏈幫助理解其執(zhí)行機制Python 前端pypto.floor(input)op/math.py經(jīng)由op_wrapper包裝后調(diào)用pypto_impl.Floor(input)類型樁聲明于 pypto_impl/init.pyiIR 生成pypto_impl.Floor由 C 綁定層將調(diào)用轉(zhuǎn)換為算子 IR 節(jié)點對應(yīng)OP_FLOOR指令解釋器執(zhí)行IR 送入向量解釋器后由 calc_vector.cpp 中的ExecuteOpFloor處理該函數(shù)斷言輸入輸出各為 1 個CTX_OUTPUT_COUNT_MISMATCH/CTX_INPUT_COUNT_MISMATCH校驗并通過REGISTER_CALC_OP(OP_FLOOR, Opcode::OP_FLOOR, ExecuteOpFloor)完成指令注冊數(shù)值計算ExecuteOpFloor內(nèi)部調(diào)用 calc.h 中的calc::Floor(out, self)最終交由CalcOps對每個元素執(zhí)行向下取整計算??梢?floor 屬于解釋器內(nèi)置的標準一元運算與Ceil、Trunc、Rsqrt等共享同一套CalcOps計算設(shè)施見 calc.h。測試驗證倉庫為 floor 提供了完整的系統(tǒng)測試覆蓋測試入口python/tests/st/operation/vector/test_floor.py內(nèi)核以(2, 1)2 維、1 輸入為鍵注冊每個用例將輸入拷貝到 NPU 設(shè)備執(zhí)行內(nèi)核并以torch.floor在 CPU 側(cè)計算期望結(jié)果最后通過assert_outputs比對 NPU 輸出與 PyTorch 期望值完成數(shù)值一致性校驗用例數(shù)據(jù)python/tests/st/operation/vector/vector_testcase/floor_test_case.py目前包含兩個用例分別覆蓋fp16與fp32兩種數(shù)據(jù)類型輸入 shape 均為(16, 32)、format 為ND、數(shù)據(jù)取值范圍[0, 1)TileShape 與 view_shape 均取(16, 32)即單塊處理整張輸入測試標記測試通過pytest.mark.parametrize逐用例驅(qū)動并開啟pass_options{enable_slice: True}以啟用切片相關(guān) pass 優(yōu)化見 test_floor.py。使用建議與注意事項數(shù)據(jù)類型選擇DT_FP32、DT_FP16、DT_BF16、DT_INT32、DT_INT16均可作為輸入整數(shù)類型輸入 floor 后值不變?nèi)舸_定輸入恒為整數(shù)可直接跳過取整運算以減少一次向量計算。負數(shù)的 floor 語義floor 是向負無窮取整負浮點數(shù)如-1.2結(jié)果為-2.0與截斷trunc不同。若業(yè)務(wù)需要向零取整應(yīng)改用trunc。布局約束輸入不支持TILEOP_NZ格式編寫內(nèi)核或構(gòu)造輸入時請保持ND布局。Shape 限制空 Tensor 不可用Shape 限制在 14 維且元素總數(shù)不超過INT32_MAX。TileShape 設(shè)置在jit內(nèi)核中調(diào)用 floor 前必須先通過pypto.set_vec_tile_shapes設(shè)置 TileShape且其維度要與輸入/輸出維度一致否則切分配置可能無法正確生效?!久赓M下載鏈接】pyptoPyPTO發(fā)音: pai p-t-oParallel Tensor/Tile Operation編程范式。項目地址: https://gitcode.com/cann/pypto創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考