• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    MATLAB 到高性能C 的代碼轉(zhuǎn)換系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)*

    2022-07-13 01:04:38霖,徐
    關(guān)鍵詞:規(guī)則

    余 澤 霖,徐 云

    (1.中國(guó)科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,安徽 合肥230026;2.安徽省高性能計(jì)算重點(diǎn)實(shí)驗(yàn)室,安徽 合肥230026)

    0 引言

    MATLAB 由于其強(qiáng)大的功能、友好的開發(fā)界面和簡(jiǎn)單易用的編程語(yǔ)言形式而被開發(fā)人員廣泛使用,許多企業(yè)和科研單位都存在著大量的MATLAB遺留代碼(Legacy Code)。但由于MATLAB 程序運(yùn)行依賴于MATLAB 軟件系統(tǒng),部分工作平臺(tái)無(wú)法滿足要求,并且它的運(yùn)行速度相較于C 等更底層的語(yǔ)言慢,無(wú)法滿足高性能計(jì)算的需求,通常需要將這些遺留MATLAB 代碼轉(zhuǎn)換為C 代碼。而人工轉(zhuǎn)換代碼需要付出高昂的人力成本,因此,理想的解決方案是將MATLAB 代碼自動(dòng)轉(zhuǎn)換成C 代碼。

    程序轉(zhuǎn)換可以節(jié)省軟件開發(fā)的成本,并在軟件的移植、重用、更新和編譯等方面有著重要的應(yīng)用[1],因此在國(guó)內(nèi)外有大量的對(duì)編程語(yǔ)言轉(zhuǎn)換的研究。本文對(duì)已有的編程語(yǔ)言轉(zhuǎn)換方法進(jìn)行了借鑒和改進(jìn),提出了一個(gè)MATLAB 到C 的自動(dòng)轉(zhuǎn)換方法,著重解決了以下三個(gè)關(guān)鍵問(wèn)題:一是引入了一種基于抽象語(yǔ)法樹(Abstract Syntax Tree,AST)的中間表示(Intermediate Representation,IR)來(lái)解決兩語(yǔ)言間的差異問(wèn)題,為MATLAB 和C 轉(zhuǎn)換過(guò)程中提供統(tǒng)一的接口,避免為兩種語(yǔ)言的語(yǔ)法結(jié)構(gòu)映射制定繁瑣的規(guī)則。二是由于C 中變量需要聲明后使用,而MATLAB 不需要,因此在轉(zhuǎn)換時(shí)需要對(duì)MATLAB 中的矩陣變量的類型信息(矩陣的大小和矩陣元素的類型)進(jìn)行識(shí)別。已有許多對(duì)此類高級(jí)語(yǔ)言的變量類型信息識(shí)別的研究成果[2-6],本文借鑒并實(shí)現(xiàn)了MATLAB 到C 的轉(zhuǎn)換過(guò)程中的類型信息推導(dǎo)。三是MATLAB 中大部分表達(dá)式是矢量間的運(yùn)算,直接轉(zhuǎn)換到C 語(yǔ)句會(huì)導(dǎo)致性能下降,并且很多內(nèi)置的科學(xué)計(jì)算函數(shù)沒(méi)有直接對(duì)應(yīng)的C 代碼。本文設(shè)計(jì)了轉(zhuǎn)換算法,使用C 數(shù)學(xué)核心庫(kù)(Math Kernel Library,MKL)中的函數(shù)為MATLAB 中的矢量運(yùn)算和庫(kù)函數(shù)生成高性能C 代碼段,解決轉(zhuǎn)換困難和性能問(wèn)題。本文實(shí)現(xiàn)的系統(tǒng)能幫助開發(fā)人員將MATLAB 代碼自動(dòng)轉(zhuǎn)換生成C代碼,提升代碼性能,減少人工成本。

    1 相關(guān)研究

    1.1 編程語(yǔ)言轉(zhuǎn)換研究現(xiàn)狀

    目前,編程語(yǔ)言轉(zhuǎn)換方法大致可以分為兩類。

    一類是將原語(yǔ)言的語(yǔ)法結(jié)構(gòu)一一轉(zhuǎn)換到目標(biāo)語(yǔ)言的語(yǔ)法結(jié)構(gòu)。李友仁[1]等人提出了一種語(yǔ)義解釋的轉(zhuǎn)換方法,為Prolog 的不同組成部分制定相應(yīng)的轉(zhuǎn)換模板,并應(yīng)用該方法開發(fā)了Prolog 到C 的自動(dòng)轉(zhuǎn)換系統(tǒng);Boyle[7]等人通過(guò)將Lisp 中的多種語(yǔ)言特性逐步轉(zhuǎn)換為對(duì)應(yīng)的Fortran 語(yǔ)句實(shí)現(xiàn)Lisp 到Fortran的轉(zhuǎn)換;Moynihan[8]等人通過(guò)定義固定的轉(zhuǎn)換規(guī)則把Pascal-SC 中的語(yǔ)句轉(zhuǎn)換到對(duì)應(yīng)的Ada 語(yǔ)句,輔助將Pascal-SC 代碼轉(zhuǎn)換到Ada 代碼;Demaine[9]提出了將C 中的指針等價(jià)地轉(zhuǎn)換成Java 中的引用的方法,并基于此實(shí)現(xiàn)C 到Java 代碼的自動(dòng)轉(zhuǎn)換。這類方法需要為原語(yǔ)言的每種語(yǔ)言結(jié)構(gòu)制定相應(yīng)的轉(zhuǎn)換方案,對(duì)語(yǔ)言依賴性高,當(dāng)出現(xiàn)新的需要轉(zhuǎn)換的結(jié)構(gòu)時(shí)往往需要對(duì)原方案重新設(shè)計(jì),缺乏通用性。

    另一類是通過(guò)引入一層IR 來(lái)橋接語(yǔ)言差異。De Rose[10]和Reis[11]等人通過(guò)基于SSA(Static Single Assignment)的IR,分別實(shí)現(xiàn)了MATLAB 到Fortran 90 和C 代碼的轉(zhuǎn)換和優(yōu)化;石學(xué)林[12]等人引入了兩層IR來(lái)實(shí)現(xiàn)Cobol 到Java 代碼的自動(dòng)轉(zhuǎn)換器;Zhao[13]、Paulsen[14]等人分別通過(guò)基于AST 的IR 實(shí)現(xiàn)了PHP和MATLAB 到C++的自動(dòng)轉(zhuǎn)換。這類方法使用IR作為原語(yǔ)言和目標(biāo)語(yǔ)言之間的接口,存儲(chǔ)語(yǔ)言中的數(shù)據(jù)結(jié)構(gòu)和語(yǔ)法結(jié)構(gòu)信息,從而避免依賴特定語(yǔ)言,當(dāng)某一語(yǔ)言的轉(zhuǎn)換需求發(fā)生變更時(shí)只需要改動(dòng)其與中間層的轉(zhuǎn)換關(guān)系即可,避免對(duì)整個(gè)轉(zhuǎn)換框架做較大改動(dòng)。而且在IR 中可以存儲(chǔ)代碼信息,方便后續(xù)的分析和優(yōu)化。但是多引入一層IR 會(huì)帶來(lái)額外工作量,需要選擇合適的IR 以及生成方法。

    在MATLAB 代碼轉(zhuǎn)換中針對(duì)如何將高性能運(yùn)算轉(zhuǎn)換到C 代碼的問(wèn)題也有相應(yīng)的研究。Banerjee[15]等人的方法是使用目標(biāo)語(yǔ)言開發(fā)相應(yīng)的接口,該方法工作量較大,難以應(yīng)對(duì)需求變化,且轉(zhuǎn)換后代碼難以保證高性能;Paulsen[14]使用Armadillo 庫(kù)中的函數(shù)來(lái)替換相對(duì)應(yīng)的MATLAB 函數(shù),能有效避免轉(zhuǎn)換困難,但是存在轉(zhuǎn)換后代碼性能問(wèn)題,同時(shí),對(duì)非函數(shù)形式的表達(dá)式的轉(zhuǎn)換也有所欠缺。對(duì)此,需要設(shè)計(jì)相應(yīng)的算法解決。

    另外,商用的工具如MATLAB Coder[16]還沒(méi)有公開的實(shí)現(xiàn)方法。

    1.2 矩陣變量類型識(shí)別研究現(xiàn)狀

    目前已有許多針對(duì)高級(jí)語(yǔ)言的矩陣型變量的類型識(shí)別研究。Schwartz[2]通過(guò)對(duì)高級(jí)語(yǔ)言SETL 做數(shù)據(jù)流分析,獲取程序上下文中向量的長(zhǎng)度信息并生成相應(yīng)的優(yōu)化代碼;Chatterjee[3]在VCODE 編譯器中實(shí)現(xiàn)了對(duì)向量的長(zhǎng)度推斷;Joisha[4]、Chevalier-Boisvert[5]和Bispo[6]等分別在MATLAB 的優(yōu)化或轉(zhuǎn)換工作中對(duì)矩陣變量的類型信息進(jìn)行了推斷。這些方法的推斷過(guò)程基本上是通過(guò)代碼中入口函數(shù)的參數(shù)對(duì)代碼語(yǔ)句進(jìn)行數(shù)據(jù)流分析,逐條推導(dǎo)表達(dá)式結(jié)果變量的類型信息。推導(dǎo)方法可以應(yīng)用于本文的研究中。

    2 方法設(shè)計(jì)與實(shí)現(xiàn)

    2.1 基于AST 的中間表示設(shè)計(jì)

    本文的研究中引入了一層中間表示(Intermediate Representation,IR)來(lái)避免對(duì)語(yǔ)言特征的依賴,該IR以AST 為基礎(chǔ)構(gòu)建。AST 是源代碼語(yǔ)法結(jié)構(gòu)的一種抽象表示,以樹狀的方式呈現(xiàn),其中每個(gè)節(jié)點(diǎn)表示源代碼中的一個(gè)結(jié)構(gòu),一個(gè)AST 的示例如圖1 所示。AST 被廣泛應(yīng)用于代碼編譯等領(lǐng)域。

    圖1 表達(dá)式y(tǒng)=1+2*x 的AST

    在構(gòu)建C 代碼時(shí),需要對(duì)變量先聲明后使用,所以需要知道相應(yīng)MATLAB 變量的類型信息,本文將這些信息存儲(chǔ)到AST 中代表矩陣變量的節(jié)點(diǎn)中,從而構(gòu)成以AST 為基礎(chǔ)的IR。從源代碼生成AST需要對(duì)代碼進(jìn)行語(yǔ)法分析,大部分研究中都是手動(dòng)實(shí)現(xiàn)這一過(guò)程,是一項(xiàng)繁瑣的工作。本文使用ANTLR(ANother Tool for Language Recognition)來(lái)實(shí)現(xiàn)。ANTLR是一款強(qiáng)大的語(yǔ)法分析器生成工具,可用于讀取、處理、執(zhí)行和翻譯結(jié)構(gòu)化的文本或二進(jìn)制文件,被廣泛應(yīng)用于學(xué)術(shù)領(lǐng)域和工業(yè)生產(chǎn)實(shí)踐,是眾多語(yǔ)言、工具和框架的基石[17]。使用ANTLR 生成MATLAB的語(yǔ)法分析器后,就能進(jìn)一步生成AST。

    與編譯器技術(shù)中IR 會(huì)深入到底層表示不同,本文的IR 層只是概念模型,MATLAB 代碼轉(zhuǎn)換到IR 后會(huì)直接轉(zhuǎn)換到C 代碼,不涉及更底層的語(yǔ)言,減少了轉(zhuǎn)換的層次。

    2.2 功能模塊劃分與工作流程

    由于引入了IR 層,需要分別將MATLAB 代碼轉(zhuǎn)換到IR 以及將IR 轉(zhuǎn)換到C 代碼,將這兩個(gè)階段的工作劃分為前端轉(zhuǎn)換模塊和后端轉(zhuǎn)換模塊,通過(guò)中間層模塊連接起來(lái)。

    在前端轉(zhuǎn)換模塊中,需要從MATLAB 代碼生成AST,并識(shí)別代碼中矩陣變量類型信息。上述工作分別劃分給AST 生成模塊、矩陣大小推導(dǎo)模塊和矩陣元素類型推導(dǎo)模塊。

    后端轉(zhuǎn)換模塊中,需要對(duì)IR 中的AST 進(jìn)行遍歷,轉(zhuǎn)換為相應(yīng)的C 代碼。該過(guò)程中的矢量運(yùn)算和函數(shù)調(diào)用需要使用MKL 庫(kù)中相同功能的C 函數(shù)進(jìn)行替換生成相應(yīng)代碼段。上述工作分別劃分給解析模塊和替換模塊。

    各模塊及其子模塊的關(guān)系如圖2 所示。

    圖2 系統(tǒng)功能模塊劃分

    圖3 系統(tǒng)處理流程

    系統(tǒng)將MATLAB 代碼轉(zhuǎn)換為C 代碼的工作流程如圖3 所示。首先輸入待轉(zhuǎn)換的MATLAB 代碼文件,進(jìn)入到前端轉(zhuǎn)換階段,該階段第一步是將MATLAB代碼經(jīng)過(guò)詞法和語(yǔ)法解析后生成AST,然后添加MATLAB 代碼的輸入?yún)?shù)矩陣信息,通過(guò)AST 結(jié)合輸入信息推導(dǎo)出其他矩陣變量的大小和元素類型信息,加入到AST 中得到IR。然后進(jìn)入到后端轉(zhuǎn)換階段,對(duì)IR 進(jìn)行解析,將每個(gè)AST 節(jié)點(diǎn)轉(zhuǎn)換為相應(yīng)的C 代碼結(jié)構(gòu),并輸出為相應(yīng)的C 代碼。同時(shí),對(duì)代表矢量運(yùn)算和函數(shù)調(diào)用的節(jié)點(diǎn),將其交由替換模塊處理,輸出相應(yīng)的MKL 庫(kù)函數(shù)。最終得到高性能的C 代碼文件。

    2.3 功能模塊實(shí)現(xiàn)

    2.3.1 前端轉(zhuǎn)換模塊實(shí)現(xiàn)

    下面說(shuō)明前端轉(zhuǎn)換模塊中三個(gè)子模塊的設(shè)計(jì)與實(shí)現(xiàn)。

    (1)AST 生成模塊實(shí)現(xiàn)。本文使用ANTLR 來(lái)實(shí)現(xiàn)MATLAB 的詞法和語(yǔ)法分析器。使用ANTLR 時(shí)需要提供待處理語(yǔ)言的語(yǔ)法文件,通過(guò)閱讀MATLAB文檔,編寫出MATLAB 的語(yǔ)法文件,圖4 是該語(yǔ)法文件的部分示例。

    圖4 MATLAB 語(yǔ)法文件部分示例

    (2)矩陣大小推導(dǎo)模塊實(shí)現(xiàn)。矩陣大小的推導(dǎo)方法是根據(jù)矩陣運(yùn)算以及MATLAB 函數(shù)的規(guī)則來(lái)制定的。首先是矩陣運(yùn)算,當(dāng)知道參與運(yùn)算的矩陣大小以及運(yùn)算符,就可以推導(dǎo)出結(jié)果矩陣的大小,比如兩矩陣A 和B 相乘,結(jié)果矩陣的行數(shù)為A 的行數(shù),列數(shù)為B 的列數(shù)。這些矩陣運(yùn)算的規(guī)則有限,可以實(shí)現(xiàn)到代碼流程中。

    對(duì)于函數(shù)調(diào)用,新產(chǎn)生的矩陣的大小與參數(shù)矩陣的大小和函數(shù)有關(guān),可以通過(guò)這樣一個(gè)三元組來(lái)定義:<函數(shù)名,參數(shù)矩陣大小,輸出矩陣大?。荆春瘮?shù)名和參數(shù)矩陣大小可以確定輸出矩陣的大小。為便于管理和擴(kuò)展,將這些規(guī)則按照三元組形式寫入到文件中構(gòu)成規(guī)則文件,推導(dǎo)模塊在遇到函數(shù)調(diào)用時(shí)通過(guò)規(guī)則文件查詢相應(yīng)的規(guī)則。當(dāng)待處理的MATLAB 代碼中出現(xiàn)新的函數(shù)調(diào)用時(shí),在規(guī)則文件中加入新的規(guī)則即可。

    有了上述推導(dǎo)方法,在給出MATLAB 代碼輸入?yún)?shù)矩陣的大小之后,對(duì)2.1 節(jié)中生成的AST 進(jìn)行遍歷,對(duì)其中遇到的計(jì)算節(jié)點(diǎn)和函數(shù)調(diào)用節(jié)點(diǎn)推導(dǎo)結(jié)果矩陣的大小,遍歷完成后就能得到所有矩陣變量的大小并存儲(chǔ)到相應(yīng)的矩陣變量節(jié)點(diǎn)中。

    MATLAB 代碼入口輸入?yún)?shù)矩陣的大小信息通過(guò)一個(gè)三元組來(lái)定義:<矩陣名,行數(shù),列數(shù)>,將所有輸入?yún)?shù)矩陣的大小按照三元組形式寫入到文件中,提供給推導(dǎo)模塊使用。

    (3)矩陣元素類型推導(dǎo)模塊實(shí)現(xiàn)。在MATLAB中,矩陣的元素可以有多種數(shù)據(jù)類型,具體如表1所示。

    表1 MATLAB 數(shù)據(jù)類型

    MATLAB 規(guī)定了矩陣運(yùn)算時(shí),結(jié)果矩陣的元素?cái)?shù)據(jù)類型與運(yùn)算數(shù)的元素?cái)?shù)據(jù)類型的關(guān)系,規(guī)則如下:①如果運(yùn)算數(shù)中含有整數(shù)矩陣,其他運(yùn)算數(shù)也必須是同一類型的整數(shù)矩陣,或者是雙精度的浮點(diǎn)數(shù)標(biāo)量,而結(jié)果仍然是原整數(shù)型;②浮點(diǎn)數(shù)運(yùn)算時(shí),如果運(yùn)算數(shù)中有單精度矩陣,那么結(jié)果矩陣也是單精度的。這兩個(gè)有限的規(guī)則實(shí)現(xiàn)到代碼流程中。對(duì)于函數(shù)調(diào)用的輸出矩陣元素類型規(guī)則,同前文一樣,定義為一個(gè)三元組:<函數(shù)名,參數(shù)矩陣元素類型,輸出矩陣元素類型>,通過(guò)文件的方式提供給推導(dǎo)模塊。

    矩陣元素類型推導(dǎo)過(guò)程與前文中矩陣大小推導(dǎo)過(guò)程相似,也是對(duì)AST 進(jìn)行遍歷,同時(shí)進(jìn)行推導(dǎo)。該過(guò)程需要輸入?yún)?shù)矩陣的元素類型信息,通過(guò)一個(gè)二元組來(lái)定義:<矩陣名,元素類型>。將所有輸入?yún)?shù)矩陣的元素類型按照二元組形式寫入到文件中,提供給推導(dǎo)模塊使用。

    2.3.2 后端轉(zhuǎn)換模塊實(shí)現(xiàn)

    下面說(shuō)明后端轉(zhuǎn)換模塊中兩個(gè)子模塊的設(shè)計(jì)與實(shí)現(xiàn)。

    (1)解析模塊實(shí)現(xiàn)。解析模塊的工作是對(duì)IR 中的AST 進(jìn)行遍歷并生成相應(yīng)的C 代碼。MATLAB 語(yǔ)句生成對(duì)應(yīng)的C 語(yǔ)句時(shí),由于變量需要聲明,因此先定義MATLAB 變量類型在C 中的映射規(guī)則。

    MATLAB 中的矩陣使用C 中的數(shù)組進(jìn)行模擬。一個(gè)大小為m×n 的矩陣在C 中定義為一個(gè)長(zhǎng)度為m×n 的數(shù)組。一行一列的矩陣是特例,在C 中當(dāng)做一個(gè)標(biāo)量來(lái)定義。在本文使用的硬件平臺(tái)是32 位的情況下,MATLAB 的數(shù)據(jù)類型對(duì)應(yīng)的C 的數(shù)據(jù)類型總結(jié)于表2 中。

    表2 MATLAB 數(shù)據(jù)類型對(duì)應(yīng)的C 數(shù)據(jù)類型

    當(dāng)解析過(guò)程中發(fā)現(xiàn)新的變量時(shí),它的大小和數(shù)據(jù)類型已經(jīng)在前端轉(zhuǎn)換過(guò)程中被推導(dǎo)出來(lái)并存儲(chǔ)在IR 中的AST 節(jié)點(diǎn)中,將其聲明補(bǔ)充上即可。

    在遍歷AST 的時(shí)候,當(dāng)前AST 節(jié)點(diǎn)決定應(yīng)該進(jìn)行的相應(yīng)操作。MATLAB 整體代碼生成的AST 的根節(jié)點(diǎn)應(yīng)該是語(yǔ)句塊,解析從該語(yǔ)句塊開始。解析過(guò)程的算法如下:

    算法1:AST 解析算法

    輸入:IR 中AST 根節(jié)點(diǎn)Root;

    輸出:C 代碼。

    其中,ASSIGNMENT 代表賦值語(yǔ)句類型,VEC_OP和FUNC_CALL 代表MATLAB 的矢量運(yùn)算和庫(kù)函數(shù)調(diào)用,IF 代表if 語(yǔ)句類型,LOOP 代表循環(huán)語(yǔ)句類型(for/while 循環(huán))。

    (2)替換模塊實(shí)現(xiàn)。替換模塊的工作是將MATLAB中的矢量運(yùn)算和庫(kù)函數(shù)調(diào)用替換為MKL 庫(kù)函數(shù)形成的C 代碼段。首先是庫(kù)函數(shù)調(diào)用,可以在MKL 庫(kù)中尋找相應(yīng)功能的函數(shù)來(lái)進(jìn)行替換,這部分的替換較為簡(jiǎn)單,替換規(guī)則與下文矢量運(yùn)算的替換規(guī)則一起考慮。

    對(duì)于矢量運(yùn)算,首先考慮表達(dá)式不存在嵌套(即一個(gè)表達(dá)式只對(duì)應(yīng)一個(gè)MKL 函數(shù))的情況。替換的難點(diǎn)主要在于三方面:①確定矢量運(yùn)算所對(duì)應(yīng)的MKL 函數(shù);②同一個(gè)矢量運(yùn)算表達(dá)式由于矩陣類型不同會(huì)對(duì)應(yīng)不同的MKL 函數(shù)(一對(duì)多);③找到MKL函數(shù)后變量如何填入。

    本文設(shè)計(jì)了一個(gè)匹配算法解決上述問(wèn)題。首先定義MATLAB 語(yǔ)句替換為MKL 函數(shù)的替換規(guī)則,該規(guī)則通過(guò)一個(gè)三元組來(lái)定義:<MATLAB 語(yǔ)句模板,參數(shù)類型,MKL 庫(kù)函數(shù)模板>,并通過(guò)文件來(lái)管理和擴(kuò)展。對(duì)上述問(wèn)題解決方法為:①M(fèi)ATLAB語(yǔ)句模板和參數(shù)類型共同匹配一個(gè)對(duì)應(yīng)的MKL 庫(kù)函數(shù),相應(yīng)的匹配算法解決了函數(shù)的確定問(wèn)題;②參數(shù)類型也參與了函數(shù)的確定,為不同的參數(shù)類型添加新的替換規(guī)則,來(lái)解決一對(duì)多的問(wèn)題;③規(guī)則中使用的是模板語(yǔ)句,參數(shù)使用占位符,當(dāng)輸出具體的C 語(yǔ)句時(shí)才根據(jù)實(shí)際代碼中的變量名來(lái)替換。

    匹配算法根據(jù)實(shí)際語(yǔ)句的AST(下稱“SAST”)與MATLAB 語(yǔ)句模板的AST(下稱“TAST”)進(jìn) 行。替換模塊初始時(shí)會(huì)讀取替換規(guī)則文件并將MATLAB 語(yǔ)句模板轉(zhuǎn)換為TAST。判斷AST 是否相同即是判斷樹結(jié)構(gòu)是否相同,當(dāng)前的節(jié)點(diǎn)類型相同并且子樹也相同時(shí)說(shuō)明AST 相同,可以通過(guò)對(duì)AST 做遍歷完成。在該過(guò)程中,變量獲取以及類型信息判斷較為簡(jiǎn)單,在算法說(shuō)明中略去。

    如果考慮表達(dá)式存在嵌套,則需要在AST 匹配失敗時(shí)對(duì)嵌套的表達(dá)式先輸出對(duì)應(yīng)MKL 函數(shù),然后相應(yīng)修改AST,之后繼續(xù)匹配,直到輸出最終結(jié)果。匹配算法如下:

    算法2:匹配算法

    輸入:SAST 和替換規(guī)則文件;

    輸出:MKL 庫(kù)函數(shù)調(diào)用語(yǔ)句。

    該算法是遞歸的,這是由于表達(dá)式的嵌套(如加法和乘法混合等)。嵌套部分將被提取出來(lái)輸出對(duì)應(yīng)的MKL 庫(kù)函數(shù)調(diào)用語(yǔ)句,然后修改AST,再重新進(jìn)行匹配,直到完成匹配過(guò)程,算法在第4 行結(jié)束。嵌套的情況舉例如圖5 所示,表達(dá)式y(tǒng)=a+b-c中(a、b、c 均為長(zhǎng)為n 的向量),a+b 的結(jié)果先存放到臨時(shí)變量t 中并輸出相應(yīng)的MKL 函數(shù)語(yǔ)句,然后AST 中用新節(jié)點(diǎn)t 替換子樹,重新匹配y=t-c 得到最終結(jié)果。

    圖5 嵌套運(yùn)算匹配示例

    3 實(shí)驗(yàn)結(jié)果與分析

    3.1 實(shí)驗(yàn)配置

    本文測(cè)試轉(zhuǎn)換系統(tǒng)對(duì)MATLAB 代碼轉(zhuǎn)換生成C代碼的正確性以及性能。由于MATLAB 在科學(xué)計(jì)算和數(shù)據(jù)挖掘等方面有著廣泛應(yīng)用,本文選取迭代法解線性方程組和K-means 聚類算法的MATLAB 程序來(lái)測(cè)試系統(tǒng)。測(cè)試1(迭代法求方程組解)分別測(cè)試解100、200、400 階線性方程組的時(shí)間,測(cè)試2(K-means 聚類算法)分別測(cè)試將100、200、400 個(gè)四維點(diǎn)劃分為4 個(gè)聚類的時(shí)間。C 程序的數(shù)據(jù)精度均為double。

    生成的C 程序運(yùn)行的硬件環(huán)境為:Intel Core i7-8550U,1.80 GHz,4 核8 處理器CPU;8.0 GB 內(nèi)存。

    3.2 與人工編寫代碼對(duì)比

    為了測(cè)試本文系統(tǒng)轉(zhuǎn)換生成的C 代碼的正確性以及與人工編寫代碼的性能對(duì)比,使用專家級(jí)水平的人工代碼進(jìn)行對(duì)比測(cè)試。本文系統(tǒng)轉(zhuǎn)換生成的C 代碼與人工編寫的C 代碼均使用MKL 函數(shù)庫(kù)。對(duì)兩個(gè)測(cè)試用例,運(yùn)行系統(tǒng)轉(zhuǎn)換生成的C 代碼和人工編寫的C 代碼,使用相同的輸入,兩者的運(yùn)行結(jié)果一致,說(shuō)明了本文系統(tǒng)能生成正確的C 代碼。

    兩個(gè)C 程序在測(cè)試用例上的運(yùn)行耗時(shí)如表3和表4 所示。

    表3 與人工編寫代碼對(duì)比測(cè)試1 結(jié)果

    表4 與人工編寫代碼對(duì)比測(cè)試2 結(jié)果

    由結(jié)果可以看出,系統(tǒng)轉(zhuǎn)換生成的代碼運(yùn)行時(shí)間和專家級(jí)水平的人工代碼運(yùn)行時(shí)間相差不多,排除運(yùn)行環(huán)境浮動(dòng)干擾帶來(lái)的誤差,兩者的性能相當(dāng)。本文的系統(tǒng)可以幫助開發(fā)人員將MATLAB 代碼轉(zhuǎn)換到性能更好的C 代碼上,并提供相當(dāng)于專家級(jí)水平的人編寫的代碼性能,降低開發(fā)成本。

    3.3 與已有方法對(duì)比

    選擇兩個(gè)已有方法將MATLAB 轉(zhuǎn)換生成C++代碼,這兩個(gè)方法生成的C++代碼實(shí)際上并未使用較多C++特有的頭文件,因此將其與本文的C 代碼進(jìn)行比較。第一個(gè)是MATLAB Coder,使用時(shí)需要指定矩陣變量的元素類型和大小,針對(duì)不同的測(cè)試需要生成多份C 代碼。第二個(gè)是文獻(xiàn)[14]中的matlab2cpp,使用過(guò)程中需要根據(jù)它的自定義規(guī)則將部分不能自動(dòng)轉(zhuǎn)換的代碼段替換為正確的C 代碼段。生成的代碼運(yùn)行耗時(shí)測(cè)試結(jié)果如表5 和表6 所示,其中本文方法的結(jié)果沿用3.2 節(jié)中的數(shù)據(jù)。

    表5 與已有方法對(duì)比測(cè)試1 結(jié)果

    表6 與已有方法對(duì)比測(cè)試2 結(jié)果

    結(jié)果表明,MATLAB Coder 轉(zhuǎn)換生成的C 代碼的性能最差,以它的運(yùn)行時(shí)間為基準(zhǔn),matlab2cpp 和本文方法對(duì)它的加速比如表7 所示。

    表7 測(cè)試結(jié)果相比于MATLAB Coder 的加速比

    結(jié)果顯示本文方法生成的C 代碼的性能略優(yōu)于matlab2cpp,兩者的效果均優(yōu)于MATLAB Coder。對(duì)MATLAB Coder 生成的C 代碼分析可以得知,MATLAB Coder 基本上是將MATLAB 代碼中的矢量運(yùn)算以及庫(kù)函數(shù)展開為循環(huán),這樣C 代碼的性能對(duì)比使用了性能庫(kù)的C 代碼性能顯著較差。而matlab2cpp使用了armadillo 庫(kù)來(lái)提供大部分MATLAB 矢量運(yùn)算和庫(kù)函數(shù)的轉(zhuǎn)換,該庫(kù)的語(yǔ)法與MATLAB 相似,在轉(zhuǎn)換上能提供部分便利性,且該庫(kù)底層也集成了高性能的線性代數(shù)庫(kù),但是由于該庫(kù)對(duì)底層的封裝,在性能上會(huì)帶來(lái)部分損失。同時(shí),matlab2cpp 也不能保證轉(zhuǎn)換的完全自動(dòng)化,因?yàn)閍rmadillo 庫(kù)對(duì)于MATLAB中部分矢量運(yùn)算和庫(kù)函數(shù)有所缺失。而本文通過(guò)對(duì)矢量運(yùn)算和庫(kù)函數(shù)設(shè)計(jì)的替換算法能夠保證轉(zhuǎn)換的自動(dòng)化以及擴(kuò)展性,同時(shí)轉(zhuǎn)換后的C 代碼性能在MKL 的提升下也能優(yōu)于已有的方法。

    4 結(jié)論

    本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)MATLAB 代碼自動(dòng)轉(zhuǎn)換到高性能C 代碼的系統(tǒng)。針對(duì)大部分自動(dòng)轉(zhuǎn)換方法對(duì)特定語(yǔ)言依賴較大的問(wèn)題,本文引入IR 層,并將系統(tǒng)的整體框架分為前端轉(zhuǎn)換模塊、中間層模塊和后端轉(zhuǎn)換模塊三大模塊進(jìn)行實(shí)現(xiàn),對(duì)傳統(tǒng)方法中存在的一些問(wèn)題作出了改進(jìn)。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)自動(dòng)生成的高性能C 代碼性能與專家級(jí)水平的人工實(shí)現(xiàn)的相當(dāng),且優(yōu)于已有的方法。

    目前,該系統(tǒng)只支持MATLAB 代碼的矩陣運(yùn)算代碼轉(zhuǎn)換,對(duì)于含更高維度的矢量代碼轉(zhuǎn)換還未實(shí)現(xiàn),并且轉(zhuǎn)換后的C 代碼僅支持使用MKL 庫(kù)提升性能,局限性較大,這是本文進(jìn)一步的研究方向。

    猜你喜歡
    規(guī)則
    拼寫規(guī)則歌
    撐竿跳規(guī)則的制定
    數(shù)獨(dú)的規(guī)則和演變
    依據(jù)規(guī)則的推理
    法律方法(2019年3期)2019-09-11 06:26:16
    善用首次銷售規(guī)則
    規(guī)則的正確打開方式
    幸福(2018年33期)2018-12-05 05:22:42
    顛覆傳統(tǒng)規(guī)則
    讓規(guī)則不規(guī)則
    Coco薇(2017年11期)2018-01-03 20:59:57
    TPP反腐敗規(guī)則對(duì)我國(guó)的啟示
    啦啦操2010—2013版與2013—2016版規(guī)則的對(duì)比分析
    看免费av毛片| 青春草视频在线免费观看| 一区二区三区乱码不卡18| 精品国产一区二区久久| 亚洲精品美女久久久久99蜜臀 | 日韩三级伦理在线观看| 两性夫妻黄色片 | 在线观看免费日韩欧美大片| 秋霞伦理黄片| 日韩 亚洲 欧美在线| 国产亚洲午夜精品一区二区久久| 制服丝袜香蕉在线| 精品一区二区三卡| 性色avwww在线观看| 亚洲av.av天堂| 免费女性裸体啪啪无遮挡网站| 乱码一卡2卡4卡精品| 欧美 亚洲 国产 日韩一| 国产国拍精品亚洲av在线观看| 天堂中文最新版在线下载| av在线老鸭窝| 一本大道久久a久久精品| 777米奇影视久久| 日本-黄色视频高清免费观看| 最近的中文字幕免费完整| 少妇人妻久久综合中文| 成年女人在线观看亚洲视频| 在线免费观看不下载黄p国产| 伦理电影免费视频| 亚洲美女黄色视频免费看| 国产探花极品一区二区| 国产精品久久久久久久久免| 黑人欧美特级aaaaaa片| 男人操女人黄网站| 亚洲精品美女久久av网站| 纯流量卡能插随身wifi吗| 国产日韩欧美亚洲二区| 亚洲精品日本国产第一区| 欧美国产精品一级二级三级| 亚洲精品久久久久久婷婷小说| 亚洲国产精品一区三区| 午夜日本视频在线| 亚洲久久久国产精品| 日韩制服丝袜自拍偷拍| 又黄又粗又硬又大视频| 免费av中文字幕在线| 国产黄频视频在线观看| 大香蕉久久网| tube8黄色片| 97人妻天天添夜夜摸| 亚洲av电影在线观看一区二区三区| av一本久久久久| 日韩伦理黄色片| 亚洲成人av在线免费| 久久婷婷青草| 亚洲成人一二三区av| av卡一久久| 中文精品一卡2卡3卡4更新| 丝袜人妻中文字幕| 日本黄色日本黄色录像| 免费黄频网站在线观看国产| 最近2019中文字幕mv第一页| 天美传媒精品一区二区| 国产成人免费观看mmmm| 国产永久视频网站| 免费大片黄手机在线观看| 国产高清三级在线| 日韩制服丝袜自拍偷拍| 国产老妇伦熟女老妇高清| 黄片播放在线免费| 99热网站在线观看| 日韩av在线免费看完整版不卡| 欧美日本中文国产一区发布| 精品人妻一区二区三区麻豆| 精品一区二区三区视频在线| 国产精品女同一区二区软件| 亚洲国产av新网站| 母亲3免费完整高清在线观看 | 欧美日韩av久久| 丝袜脚勾引网站| 亚洲色图综合在线观看| 多毛熟女@视频| 色婷婷av一区二区三区视频| 亚洲精品自拍成人| 亚洲经典国产精华液单| 美女中出高潮动态图| 蜜桃国产av成人99| av不卡在线播放| xxxhd国产人妻xxx| 日韩三级伦理在线观看| 如日韩欧美国产精品一区二区三区| 在线天堂最新版资源| 国产成人一区二区在线| 久久久a久久爽久久v久久| 建设人人有责人人尽责人人享有的| 国产免费一区二区三区四区乱码| 国国产精品蜜臀av免费| 搡老乐熟女国产| 一本色道久久久久久精品综合| 2022亚洲国产成人精品| 美女脱内裤让男人舔精品视频| 熟女av电影| 精品亚洲成a人片在线观看| 国产精品国产三级国产专区5o| 性色avwww在线观看| 免费大片18禁| 一级片'在线观看视频| 日韩伦理黄色片| 亚洲精品视频女| 最近中文字幕2019免费版| 尾随美女入室| 国产免费又黄又爽又色| 18禁动态无遮挡网站| 如何舔出高潮| 久久精品久久久久久久性| 大香蕉97超碰在线| 日日摸夜夜添夜夜爱| 一级毛片电影观看| 日本vs欧美在线观看视频| 18在线观看网站| 插逼视频在线观看| 免费看光身美女| 国产淫语在线视频| 亚洲国产精品国产精品| 青春草国产在线视频| 国产精品久久久久成人av| 精品少妇久久久久久888优播| 免费久久久久久久精品成人欧美视频 | 汤姆久久久久久久影院中文字幕| 国产成人精品在线电影| 国产不卡av网站在线观看| 久久久a久久爽久久v久久| 女人被躁到高潮嗷嗷叫费观| 侵犯人妻中文字幕一二三四区| 国产在视频线精品| 一二三四中文在线观看免费高清| 免费av中文字幕在线| 成人国语在线视频| 亚洲欧洲国产日韩| 黄片无遮挡物在线观看| 久久久亚洲精品成人影院| 日本免费在线观看一区| 大香蕉久久网| 亚洲成av片中文字幕在线观看 | 自线自在国产av| 99热这里只有是精品在线观看| 在线 av 中文字幕| 人妻人人澡人人爽人人| 国产免费视频播放在线视频| 亚洲情色 制服丝袜| 精品久久国产蜜桃| 一本色道久久久久久精品综合| 精品国产乱码久久久久久小说| 大香蕉久久成人网| 1024视频免费在线观看| 亚洲av日韩在线播放| 老司机影院毛片| 九草在线视频观看| 一本一本久久a久久精品综合妖精 国产伦在线观看视频一区 | 啦啦啦中文免费视频观看日本| 国产精品久久久久久av不卡| 美女xxoo啪啪120秒动态图| 欧美另类一区| 中文精品一卡2卡3卡4更新| 最近最新中文字幕免费大全7| 亚洲av成人精品一二三区| 波多野结衣一区麻豆| 中文欧美无线码| 欧美日韩成人在线一区二区| 22中文网久久字幕| 永久免费av网站大全| 永久网站在线| 国产av码专区亚洲av| 人人妻人人澡人人爽人人夜夜| a级片在线免费高清观看视频| 18禁国产床啪视频网站| 赤兔流量卡办理| 精品人妻在线不人妻| 亚洲精品久久成人aⅴ小说| av在线老鸭窝| tube8黄色片| 亚洲欧美色中文字幕在线| 涩涩av久久男人的天堂| 天天躁夜夜躁狠狠躁躁| 蜜桃国产av成人99| 免费看av在线观看网站| 少妇熟女欧美另类| 日韩 亚洲 欧美在线| 九色亚洲精品在线播放| 熟女人妻精品中文字幕| 国产亚洲精品久久久com| 少妇猛男粗大的猛烈进出视频| 国产成人av激情在线播放| 国产视频首页在线观看| 在线观看美女被高潮喷水网站| 在线观看美女被高潮喷水网站| 国产日韩一区二区三区精品不卡| 少妇的逼好多水| 黑人高潮一二区| 中文精品一卡2卡3卡4更新| 一本—道久久a久久精品蜜桃钙片| 草草在线视频免费看| 草草在线视频免费看| 国产成人91sexporn| 色婷婷av一区二区三区视频| 色婷婷av一区二区三区视频| 亚洲av.av天堂| 国产麻豆69| av片东京热男人的天堂| 七月丁香在线播放| 七月丁香在线播放| 一本色道久久久久久精品综合| 久久ye,这里只有精品| 日本av手机在线免费观看| 观看美女的网站| 日日爽夜夜爽网站| 丝袜美足系列| 大片免费播放器 马上看| 久久午夜福利片| 最近最新中文字幕免费大全7| 国产精品秋霞免费鲁丝片| 99热网站在线观看| 最黄视频免费看| 制服诱惑二区| 国产一区二区在线观看日韩| 亚洲欧洲国产日韩| 亚洲国产av新网站| 一本—道久久a久久精品蜜桃钙片| 18禁裸乳无遮挡动漫免费视频| 一本—道久久a久久精品蜜桃钙片| 国产欧美另类精品又又久久亚洲欧美| 国产免费一区二区三区四区乱码| 国产免费一区二区三区四区乱码| 人妻人人澡人人爽人人| 老司机影院成人| 97精品久久久久久久久久精品| 国产69精品久久久久777片| 蜜桃国产av成人99| 内地一区二区视频在线| 男女午夜视频在线观看 | 观看av在线不卡| 日韩制服骚丝袜av| 国产一区亚洲一区在线观看| 国产激情久久老熟女| 亚洲av电影在线观看一区二区三区| 观看美女的网站| 亚洲婷婷狠狠爱综合网| 国内精品宾馆在线| 亚洲精品第二区| 新久久久久国产一级毛片| 成人毛片60女人毛片免费| 天堂中文最新版在线下载| 中文天堂在线官网| 街头女战士在线观看网站| 99热国产这里只有精品6| 一本色道久久久久久精品综合| 精品久久国产蜜桃| 日韩成人av中文字幕在线观看| 毛片一级片免费看久久久久| 99久国产av精品国产电影| 日韩 亚洲 欧美在线| 妹子高潮喷水视频| 亚洲国产精品国产精品| 十八禁高潮呻吟视频| 精品一品国产午夜福利视频| 欧美激情 高清一区二区三区| 成人免费观看视频高清| 在线看a的网站| 黄片无遮挡物在线观看| www.色视频.com| 一本久久精品| 最近的中文字幕免费完整| 香蕉精品网在线| 亚洲国产毛片av蜜桃av| 久久久欧美国产精品| 成人亚洲精品一区在线观看| 亚洲av日韩在线播放| 91国产中文字幕| 日日撸夜夜添| 91久久精品国产一区二区三区| 国产免费视频播放在线视频| 色婷婷久久久亚洲欧美| 国产乱来视频区| 中文字幕亚洲精品专区| 男女无遮挡免费网站观看| 亚洲精品美女久久久久99蜜臀 | 久久久久国产网址| 大话2 男鬼变身卡| 午夜久久久在线观看| 精品少妇内射三级| 在线 av 中文字幕| 黄色 视频免费看| 又黄又爽又刺激的免费视频.| 亚洲精品一二三| 99精国产麻豆久久婷婷| 亚洲精品自拍成人| 菩萨蛮人人尽说江南好唐韦庄| 久久久精品94久久精品| 少妇猛男粗大的猛烈进出视频| 曰老女人黄片| 欧美 日韩 精品 国产| 精品国产一区二区三区四区第35| 精品少妇黑人巨大在线播放| 成年美女黄网站色视频大全免费| 久久99精品国语久久久| 亚洲一级一片aⅴ在线观看| av女优亚洲男人天堂| 秋霞伦理黄片| 国产精品一区www在线观看| 18禁观看日本| 中文字幕人妻丝袜制服| 日韩三级伦理在线观看| 一二三四在线观看免费中文在 | 婷婷色麻豆天堂久久| 日日摸夜夜添夜夜爱| 亚洲美女搞黄在线观看| 女人久久www免费人成看片| 国产极品粉嫩免费观看在线| av女优亚洲男人天堂| 18禁国产床啪视频网站| 日韩制服骚丝袜av| 免费黄色在线免费观看| 亚洲经典国产精华液单| 国产精品欧美亚洲77777| 国产亚洲一区二区精品| 免费女性裸体啪啪无遮挡网站| 久久久久久久精品精品| 巨乳人妻的诱惑在线观看| 免费人妻精品一区二区三区视频| 久久精品久久精品一区二区三区| 91成人精品电影| 国产女主播在线喷水免费视频网站| 亚洲欧美日韩卡通动漫| 精品一区二区三卡| 日本与韩国留学比较| 国产精品久久久久成人av| 免费黄色在线免费观看| 久久精品久久精品一区二区三区| 亚洲欧美中文字幕日韩二区| 久久精品国产a三级三级三级| 一级片免费观看大全| 久久97久久精品| 熟妇人妻不卡中文字幕| 亚洲国产看品久久| 久久久久国产网址| 亚洲一码二码三码区别大吗| 国产精品无大码| av免费在线看不卡| 欧美精品av麻豆av| 亚洲婷婷狠狠爱综合网| 欧美精品亚洲一区二区| 亚洲国产欧美日韩在线播放| 国产日韩欧美在线精品| 欧美人与善性xxx| 国产成人精品久久久久久| 亚洲天堂av无毛| 色哟哟·www| 大片免费播放器 马上看| 少妇人妻精品综合一区二区| av线在线观看网站| 亚洲精品一二三| 欧美日韩一区二区视频在线观看视频在线| 中国国产av一级| videossex国产| 激情视频va一区二区三区| 日本91视频免费播放| 久久久久久久久久久免费av| 国产精品 国内视频| 精品一区二区免费观看| 狂野欧美激情性xxxx在线观看| 精品卡一卡二卡四卡免费| 亚洲精品成人av观看孕妇| av在线app专区| 欧美+日韩+精品| 亚洲国产精品一区二区三区在线| 国产精品无大码| 有码 亚洲区| 精品国产国语对白av| 久久99热6这里只有精品| 欧美精品高潮呻吟av久久| 看免费成人av毛片| 亚洲精品自拍成人| 色吧在线观看| 成人二区视频| 少妇的逼水好多| 亚洲欧美精品自产自拍| 国产欧美日韩综合在线一区二区| 国产精品欧美亚洲77777| 人妻人人澡人人爽人人| 国产一级毛片在线| 一区二区日韩欧美中文字幕 | 大陆偷拍与自拍| 免费观看a级毛片全部| 午夜久久久在线观看| 成人无遮挡网站| 如何舔出高潮| 尾随美女入室| 国产精品 国内视频| 亚洲精品乱久久久久久| 久久国产亚洲av麻豆专区| 妹子高潮喷水视频| 少妇被粗大的猛进出69影院 | 97在线视频观看| 中文字幕亚洲精品专区| 久久毛片免费看一区二区三区| 国产av码专区亚洲av| 国产极品粉嫩免费观看在线| 亚洲,一卡二卡三卡| 99热这里只有是精品在线观看| 日韩一区二区视频免费看| 熟女电影av网| 精品久久久久久电影网| 久久99热这里只频精品6学生| 久久人人爽人人片av| 精品视频人人做人人爽| 国产熟女欧美一区二区| 日韩不卡一区二区三区视频在线| 国产1区2区3区精品| 蜜桃国产av成人99| 久久亚洲国产成人精品v| 交换朋友夫妻互换小说| 各种免费的搞黄视频| 9191精品国产免费久久| 欧美日韩亚洲高清精品| 国产精品不卡视频一区二区| 爱豆传媒免费全集在线观看| 久久久久久久精品精品| 国产乱来视频区| 97超碰精品成人国产| 精品人妻偷拍中文字幕| 午夜激情久久久久久久| 日韩免费高清中文字幕av| 国产在线一区二区三区精| 99视频精品全部免费 在线| 欧美bdsm另类| 一区二区三区四区激情视频| 超碰97精品在线观看| 精品人妻在线不人妻| 成人毛片a级毛片在线播放| 777米奇影视久久| 春色校园在线视频观看| 精品人妻一区二区三区麻豆| 日韩熟女老妇一区二区性免费视频| 欧美亚洲 丝袜 人妻 在线| 久久久精品94久久精品| 亚洲国产精品成人久久小说| 久久久久久久亚洲中文字幕| 日韩av在线免费看完整版不卡| 大片免费播放器 马上看| 少妇精品久久久久久久| 欧美日韩综合久久久久久| 菩萨蛮人人尽说江南好唐韦庄| 美女福利国产在线| 内地一区二区视频在线| 激情五月婷婷亚洲| 午夜老司机福利剧场| 亚洲欧美成人精品一区二区| 日韩制服骚丝袜av| 在线 av 中文字幕| 久久精品人人爽人人爽视色| av免费在线看不卡| a级毛片黄视频| 伦精品一区二区三区| 精品一区二区免费观看| 亚洲国产精品成人久久小说| 尾随美女入室| 菩萨蛮人人尽说江南好唐韦庄| 女性被躁到高潮视频| a级片在线免费高清观看视频| 最新中文字幕久久久久| 在现免费观看毛片| 亚洲,欧美,日韩| 99热网站在线观看| 免费黄色在线免费观看| 九草在线视频观看| 黑人高潮一二区| 天堂俺去俺来也www色官网| 亚洲经典国产精华液单| 一边亲一边摸免费视频| 丝袜在线中文字幕| 欧美日韩一区二区视频在线观看视频在线| 97在线视频观看| 自线自在国产av| 伊人亚洲综合成人网| 亚洲色图综合在线观看| 巨乳人妻的诱惑在线观看| av免费在线看不卡| 婷婷成人精品国产| 免费观看av网站的网址| 国产日韩一区二区三区精品不卡| 久久精品国产亚洲av天美| 22中文网久久字幕| 亚洲 欧美一区二区三区| 免费少妇av软件| 免费观看a级毛片全部| www日本在线高清视频| 国产探花极品一区二区| 各种免费的搞黄视频| 在线观看www视频免费| 九九在线视频观看精品| 成人18禁高潮啪啪吃奶动态图| 午夜免费成人在线视频| 久久天躁狠狠躁夜夜2o2o| 精品高清国产在线一区| 黄色女人牲交| 免费不卡黄色视频| 中文亚洲av片在线观看爽 | 黑人欧美特级aaaaaa片| 免费黄频网站在线观看国产| 91国产中文字幕| 欧美 亚洲 国产 日韩一| 99re6热这里在线精品视频| 久久草成人影院| 欧美+亚洲+日韩+国产| 黄色片一级片一级黄色片| 欧美日韩av久久| 亚洲人成77777在线视频| 国产aⅴ精品一区二区三区波| 女人高潮潮喷娇喘18禁视频| 18在线观看网站| 老司机深夜福利视频在线观看| 91精品三级在线观看| 国产激情久久老熟女| 99久久人妻综合| 在线观看免费日韩欧美大片| 超碰成人久久| av有码第一页| 最新美女视频免费是黄的| 在线观看一区二区三区激情| 别揉我奶头~嗯~啊~动态视频| 欧美日韩av久久| 国产精品自产拍在线观看55亚洲 | 日韩精品免费视频一区二区三区| 99久久国产精品久久久| 亚洲成人免费电影在线观看| 亚洲精品中文字幕一二三四区| 亚洲精品av麻豆狂野| 少妇被粗大的猛进出69影院| 在线av久久热| 国产欧美日韩一区二区三区在线| 一边摸一边抽搐一进一小说 | 精品国产一区二区三区久久久樱花| 99国产精品99久久久久| 欧美激情 高清一区二区三区| 自拍欧美九色日韩亚洲蝌蚪91| 嫩草影视91久久| 国产av又大| 国产亚洲av高清不卡| 高清黄色对白视频在线免费看| 亚洲av成人一区二区三| 十八禁网站免费在线| 在线播放国产精品三级| 日韩成人在线观看一区二区三区| 精品熟女少妇八av免费久了| 精品少妇一区二区三区视频日本电影| 午夜亚洲福利在线播放| 99国产精品99久久久久| 男女床上黄色一级片免费看| 国产精品永久免费网站| 啦啦啦免费观看视频1| 免费不卡黄色视频| 天天躁夜夜躁狠狠躁躁| 成年人黄色毛片网站| 久久国产精品影院| 男女下面插进去视频免费观看| 午夜91福利影院| 国产精品.久久久| 黄色怎么调成土黄色| 欧美老熟妇乱子伦牲交| 欧洲精品卡2卡3卡4卡5卡区| 丁香欧美五月| 首页视频小说图片口味搜索| 老熟女久久久| 99久久精品国产亚洲精品| 黑人巨大精品欧美一区二区蜜桃| 亚洲熟女精品中文字幕| 日韩中文字幕欧美一区二区| 一级,二级,三级黄色视频| 亚洲国产精品合色在线| 国产亚洲精品久久久久5区| 亚洲午夜理论影院| 人人妻人人澡人人爽人人夜夜| 国产精品电影一区二区三区 | 色综合欧美亚洲国产小说| 午夜福利视频在线观看免费| 日本vs欧美在线观看视频| 丝瓜视频免费看黄片| 欧美日韩一级在线毛片| 悠悠久久av| 亚洲一卡2卡3卡4卡5卡精品中文| 亚洲精品在线美女| 大香蕉久久成人网| 天堂俺去俺来也www色官网| 国产成人影院久久av| 变态另类成人亚洲欧美熟女 | 国产免费男女视频| 日韩欧美免费精品| 亚洲一区二区三区不卡视频| 国产av精品麻豆| 国产亚洲精品一区二区www | 夜夜躁狠狠躁天天躁| 人人妻人人爽人人添夜夜欢视频| 99国产精品99久久久久| 久久久国产精品麻豆| 一区二区三区国产精品乱码| 亚洲综合色网址| 搡老岳熟女国产| 中出人妻视频一区二区| 丁香欧美五月| 国产亚洲欧美精品永久| 日韩精品免费视频一区二区三区| 大片电影免费在线观看免费| 国产精品香港三级国产av潘金莲| 亚洲avbb在线观看| 久久久精品免费免费高清|