主頁 >  其他 > Ascend C sqrt算子實戰

Ascend C sqrt算子實戰

2023-06-06 16:56:01 其他

摘要:撰寫一個Ascend C的sqrt算子,并通過內核呼叫方式在cpu和npu模式下進行驗證,

本文分享自華為云社區《【2023 · CANN訓練營第一季】——Ascend C sqrt算子實戰》,作者:dayao,

前言

撰寫一個Ascend C的sqrt算子,并通過內核呼叫方式在cpu和npu模式下進行驗證,在訓練營沙箱環境下,cpu模式作業正常結果正確,

一、概述

先簡單回顧下TIK C++算子矢量編程的流程和實作,

矢量算子開發流程如下:

主要作業內容有:

1、算子分析:確定輸入輸出,確定數學運算式以及底層實作介面,確定核函式定義,

2、算子類的實作:實作init()和process(),init()完成記憶體初始化,實質上體現的是多核運行,和單核資料切分以及是否開啟double buffer優化;Process()實作的是CopyIn,Compute、CopyOut三個流水任務,

3、算子驗證:通過核函式的內核呼叫符的方式呼叫算子,計算出結果,并于使用相同輸入用numpy計算結果進行比對,誤差在一定范圍內即可,實際應用中,需要使用原有框架的算子進行計算精度比對,

二、算子分析

算子定義如下:假定仍是8個邏輯核,

查詢TIK C++的API可知,可以使用(TIK C++ API/矢量計算/單目/Sqrt,采用2級介面)完成運算,得到最終結果,

三、代碼分析

直接在訓練營課程提供的add_tik2算子工程上修改,代碼地址:https://gitee.com/zgx950813/samples/tree/master/tik2_demo/kernel_samples/kernel_add_sample

修改代碼目錄結構如下:CMakeLists.txt和data_utils.h未作修改,編譯和執行腳本run.sh只改了計算結果與真值比對部分,

一)、核函式定義

與例程相比,輸入引數只有x,

extern "C" __global__ __aicore__ void sqrt_tik2(__gm__ uint8_t* x, __gm__ uint8_t* z)
{
 KernelSqrt op;
 op.Init(x, z);
 op.Process();
}

二)、算子類

實作方式與add例程類似,init()函式里初始化記憶體:x,y的Global Memory ;流水線任務通訊記憶體;Process()實作流水線任務;按范式撰寫CopyIn、Compute、CopyOut,與add例程最大差異是,在compute函式中,呼叫sqrt的2類介面API實作計算,

class KernelSqrt {
public:
    __aicore__ inline KernelSqrt() {}
    __aicore__ inline void Init(__gm__ uint8_t* x, __gm__ uint8_t* z)
    {
 // get start index for current core, core parallel
 xGm.SetGlobalBuffer((__gm__ half*)x + block_idx * BLOCK_LENGTH, BLOCK_LENGTH);
 zGm.SetGlobalBuffer((__gm__ half*)z + block_idx * BLOCK_LENGTH, BLOCK_LENGTH);
 // pipe alloc memory to queue, the unit is Bytes
 pipe.InitBuffer(inQueueX, BUFFER_NUM, TILE_LENGTH * sizeof(half));
 pipe.InitBuffer(outQueueZ, BUFFER_NUM, TILE_LENGTH * sizeof(half));
    }
    __aicore__ inline void Process()
    {
 // loop count need to be doubled, due to double buffer
 constexpr int32_t loopCount = TILE_NUM * BUFFER_NUM;
 // tiling strategy, pipeline parallel
 for (int32_t i = 0; i < loopCount; i++) {
 CopyIn(i);
 Compute(i);
 CopyOut(i);
        }
    }
private:
    __aicore__ inline void CopyIn(int32_t progress)
    {
 // alloc tensor from queue memory
 LocalTensor<half> xLocal = inQueueX.AllocTensor<half>();
 // copy progress_th tile from global tensor to local tensor
 DataCopy(xLocal, xGm[progress * TILE_LENGTH], TILE_LENGTH);
 // enque input tensors to VECIN queue
 inQueueX.EnQue(xLocal);
    }
    __aicore__ inline void Compute(int32_t progress)
    {
 // deque input tensors from VECIN queue
 LocalTensor<half> xLocal = inQueueX.DeQue<half>();
 LocalTensor<half> zLocal = outQueueZ.AllocTensor<half>();
 // call Sqrt instr for computation
 Sqrt(zLocal, xLocal, TILE_LENGTH);
 // enque the output tensor to VECOUT queue
 outQueueZ.EnQue<half>(zLocal);
 // free input tensors for reuse
 inQueueX.FreeTensor(xLocal);
    }
    __aicore__ inline void CopyOut(int32_t progress)
    {
 // deque output tensor from VECOUT queue
 LocalTensor<half> zLocal = outQueueZ.DeQue<half>();
 // copy progress_th tile from local tensor to global tensor
 DataCopy(zGm[progress * TILE_LENGTH], zLocal, TILE_LENGTH);
 // free output tensor for reuse
 outQueueZ.FreeTensor(zLocal);
    }
private:
 TPipe pipe;
 // create queues for input, in this case depth is equal to buffer num
 TQue<QuePosition::VECIN, BUFFER_NUM> inQueueX;
 // create queue for output, in this case depth is equal to buffer num
 TQue<QuePosition::VECOUT, BUFFER_NUM> outQueueZ;
 GlobalTensor<half> xGm, zGm;
};

