:aclnn兩段式接口調用昇騰算子完整教程)
oil-gas-ops-prospect C調用實戰(zhàn)aclnn兩段式接口調用昇騰算子完整教程【免費下載鏈接】oil-gas-ops-prospect面向油氣勘探oil gas exploration領域的昇騰自定義算子庫。倉名即 oil-gas-ops油氣算子 prospect勘探目標面向地震成像、全波形反演等勘探計算場景項目地址: https://gitcode.com/cann/oil-gas-ops-prospectoil-gas-ops-prospect是面向油氣勘探領域的昇騰自定義算子庫覆蓋地震成像、全波形反演等計算場景。本文帶你用 C 通過aclnn 兩段式接口調用其中的 AscendC 算子從環(huán)境準備、GetWorkspaceSize到 executor 執(zhí)行再到結果回讀對拍全程走通。什么是 aclnn 兩段式接口自定義算子包安裝到 CANN 后C 側最底層的調用入口就是aclnn 接口。它把調用一個算子拆成兩次階段接口作用① 準備aclnnXXXGetWorkspaceSize根據輸入張量計算所需 workspace 大小并產出aclOpExecutor算子執(zhí)行句柄② 執(zhí)行aclnnXXX用 executor 把算子真正下發(fā)到 NPU配合 stream 完成異步執(zhí)行這種先規(guī)劃、后執(zhí)行的設計讓同一段調用邏輯可以跨設備、跨 SoC 復用也是 CANN 官方算子如 ops-nn的標準范式。本倉庫提供的 C 示例就完全對齊了官方 addmv/matmul 的兩段式寫法腳手架在 aclnn_example.h。C 調用前準備CANN 9.0.0 環(huán)境一步到位硬件與軟件要求Ascend 910BAscend910B1 CANN 9.0.0Toolkit 包 對應 SoC 的 Ops 包。完整前置條件見 QUICKSTART.md。1?? 獲取源碼并編譯安裝算子包git clone https://gitcode.com/cann/oil-gas-ops-prospect.git cd oil-gas-ops-prospect bash build.sh --install # 編譯 OPP .run 包 whl 并安裝到 CANN2?? 配置環(huán)境變量source /usr/local/Ascend/cann-9.0.0/set_env.sh export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/opp/vendors/customize/op_api/lib:${ASCEND_HOME_PATH}/lib64:$LD_LIBRARY_PATH 第二行很關鍵自定義算子包的cust_opapi動態(tài)庫放在opp/vendors/customize/op_api/lib下不加入LD_LIBRARY_PATH會導致鏈接或運行時報找不到符號。兩段式調用怎么寫的GetWorkspaceSize 與 executor以ComplexMul復數(shù)逐點乘為例核心只有兩行調用完整實現(xiàn)見 test_aclnn_complex_mul.cpp// 第一段算 workspace 拿 executor aclnnStatus ret aclnnComplexMulGetWorkspaceSize( ur, ui, vr, vi, wr, wi, workspaceSize, executor); // 第二段分配 workspace 并執(zhí)行 aclnnComplexMul(workspace, workspaceSize, executor, stream); aclrtSynchronizeStream(stream); // 等結果落地圍繞這兩行標準流程是acl 初始化 → 設備內存上構造 aclTensor → 兩段式下發(fā) → 回讀結果對拍 → 釋放資源主循環(huán)統(tǒng)一封裝在 RunAclnnExample 中。兩個容易踩的點workspace 可能為 0。此時無需分配內存MallocWorkspace會直接跳過見 MallocWorkspace但GetWorkspaceSize這一步不能省。aclTensor 的構造要用ND格式 連續(xù) strides示例中的MakeNdTensor/CreateAclTensor可直接參考aclnn_example.h。復數(shù)乘法算子示例一次完整的 C aclnn 調用ComplexMul的數(shù)學定義是復數(shù)逐點乘(ur, ui) × (vr, vi) → (wr, wi)即wr ur*vr ? ui*viwi ur*vi ui*vr——地震數(shù)據處理中復數(shù)頻譜運算的基礎操作。示例 test_aclnn_complex_mul.cpp 的結構非常清晰值得對照閱讀函數(shù)行號職責SetupTensorsL44-L554 路輸入張量上設備、構造輸出張量視圖LaunchOpL57-L71兩段式下發(fā) stream 同步ExpectedL73-L81host 側手算期望值mainL93-L97套用腳手架跑完整流程一個值得注意的細節(jié)輸出wr/wi共用一塊 packed 緩沖先實部后虛部連續(xù)存放kernel 忽略獨立的wi指針——這正好示范了如何用aclTensor 視圖同一 device 地址、不同 tensor表達緊密排布的輸出。接口聲明從哪來安裝算子包后op_api/include下會生成aclnn_*.h官方頭文件。倉庫自帶一份兜底聲明頭 og_aclnn_decls.h用__has_include逐個判定裝了就用生成的沒裝就回落到手寫聲明——所以源碼樹里的示例工程不裝包也能獨立編譯。一鍵編譯運行run.sh 里發(fā)生了什么不需要手寫 CMake 命令每個算子目錄下都有run.shbash examples/aclnn/complex_mul/run.sh腳本 run_example.sh 自動完成加載 CANN 環(huán)境 →cmake配置 →make編譯 → 導出自定義 opapi 庫路徑 → 運行可執(zhí)行文件。編譯配置由 aclnn_example.cmake 統(tǒng)一提供include 路徑指向 Toolkit 的include和opp/vendors/customize/op_api/include鏈接庫為ascendcl、cust_opapi、acl_op_compiler、nnopbase。 如果你要把 aclnn 調用集成進自己的 CMake 工程直接對照這份 cmake 文件抄路徑和鏈接庫即可。支持 aclnn 調用的算子一覽當前有 4 個 AscendC 算子暴露 aclnn 接口聲明均可在 og_aclnn_decls.h 中找到算子aclnn 接口功能dtype / formatComplexMulaclnnComplexMul復數(shù)逐點乘(ur,ui)×(vr,vi)→(wr,wi)float32 / NDComplexMulGradaclnnComplexMulGradComplexMul 的反向輸出 4 路梯度float32 / NDFusedBiasSoftmaxaclnnFusedBiasSoftmaxsoftmax(x bias1 bias2, -1)原地寫回fp32/fp16/bf16 / NDFusedSoftmaxGradaclnnFusedSoftmaxGrad注意力 softmax JVPg go V^T后原地覆寫 probsfp32/fp16/bf16 / ND各算子的 shape / dtype 約束見 算子列表每個算子都有獨立的 C 示例目錄examples/aclnn/complex_mul/、examples/aclnn/complex_mul_grad/、examples/aclnn/fused_bias_softmax/、examples/aclnn/fused_softmax_grad/。常見問題與避坑指南 編譯報鏈接錯誤 / 找不到cust_opapi檢查LD_LIBRARY_PATH是否包含opp/vendors/customize/op_api/lib且 cmake 的link_directories已加該目錄aclnn_example.cmake。GetWorkspaceSize返回非ACL_SUCCESS優(yōu)先排查張量 dtype / format 是否匹配算子約束如ComplexMul要求全部輸入 float32 同 shape以及 op_api 頭文件是否為本次安裝包生成的新版本。結果對拍不過回讀前務必aclrtSynchronizeStream否則 device 端計算尚未完成對拍容差參考示例中的atol1e-5, rtol1e-5HostClose。Python 側調用失敗會靜默回退用 Python API 時 AscendC 失敗默認回退 PyTorch 參考實現(xiàn)驗證算子確實生效請設置OIL_GAS_OPS_REQUIRE_ASCENDC_COMPLEX_MUL1等環(huán)境變量C aclnn 直連則沒有回退報錯即失敗。只想跑部分算子的測試兩段式系統(tǒng)測試位于tests/st/aclnnOpType/可用bash build.sh -u --st批量執(zhí)行。延伸學習算子調用總覽Python C算子調用完整接口簽名與環(huán)境變量接口列表算子數(shù)學定義與約束算子列表pybind 直連 aclnn 的參考實現(xiàn)bindings.cpp環(huán)境部署細節(jié)環(huán)境部署跑通第一個aclnnComplexMul只是起點——照著examples/aclnn/下其余三個算子的樣例你就能把任何自定義算子接入自己的 C 推理/訓練框架了?!久赓M下載鏈接】oil-gas-ops-prospect面向油氣勘探oil gas exploration領域的昇騰自定義算子庫。倉名即 oil-gas-ops油氣算子 prospect勘探目標面向地震成像、全波形反演等勘探計算場景項目地址: https://gitcode.com/cann/oil-gas-ops-prospect創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考