隋軼丞,石昌青,孫羽菲,2*,張玉志,2,陳禹喬,張宇哲
1.南開大學(xué),軟件學(xué)院,天津 300350
2.先進計算與關(guān)鍵軟件海河實驗室,天津 300350
深度學(xué)習(xí)模型以較強的建模性能逐漸被廣泛應(yīng)用于各類典型人工智能應(yīng)用場景中。近年來,隨著深度學(xué)習(xí)的發(fā)展,模型的網(wǎng)絡(luò)結(jié)構(gòu)大幅增加,復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)增加了深度學(xué)習(xí)模型的擬合效果,同時使得模型的訓(xùn)練成本與日俱增。目前通過CPU 提供的算力性價比較低且總體算力不足,因此目前通常利用異構(gòu)并行設(shè)備滿足深度學(xué)習(xí)模型的算力需求。目前主流深度學(xué)習(xí)框架,如TensorFlow[1]、PyTorch[2]、MXNet[3]等,均實現(xiàn)了對CUDA(Compute Unified Device Architecture)[4]和ROCm(Radeon Open Compute platform)[5]編程模型的支持,利用NVIDIA 和AMD 廠商提供的強大GPU并行計算能力實現(xiàn)了對深度學(xué)習(xí)模型的加速。
然而國外廠商提供的GPU 價格昂貴,在近年來的貿(mào)易禁運的背景之下,國內(nèi)一些科研機構(gòu)等被列入美國商務(wù)部的實體名單之中,主要基于國外廠商GPU 設(shè)備進行加速的深度學(xué)習(xí)領(lǐng)域發(fā)展受到嚴(yán)重限制。基于如上原因,使用其他可控的異構(gòu)計算設(shè)備加速深度學(xué)習(xí)計算具有重要意義。
目前主流深度學(xué)習(xí)框架還未實現(xiàn)可適配國產(chǎn)加速設(shè)備的編程模型的支持[6]。OpenCL(Open Computing Language)[7]作為開放、統(tǒng)一的編程標(biāo)準(zhǔn),被廣泛應(yīng)用于各類異構(gòu)加速設(shè)備中,如CPU、GPU、FPGA、DSP 等?;贠penCL,可以實現(xiàn)主流深度學(xué)習(xí)框架對不同廠商的多類型異構(gòu)設(shè)備的支持?;谏鲜霰尘埃琓ensorFlow 作為使用最為廣泛的深度學(xué)習(xí)框架之一,實現(xiàn)其OpenCL 版本具有極強的應(yīng)用價值。
其中,Element-Wise 算子作為TensorFlow 框架的重要組成部分,在TensorFlow 框架中使用廣泛,實現(xiàn)了較多的計算功能。然而不同于TensorFlow 框架中常見的算子實現(xiàn)方式,Element-Wise 算子(包括一元算子和二元算子)通常通過調(diào)用Eigen 庫提供的接口完成算子計算功能的實現(xiàn)。其封裝和實現(xiàn)方式與TensorFlow 框架中常見的實現(xiàn)方式存在較大差別,在代碼封裝和結(jié)構(gòu)上相對復(fù)雜,因此在保證可擴展性和代碼規(guī)范性的前提下實現(xiàn)OpenCL 版本的Element-Wise 算子具有一定的實現(xiàn)難度。
本文針對TensorFlow 框架中主要基于Eigen 庫實現(xiàn)的Element-Wise 相關(guān)算子進行了分析,采用與TensorFlow 源碼中Element-Wise 算子一致的模板類的形式進行了OpenCL 版本的實現(xiàn),并進行了實驗驗證。實驗分別從計算正確性和計算性能兩方面驗證了本文轉(zhuǎn)換方法的可行性。
TensorFlow 是一個端到端的機器學(xué)習(xí)框架,被廣泛應(yīng)用于各類機器學(xué)習(xí)算法和深度神經(jīng)網(wǎng)絡(luò)的實現(xiàn)中。TensorFlow 運行時包含200 多個標(biāo)準(zhǔn)算子,包括數(shù)學(xué)計算、數(shù)組操作、控制流和狀態(tài)管理等[8],其中許多算子是使用Eigen::Tensor[9]實現(xiàn)的,它使用C++模板為多核CPU 和GPU 生成高效的并行代碼。除此之外,其經(jīng)常使用像cuDNN[10]這樣的高性能并行計算庫來實現(xiàn)特定算子,以更高效地實現(xiàn)某些特定類型運算。
TensorFlow 框架的架構(gòu)如圖1所示,從用戶視角來看,其可以分為前端與后端:在前端部分,TensorFlow 框架提供基于Python 或C++ 語言的客戶端,便于用戶使用TensorFlow 中各類網(wǎng)絡(luò)結(jié)構(gòu)實現(xiàn)構(gòu)建復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型;在后端部分,TensorFLow 將計算功能拆分為不同的算子,并分別基于CPU、GPU 和SYCL 編程標(biāo)準(zhǔn)等提供算子注冊接口,并利用不同的核函數(shù)對不同編程模型版本的最底層提供代碼實現(xiàn)。
圖1 TensorFlow 架構(gòu)圖[8]Fig.1 TensorFlow architecture diagram[8]
TensorFlow 框架基于不同編程模型實現(xiàn)了對于一些異構(gòu)設(shè)備的支持,其中主要支持的編程模型為CUDA、ROCm 和SYCL 編程標(biāo)準(zhǔn)。其中SYCL編程模型是一種免費的抽象編程模型,SYCL 使用與CUDA 相似的單源編程模型使得設(shè)備端代碼和主機端代碼可以一起編譯[11]。SYCL 雖然允許基于OpenCL 實現(xiàn)多種設(shè)備類型的支持,但需要底層OpenCL 實現(xiàn)提供相應(yīng)的擴展支持,因此無法基于SYCL 廣泛支持異構(gòu)設(shè)備。除此之外,TensorFlow Lite 中也提供了對于OpenCL 編程標(biāo)準(zhǔn)的支持,但TensorFlow Lite 應(yīng)用場景為移動端、嵌入式和物聯(lián)網(wǎng)設(shè)備等,其作為一個輕量級框架僅能支持模型推理,無法利用不同廠商的加速設(shè)備基于OpenCL 標(biāo)準(zhǔn)實現(xiàn)大型深度學(xué)習(xí)模型的訓(xùn)練。TensorFlow Lite在設(shè)計和功能上都與TensorFlow 框架存在較大差異,無法在TensorFlow 框架中直接提供對于OpenCL 編程標(biāo)準(zhǔn)的支持,與本文討論的應(yīng)用場景和目的都具有較大區(qū)別。
綜上所述,需要實現(xiàn)TensorFlow 框架的OpenCL 版本以實現(xiàn)對不同異構(gòu)設(shè)備的支持,實現(xiàn)利用不同異構(gòu)并行設(shè)備加速深度學(xué)習(xí)模型的計算。
Eigen 是一個高層次的C ++庫,有效支持線性代數(shù)、矩陣和矢量運算、數(shù)值分析及其相關(guān)的算法。Eigen 庫對于TensorFlow 框架而言,其一方面作為數(shù)據(jù)類型抽象,為TensorFlow 的Tensor 數(shù)據(jù)類型提供了內(nèi)存管理和底層映射;另一方面,Eigen 庫中提供了對于CPU、CUDA、ROCm 和SYCL 編程標(biāo)準(zhǔn)的支持以及豐富的各類計算方法的實現(xiàn)接口,使得TensorFlow 使用原生的Tensor 數(shù)據(jù)類型通過簡單數(shù)據(jù)類型轉(zhuǎn)換即可調(diào)用Eigen 庫中的運算接口,極大地降低了各類運算的實現(xiàn)成本。
在TensorFlow 的Element-Wise 算子的注冊過程中,通常使用functor 命名空間下的各類結(jié)構(gòu)體作為模板參數(shù)傳入UnaryOp 或BinaryOp 中。如圖2所示,TenosrFlow 中使用模板類實現(xiàn)基于Eigen 接口調(diào)用的UnaryOp 和BinaryOp 兩類算子。其中Functor 作為模板參數(shù),定義了具體運算的實現(xiàn)方法。
圖2 TensorFlow 中基于Eigen 庫的算子實現(xiàn)方式Fig.2 Implementation of operators based on Eigen library in TensorFlow
由于TensorFlow 框架中的Element-Wise 算子通?;贓igen 庫提供的函數(shù)實現(xiàn),與TensorFlow框架中通?;贑UDA 核函數(shù)的實現(xiàn)方式存在較大差別。并且,由于OpenCL 的運行時編譯特性,其設(shè)備端代碼通常需要以字符串的形式進行表示,因此需要對設(shè)備端代碼設(shè)計封裝方法以增加代碼的規(guī)范性、減少代碼量,因此實現(xiàn)TensorFlow 框架中的Element-Wise 算子具有如下挑戰(zhàn)。
(1)運行時編譯特性
OpenCL 由一門用于編寫kernels(在OpenCL設(shè)備上運行的函數(shù))的語言(基于C99)和一組用于定義并控制平臺的API 組成[12],其應(yīng)用程序分為主機端代碼和設(shè)備端代碼。在OpenCL1.2 版本中主機端代碼使用通用編程語言(例如C 或C++)編寫,并由傳統(tǒng)編譯器編譯,在主機CPU 上執(zhí)行;設(shè)備端代碼使用C99 標(biāo)準(zhǔn)編寫,存放在單獨的cl 文件中或編寫成字符串,在主機端代碼執(zhí)行時動態(tài)加載編譯成為二進制程序,然后與數(shù)據(jù)一起發(fā)送到GPU 等加速設(shè)備上執(zhí)行,執(zhí)行結(jié)束后由主機端取回執(zhí)行結(jié)果。因此,OpenCL 版本的算子實現(xiàn)過程中需要分別完成主機端代碼和設(shè)備端代碼,以實現(xiàn)內(nèi)存拷貝、核函數(shù)編譯和調(diào)用等過程。
除此之外OpenCL 版本的算子實現(xiàn)過程還包括算子類的實現(xiàn)。在實現(xiàn)過程中,需要參照CPU 版本和GPU 版本的算子類實現(xiàn)代碼,完成OpenCL 版本算子類實現(xiàn)。并且由于數(shù)據(jù)類型的差異,需要將計算的數(shù)據(jù)處理為OpenCL 支持的cl_mem 的設(shè)備端內(nèi)存類型,顯式的數(shù)據(jù)類型處理進一步增加了OpenCL算子實現(xiàn)代碼的復(fù)雜性。
(2)復(fù)雜的代碼封裝
在基于Eigen 庫接口所實現(xiàn)的Element-Wise 相關(guān)算子中,由于結(jié)合了Eigen 庫中的相關(guān)接口,因此與常見的由“__global__”限定符標(biāo)志的CUDA 核函數(shù)代碼不同,其通過Eigen 庫提供的接口直接實現(xiàn)封裝計算功能。并且由于Eigen 庫是一種C++模板庫,不同于TensorFlow 框架中常見的繼承OpKernel 類的實現(xiàn)方式,Element-Wise 算子中采用模板類的形式進行算子的實現(xiàn)與注冊。
雖然通過將Functor 作為模板參數(shù)傳入的方式減少了代碼量,增加了代碼編寫的便捷性,但對于OpenCL 版本算子的實現(xiàn)則增加了工作量。在代碼實現(xiàn)過程中,需要將上述模板參數(shù)中具體實現(xiàn)代碼進行拆解,參照其各類計算功能的實現(xiàn)邏輯,采用OpenCL 核函數(shù)的方式進行對應(yīng)實現(xiàn)。并且由于Element-Wise 算子種類較多,需要采用類似模板參數(shù)的方式完成對應(yīng)代碼的編寫,以增加代碼的可讀性,便于后續(xù)版本的更新與擴展。
本節(jié)將介紹基于OpenCL 編程標(biāo)準(zhǔn)實現(xiàn)TensorFlow 中Element-Wise 算子的方法。通過本文提出的實現(xiàn)方法,更多的支持OpenCL 標(biāo)準(zhǔn)的異構(gòu)計算設(shè)備能夠支持TensorFlow 框架,加速深度學(xué)習(xí)模型的計算。本文方法對于PyTorch 和MXNet 等主流深度學(xué)習(xí)框架中Element-Wise 相關(guān)算子的OpenCL版本實現(xiàn)也具有參考意義。
Element-Wise 算子利用模板參數(shù)實現(xiàn)了不同計算功能,為了保證算子實現(xiàn)的規(guī)范性并減少代碼量、確??蓴U展性,我們分析了源碼中的實現(xiàn)方式,并基于OpenCL 實現(xiàn)了具體運算功能的核函數(shù)字符串。除此之外,基于OpenCL 運行時編譯的特性,我們在實現(xiàn)了代碼封裝的同時,對于多次調(diào)用的設(shè)備端代碼也采用函數(shù)封裝的方式實現(xiàn)設(shè)備端代碼字符串的生成,進一步簡化了代碼的復(fù)雜度。本節(jié)將分別從源碼中Functor 結(jié)構(gòu)體實現(xiàn)、OpenCL 版本的Functor 結(jié)構(gòu)體實現(xiàn)和運算符實現(xiàn)方式展示OpenCL版本Element-Wise 算子的實現(xiàn)方式。
(1)Functor 結(jié)構(gòu)體的繼承與實例化
如圖2所示,Element-Wise 相關(guān)算子通過模板參數(shù)Functor 實例化UnaryOp 類中的UnaryFunctor結(jié)構(gòu)體實現(xiàn)對應(yīng)算子類,通過Functor 結(jié)構(gòu)體中包含的設(shè)備端代碼實現(xiàn)對應(yīng)的運算符功能。
上述結(jié)構(gòu)體和類的關(guān)系如圖3所示,其中UnaryOp 類中的模板參數(shù)Functor 在命名空間functor下定義,其通過繼承base 類型模板結(jié)構(gòu)體的方式,使用func 對應(yīng)具體運算的實現(xiàn)。base 類型作為模板結(jié)構(gòu)體,通過使用命名空間Eigen::internal 下的Eigen 庫中的運算符或在TensorFlow 源碼中繼承實現(xiàn)的原生運算符,使得Functor 模板參數(shù)對應(yīng)的類可以獲取對應(yīng)算子的具體實現(xiàn)代碼。
圖3 Element-Wise 算子實現(xiàn)示意圖Fig.3 Schematic diagram of Element-Wise operator implementation
(2)Functor 結(jié)構(gòu)體的OpenCL 實現(xiàn)
參照如圖3所示源碼中Element-Wise 算子實現(xiàn)方式,本文通過提取與CUDA 代碼無關(guān)的封裝功能,并對OpenCL 實現(xiàn)中涉及的核函數(shù)運算部分進行封裝,通過相似的繼承方式實現(xiàn)模板類的實例化。
通過Functor 模板參數(shù),我們利用命名空間functor 下的結(jié)構(gòu)體實例化對應(yīng)的OpenCL 版本的UnaryOp 或BinaryOp 類,進而實現(xiàn)OpenCL 版本的Element-Wise 算子。具體來說,如圖4所示,我們在分析OpenCL 執(zhí)行特點后,重寫了base 結(jié)構(gòu)體,利用函數(shù)get_kernel_src 在不同的子類中實現(xiàn)對應(yīng)的OpenCL Kernel 字符串生成功能,其依據(jù)傳入的輸入數(shù)據(jù)類型和輸出數(shù)據(jù)類型,生成完成對應(yīng)功能、使用不同數(shù)據(jù)類型的OpenCL 字符串。
圖4 Element-Wise 算子OpenCL 實現(xiàn)示意圖Fig.4 Schematic diagram of Element-Wise operator implementation based on OpenCL
(3)OpenCL 運算符實現(xiàn)方式
除此之外,由于CUDA、ROCm 和SYCL 編程標(biāo)準(zhǔn)均為單源編程模型,在使用Eigen::internal 命名空間下的相關(guān)算子實現(xiàn)的結(jié)構(gòu)體時,其重載的“()”運算符中通常采用調(diào)用其他算子的結(jié)構(gòu)體中的函數(shù)輔助完成對應(yīng)運算。以調(diào)用相對簡單的“zeta”運算為例,在實現(xiàn)過程中,調(diào)用了abs、machep 等函數(shù)。對此,我們將對應(yīng)的多次出現(xiàn)在多個核函數(shù)中的常用功能函數(shù)封裝為一個單獨函數(shù),以生成對應(yīng)功能的OpenCL 設(shè)備端代碼字符串。
上述封裝方式在保證功能實現(xiàn)的同時,增強了代碼的規(guī)范性,抽象出共同的相似功能,減少了代碼量。同時,基于模板結(jié)構(gòu)體實現(xiàn)的方式也保證了算子實現(xiàn)的可擴展性,即對于未來TensorFlow 新版本中出現(xiàn)的新算子,也可以采用類似的方式進行實現(xiàn)并擴展填充。
本節(jié)以sigmoid 算子為例,展示了Element-Wise 算子的OpenCL 版本實現(xiàn)方法。源碼中的實現(xiàn)如圖5所示,其通過采用scalar_logistic_op 結(jié)構(gòu)體實現(xiàn)了具體的sigmoid 算子的計算功能。
圖5 Eigen 相關(guān)運算符實現(xiàn)Fig.5 Implementation of operators related to Eigen
如圖6所示,我們基于OpenCL 編程標(biāo)準(zhǔn),通過字符串的方式實現(xiàn)了sigmoid 運算的OpenCL Kernel,并按照前文介紹的封裝方法,將其作為結(jié)構(gòu)體中的成員函數(shù)進行封裝,實現(xiàn)利用傳入的不同數(shù)據(jù)類型,生成對應(yīng)的Kernel 函數(shù)字符串。從而在OpenCL 的設(shè)備端代碼中實現(xiàn)類似C++中模板參數(shù)的功能。
圖6 OpenCL 實現(xiàn)示例Fig.6 Implementation example based on OpenCL
在算子執(zhí)行過程中,TensorFlow 可以通過模板參數(shù)Functor 獲得對應(yīng)的結(jié)構(gòu)體scalar_logistic_op,并利用其中的靜態(tài)函數(shù)get_kernel_src 獲取OpenCL設(shè)備端代碼字符串,基于OpenCL 提供的主機端API將字符串編譯成OpenCL 程序并獲取OpenCL 核函數(shù)以執(zhí)行計算,最終實現(xiàn)sigmoid 算子的計算功能。
由于NVIDIA GPU 設(shè)備同時支持CUDA 編程模型和OpenCL 編程標(biāo)準(zhǔn),可以提供基于相同設(shè)備的不同編程模型,便于測試本文提出方法的計算效率與準(zhǔn)確性。因此本文基于NVIDIA GPU 設(shè)備完成實驗。
本文使用的實驗環(huán)境具體如表1所示,本文使用CUDA 的OpenCL 實現(xiàn)進行實驗驗證,并與TensorFlow 框架中基于CUDA 實現(xiàn)的Element-Wise算子進行對比。
表1 實驗環(huán)境配置Table 1 Experimental environment settings
本文基于上述方法共實現(xiàn)了81 個Element-Wise算子,其中包括BinaryOp 類型算子35 個,UnaryOp類型算子46 個,本節(jié)對所有已實現(xiàn)算子進行了正確性分析,分別在不同的誤差精度和數(shù)據(jù)類型下進行了實驗,涵蓋了對應(yīng)算子常用的基本數(shù)據(jù)類型。本文以CUDA 版本TensorFlow 中raw_ops[13]標(biāo)準(zhǔn)接口的Element-Wise 算子計算結(jié)果為基準(zhǔn),對比本文實現(xiàn)的OpenCL 版本算子計算結(jié)果,使用unittest[14]進行對比測試。
對于整數(shù)類型,根據(jù)兩者的計算結(jié)果是否完全一致判斷是否通過;對于浮點類型,由于不同的編譯器和硬件對精度的支持情況不同,可能會導(dǎo)致兩者的計算結(jié)果存在精度差異,對此本文設(shè)定了三種相對誤差范圍,在誤差范圍內(nèi)判斷是否通過。正確性實驗將81 個算子分別在不同類型和不同誤差精度下進行測試,測試通過率計算公式如下所示,實驗結(jié)果如表2、表3所示,通過率公式為:
表2 整型數(shù)據(jù)準(zhǔn)確性測試Table 2 Accuracy test of integer data
表3 浮點型數(shù)據(jù)準(zhǔn)確性測試Table 3 Accuracy test of floating point data
實驗結(jié)果證明,本文提出的方法是正確可靠的,所有已實現(xiàn)算子均能夠通過測試或在指定誤差范圍內(nèi)通過測試,能夠達到標(biāo)準(zhǔn)的誤差精度,確保深度學(xué)習(xí)模型計算過程中的正確性。
在算子的性能分析中,本文選取了較為典型的8個算子,包括UnaryOp 和BinaryOp 兩類情形,具體算子名稱及其功能如表4所示。
表4 算子介紹Table 4 Operator introduction
分別對如上8 個算子進行了性能測試,根據(jù)算子的注冊情況,測試數(shù)據(jù)類型選用了深度學(xué)習(xí)框架中常用的float32 數(shù)據(jù)類型,測試數(shù)據(jù)量從2 的10 次方至2 的18 次方逐漸遞增,覆蓋了深度學(xué)習(xí)模型中常見的數(shù)據(jù)量。本文通過對比基于OpenCL 實現(xiàn)的算子和TensorFlow 中基于CUDA 實現(xiàn)的算子在不同數(shù)據(jù)量下的計算用時,分析算子的計算性能差異,上述8 個算子在不同數(shù)據(jù)量下的計算用時如圖7所示。
圖7 計算性能對比Fig.7 Comparison of computational performance
從實驗結(jié)果可以看出,隨著測試數(shù)據(jù)量的遞增,TensorFlow 中基于CUDA 和Eigen 庫實現(xiàn)的Element-Wise 算子表現(xiàn)較為穩(wěn)定,本文基于OpenCL實現(xiàn)的Element-Wise 算子耗時在數(shù)據(jù)量規(guī)模較小時用時無明顯增長,在數(shù)據(jù)量規(guī)模較大時計算用時線性增長。
本文提出的方法首次實現(xiàn)了TensorFlow 框架中Element-Wise 算子的OpenCL 版本,為TensorFlow框架的OpenCL 版本實現(xiàn)提供了堅實基礎(chǔ),確保了Element-Wise 的運算在更多異構(gòu)計算設(shè)備上的應(yīng)用。實驗結(jié)果驗證了基于OpenCL 實現(xiàn)的Element-Wise算子的計算正確性。
從計算性能上來看,這些算子的時間復(fù)雜度雖然都為O(n),但本文實現(xiàn)的OpenCL 版本算子與CUDA 相比仍有一定的性能差距。其中OpenCL 版本的算子在不同量級的實驗數(shù)據(jù)下耗時高于CUDA版本的算子,在數(shù)據(jù)量較小時與CUDA 性能相當(dāng),當(dāng)數(shù)據(jù)量過大時與CUDA 相比性能差距較大。
OpenCL 作為一種開放、通用的編程標(biāo)準(zhǔn),在通用性和代碼移植性上具有較強的優(yōu)勢,而各廠商提供的OpenCL 實現(xiàn)中由于考慮通用性標(biāo)準(zhǔn),無法實現(xiàn)針對各自設(shè)備體系結(jié)構(gòu)特點的優(yōu)化。CUDA 由NVIDIA 設(shè)計,根據(jù)NVIDIA 設(shè)備體系結(jié)構(gòu)特點實現(xiàn)了深入的優(yōu)化。CUDA 在線程數(shù)更大時針對硬件計算單元分配和調(diào)度提供了較好的優(yōu)化,因此CUDA在處理更大數(shù)據(jù)量時計算用時沒有明顯增加。為了使得OpenCL 實現(xiàn)與CUDA 具有相當(dāng)?shù)男阅?,仍有很多技術(shù)難點需要進一步研究和攻克。未來我們將繼續(xù)探索和優(yōu)化深度學(xué)習(xí)框架中OpenCL 版本算子的實現(xiàn)方案,優(yōu)化OpenCL 算子的核函數(shù)編寫與調(diào)用過程,提高基于OpenCL 標(biāo)準(zhǔn)的設(shè)備端代碼計算效率。
本文針對TensorFlow 框架中Element-Wise 算子中的OpenCL 版本實現(xiàn)方式進行了討論,分析了Eigen 庫支持的三類設(shè)備CPU、GPU 和SYCL 的編程方式,討論了基于OpenCL 實現(xiàn)TensorFlow 對多種異構(gòu)設(shè)備支持的必要性。分析了TensorFlow 中Element-Wise 相關(guān)算子通過Eigen 庫實現(xiàn)的方式,并介紹了基于相似封裝方式的OpenCL 版本的算子和運算符實現(xiàn)和封裝方法。作為實現(xiàn)OpenCL 版本的TensorFlow 框架這一工作的重要組成部分,本文成功實現(xiàn)了TensorFlow 框架中Element-Wise 算子的OpenCL 版本。
本文的實驗部分測試了TensorFlow 中Element-Wise 相關(guān)算子的OpenCL 版本與CUDA 版本的計算結(jié)果和計算用時,并比較計算正確性和計算用時。實驗證明,我們通過OpenCL 標(biāo)準(zhǔn)實現(xiàn)的相關(guān)算子準(zhǔn)確性合格。在常用的數(shù)據(jù)范圍下,OpenCL 版本與CUDA 版本的實現(xiàn)性能相當(dāng),在數(shù)據(jù)量較大時,OpenCL 版本與CUDA 版本在性能上存在一定差距。
在后續(xù)的工作中,我們將針對具體硬件設(shè)備探索優(yōu)化方法,提升OpenCL 版本Element-Wise 算子的性能,并將本文方法擴展至PyTorch、MXNet 等其他主流深度學(xué)習(xí)框架的Element-Wise 算子的實現(xiàn)中。
利益沖突聲明
所有作者聲明不存在利益沖突關(guān)系。