三)、核函式呼叫

1、在CPU模式下,通過ICPU_RUN_KF呼叫

ICPU_RUN_KF(sqrt_tik2, blockDim, x, z); // use this macro for cpu debug

2、在NPU模式下,通過<<<>>>呼叫

#ifndef __CCE_KT_TEST__
// call of kernel function
void sqrt_tik2_do(uint32_t blockDim, void* l2ctrl, void* stream, uint8_t* x, uint8_t* z)
{
    sqrt_tik2<<<blockDim, l2ctrl, stream>>>(x, z);
}
#endif

由于<<<>>>,只能在NPU模式下呼叫,所以需要用條件編譯,不在CPU除錯模式下有效,在呼叫sqrt_tik2_do,需要按ascendcl應用編程的要求進行,

3、呼叫代碼

通過“__CCE_KT_TEST__”宏區分CPU和NPU模式,

int32_t main(int32_t argc, char* argv[])
{
 size_t inputByteSize = 8 * 2048 * sizeof(uint16_t);  // uint16_t represent half
 size_t outputByteSize = 8 * 2048 * sizeof(uint16_t);  // uint16_t represent half
    uint32_t blockDim = 8;
#ifdef __CCE_KT_TEST__
    uint8_t* x = (uint8_t*)tik2::GmAlloc(inputByteSize);
    uint8_t* z = (uint8_t*)tik2::GmAlloc(outputByteSize);
 ReadFile("./input/input_x.bin", inputByteSize, x, inputByteSize);
 // PrintData(x, 16, printDataType::HALF);
 ICPU_RUN_KF(sqrt_tik2, blockDim, x, z); // use this macro for cpu debug
 // PrintData(z, 16, printDataType::HALF);
 WriteFile("./output/output_z.bin", z, outputByteSize);
    tik2::GmFree((void *)x);
    tik2::GmFree((void *)z);
#else
 aclInit(nullptr);
 aclrtContext context;
 aclError error;
    int32_t deviceId = 0;
 aclrtCreateContext(&context, deviceId);
 aclrtStream stream = nullptr;
 aclrtCreateStream(&stream);
    uint8_t *xHost, *zHost;
    uint8_t *xDevice, *zDevice;
 aclrtMallocHost((void**)(&xHost), inputByteSize);
 aclrtMallocHost((void**)(&zHost), outputByteSize);
 aclrtMalloc((void**)&xDevice, inputByteSize, ACL_MEM_MALLOC_HUGE_FIRST);
 aclrtMalloc((void**)&zDevice, outputByteSize, ACL_MEM_MALLOC_HUGE_FIRST);
 ReadFile("./input/input_x.bin", inputByteSize, xHost, inputByteSize);
 // PrintData(xHost, 16, printDataType::HALF);
 aclrtMemcpy(xDevice, inputByteSize, xHost, inputByteSize, ACL_MEMCPY_HOST_TO_DEVICE);
 sqrt_tik2_do(blockDim, nullptr, stream, xDevice, zDevice); // call kernel in this function
 aclrtSynchronizeStream(stream);
 aclrtMemcpy(zHost, outputByteSize, zDevice, outputByteSize, ACL_MEMCPY_DEVICE_TO_HOST);
 // PrintData(zHost, 16, printDataType::HALF);
 WriteFile("./output/output_z.bin", zHost, outputByteSize);
 aclrtFree(xDevice);
 aclrtFree(zDevice);
 aclrtFreeHost(xHost);
 aclrtFreeHost(zHost);
 aclrtDestroyStream(stream);
 aclrtResetDevice(deviceId);
 aclFinalize();
#endif
 return 0;
}

四)、基準資料生成——sqrt_tik2.py

使用numpy生成input_x和基準結果golden,

import numpy as np
def gen_golden_data_simple():
 input_x = np.random.uniform(0, 100, [8, 2048]).astype(np.float16)
    golden = np.sqrt(input_x).astype(np.float16)
 input_x.tofile("./input/input_x.bin")
 golden.tofile("./output/golden.bin")
if __name__ == "__main__":
 gen_golden_data_simple()

五)、計算結果比較

使用numpy的allclose()函式比較算子計算與基準資料的結果,實際上由于npu模式編譯出錯,實際未執行改函式進行比較,CPU模式下,算子計算出的結果與基準golden資料完全一致,兩者的md5相同,

四、編譯運行

本次課程提供了沙箱運行環境,想個辦法把代碼搞進去,

一)、配置環境變數

二)、CPU模式

cpu模式順利編譯運行,結果與對比組完全一致,

三)、NPU模式

npu模式下編譯報錯,因為沙箱時間有限,以后有機會再研究,

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/554453.html

標籤:其他

上一篇:讀改變未來的九大演算法筆記05_數字簽名

下一篇:返回列表

標籤雲
其他(160456) Python(38206) JavaScript(25478) Java(18205) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7234) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4585) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1983) 功能(1967) HtmlCss(1952) Web開發(1951) C++(1932) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1879) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Ascend C sqrt算子實戰

    摘要:撰寫一個Ascend C的sqrt算子,并通過內核呼叫方式在cpu和npu模式下進行驗證。 本文分享自華為云社區《【2023 · CANN訓練營第一季】——Ascend C sqrt算子實戰》,作者:dayao。 前言 撰寫一個Ascend C的sqrt算子,并通過內核呼叫方式在cpu和npu ......

    uj5u.com 2023-06-06 16:56:01 more
  • 讀改變未來的九大演算法筆記05_數字簽名

    ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230605131142717-54719348.png) # 1. 數字簽名”(Digital Signature) ## 1.1. 單詞數字化(digital)意味著其“由 ......

    uj5u.com 2023-06-06 16:34:02 more
  • 前端八股文everybody準備好了沒

    前端八股文可以幫助everybody更好地準備前端的一些面試,了解面試官可能會問到的問題,并且提前準備好答案。當然這不是唯一的也不是肯定的,還是需要大家自身好好理解所學的知識。 ......

    uj5u.com 2023-06-06 16:27:29 more
  • 昇騰實戰丨DVPP媒體資料處理圖片解碼問題案例

    摘要:本期就分享幾個關于DVPP圖片解碼問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《DVPP媒體資料處理圖片解碼問題案例》,作者:昇騰CANN 。 DVPP(Digital Vision Pre-Processing)是昇騰AI處理器內置的影像處理單元,通過AscendCL媒體 ......

    uj5u.com 2023-06-06 16:26:55 more
  • 電腦縮放例外、顯示亮度無法調整的處理辦法

    本文介紹Windows電腦**系統更新**或**重裝系統**后,出現螢屏亮度**最高且無法調整**、電腦**字體變小**等問題的解決方法。 最近更新了**Windows 10 20H2**版本,更新完畢打開電腦后發現,電腦中各類**字體變小**了,仿佛就是從一個普通的筆記本電腦變成了大螢屏電腦。 先 ......

    uj5u.com 2023-06-06 16:25:46 more
  • AI電詐—10分鐘被騙430萬

    ## 前言 最近比較熱門的AI電信詐騙應該是“福州市某科技公司法人代表郭先生10分鐘內被騙430萬元”,詐騙程序如下: 4月20日中午,郭先生的好友突然通過微信視頻聯系他,自己的朋友在外地競標,需要430萬保證金,且需要公對公賬戶過賬,想要借郭先生公司的賬戶走賬。基于對好友的信任,加上已經視頻聊天核 ......

    uj5u.com 2023-06-06 16:25:14 more
  • 2.1 變數與資料型別

    在Python中,變數是用來存盤資料的容器。資料型別是用來規定這些資料的型別,例如整數、浮點數和字串等。接下來我們將詳細了解Python中的變數和一些常見的資料型別。 #### 2.1.1 變數的命名和賦值 變數命名規則: 1. 變數名必須以字母(大寫或小寫)或下劃線(_)開頭,后面可以跟字母、數 ......

    uj5u.com 2023-06-06 16:14:06 more
  • 第三屆陜西省大學生網路安全技能部分WP

    #web ##easyrce 題目代碼如下: ``` 24、m->12、h->7、s->18、e->4、c->2 按照順序位移,數字字符跳過 最后獲得flag: flag(6fc0ea1e6f897033ee0c1fa40915d659} ......

    uj5u.com 2023-06-06 15:55:44 more
  • 頂象無感驗證碼助力京客隆提升數字化運營能力

    電商、社區團購等新興零售業態的沖擊下,線下零售門店面臨著客流量減少、與年輕消費人群需求脫節的增長瓶頸,傳統零售商加速數字化轉型。數字化改變了經濟與社會活動的載體、渠道、技術和效率,讓零售服務活動更加靈活、敏捷、智慧,讓資訊更豐富更多維,設計出更貼近需求的產品和服務。 在數字化轉型和發展中,傳統零售企 ......

    uj5u.com 2023-06-06 15:44:29 more
  • 10.5. 版本控制(如Git)

    版本控制系統(Version Control System,VCS)是軟體開發程序中用于管理源代碼的工具。它可以幫助你跟蹤代碼的變更歷史,方便回滾到之前的版本,以及協同多人共同開發。Git是當前最流行的版本控制系統之一,我們將以Git為例,介紹版本控制的基本概念和操作。 #### 10.5.1. G ......

    uj5u.com 2023-06-06 15:31:30 more