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

    一種Fortran 到CUDA C 的轉(zhuǎn)換方法①

    2022-06-27 03:54:16劉穎輝遲學(xué)斌姜金榮
    關(guān)鍵詞:程序語(yǔ)言

    劉穎輝, 遲學(xué)斌, 姜金榮, 張 峰

    1(中國(guó)科學(xué)院 計(jì)算機(jī)網(wǎng)絡(luò)信息中心, 北京 100190)

    2(中國(guó)科學(xué)院大學(xué), 北京 100049)

    1 背景介紹

    隨著計(jì)算機(jī)科學(xué)的發(fā)展, 不同特色的程序語(yǔ)言不斷涌現(xiàn), 由于Fortran 更接近數(shù)學(xué)語(yǔ)言, 執(zhí)行效率較高,有著較低的開(kāi)發(fā)成本, 因此在數(shù)值計(jì)算、科學(xué)和工程技術(shù)領(lǐng)域, Fortran 依舊占據(jù)主流地位; 大量的數(shù)值計(jì)算工程軟件, 開(kāi)發(fā)語(yǔ)言同樣仍以Fortran 為主. 但在氣候、流體力學(xué)等多個(gè)領(lǐng)域的模擬過(guò)程中, 隨著計(jì)算規(guī)模的擴(kuò)大以及對(duì)于計(jì)算精度的更高要求, 程序計(jì)算所需的時(shí)間也在不斷延長(zhǎng), 部分大型程序需要幾天甚至幾十天才能完成計(jì)算. 傳統(tǒng)的優(yōu)化方式是將Fortran 程序與MPI 進(jìn)行結(jié)合, 通過(guò)實(shí)現(xiàn)粗粒度的并行來(lái)提高計(jì)算效率. 近些年來(lái), 隨著高性能計(jì)算機(jī)的迅速發(fā)展, 通過(guò)GPU 和CPU 的異構(gòu)計(jì)算平臺(tái)[1]來(lái)實(shí)現(xiàn)細(xì)粒度的并行這一課題成為了學(xué)術(shù)界和工業(yè)界的研究熱點(diǎn). 基于Fortran 所開(kāi)發(fā)的科學(xué)計(jì)算軟件及程序, 通過(guò)異構(gòu)并行來(lái)實(shí)現(xiàn)性能的巨大提升, 在工程上有著急切的需求. 在異構(gòu)計(jì)算平臺(tái)上, 以用于GPU 編程的CUDA C 語(yǔ)法為主流的行業(yè)標(biāo)準(zhǔn), AMD 平臺(tái)使用的ROCm 語(yǔ)法也參照CUDA C 規(guī)范. 但是從Fortran 到CUDA C 的移植過(guò)程, 不僅要求開(kāi)發(fā)人員對(duì)Fortran 與CUDA C 均有較高的熟悉度, 而且在復(fù)雜的文件和模塊中檢索相關(guān)變量的信息并編寫(xiě)相應(yīng)CUDA 函數(shù)往往有著巨大的工程量, 如果完全通過(guò)人工完成, 不僅效率低下、極易出錯(cuò), 且后期難以維護(hù)和調(diào)試. 因此從Fortran 到CUDA C 的自動(dòng)轉(zhuǎn)碼工具, 有著極大的需求.

    現(xiàn)如今僅有一些將C 語(yǔ)言轉(zhuǎn)換為CUDA 的工具,加拿大多倫多大學(xué)的Han 等人設(shè)計(jì)了一種基于指令的CUDA 編程語(yǔ)言hiCUDA[2], 西安交大的Li 等人實(shí)現(xiàn)了一種源到源自動(dòng)并行化工具GPU-S2S[3], 孫香玉提出了一種面向 CUDA 的源到源并行化架構(gòu) STSCUDA[4], 三者都是用于實(shí)現(xiàn)C 語(yǔ)言到CUDA 的自動(dòng)轉(zhuǎn)換, 但對(duì)于大型計(jì)算程序來(lái)說(shuō), 需要人工檢索程序中大量變量的相關(guān)信息, 再對(duì)內(nèi)存的分配拷貝釋放等諸多操作插入編譯指導(dǎo)語(yǔ)句. 通過(guò)這種方式來(lái)進(jìn)行轉(zhuǎn)化所需的工作量同樣是十分巨大的. 荷蘭埃因霍芬理工大學(xué)的Nugteren 等人設(shè)計(jì)了自動(dòng)轉(zhuǎn)換編譯器Bones[5],Bones 是一個(gè)概念性的驗(yàn)證而非工業(yè)性的編譯器, 其側(cè)重點(diǎn)在于對(duì)特定結(jié)構(gòu)的程序進(jìn)行轉(zhuǎn)換以及自動(dòng)優(yōu)化,對(duì)于實(shí)際程序中的復(fù)雜情況不能很好的支持. 除此之外, 部分學(xué)者設(shè)計(jì)了與CUDA 轉(zhuǎn)化相關(guān)的編譯器[6-8],取得了不錯(cuò)的效果. 而從Fortran 向CUDA C 的轉(zhuǎn)化工具, 僅美國(guó)國(guó)家海洋和大氣管理局地球系統(tǒng)研究實(shí)驗(yàn)室開(kāi)發(fā)了一種名為F2C-ACC 的編譯器[9], 但作者并未給出具體實(shí)現(xiàn)細(xì)節(jié)以及實(shí)際效果.

    2 應(yīng)用技術(shù)簡(jiǎn)介

    2.1 正則表達(dá)式

    正則表達(dá)式是對(duì)字符串進(jìn)行邏輯過(guò)濾的一種邏輯操作[10]. 將某類(lèi)字符抽象為一些特定的字符, 通過(guò)某些特定字符的組合來(lái)描述字符串匹配的模式.

    正則表達(dá)式具有強(qiáng)大的靈活性與功能性, 僅需非常簡(jiǎn)便的代碼就可以實(shí)現(xiàn)復(fù)雜的字符串操作. 通過(guò)正則表達(dá)式, 可以實(shí)現(xiàn)如下功能: (1)匹配. 判斷目標(biāo)字符串是否與描述的模式相匹配; (2)獲取. 從字符串中提取需要的特定信息; (3)編輯. 對(duì)字符串的子集進(jìn)行切割、替換等操作.

    2.2 shell 腳本

    shell 腳本是一種為 shell 編寫(xiě)的腳本程序, 能夠輕易的處理文件與目錄之類(lèi)的對(duì)象. 通過(guò)結(jié)合正則表達(dá)式以及sed、grep、awk 等命令可以在短時(shí)間內(nèi)完成一個(gè)功能強(qiáng)大又好用的腳本, 如下代碼實(shí)現(xiàn)了獲取使用操作符“( )”的變量名的功能:

    如果采用C 語(yǔ)言編寫(xiě)實(shí)現(xiàn)上述功能, 可能需要幾十行甚至上百行的代碼, 由此可見(jiàn)shell 腳本在字符串處理方面的強(qiáng)大功能.

    3 轉(zhuǎn)換算法的設(shè)計(jì)

    3.1 轉(zhuǎn)換難點(diǎn)分析

    Fortran 與CUDA C 在語(yǔ)法規(guī)范、內(nèi)存分配等方面均有較大的差異, 直接從Fortran 轉(zhuǎn)換為CUDA C 有著較大的難度. 而C 語(yǔ)言與Fortran 無(wú)論是從結(jié)構(gòu)方面還是語(yǔ)法的角度都比較相似, 同時(shí)在CUDA C 程序中,運(yùn)行在主機(jī)端的代碼仍然采用C 語(yǔ)言進(jìn)行編寫(xiě), C 語(yǔ)言很好的建立了從Fortran 到CUDA C 的橋梁. 因此將Fortran 程序轉(zhuǎn)換為CUDA C 的過(guò)程分為如下兩部分: (1) Fortran 語(yǔ)言到C 語(yǔ)言的轉(zhuǎn)換; (2)從C 語(yǔ)言轉(zhuǎn)化為CUDA C. 結(jié)合Fortran 與CUDA C 兩種語(yǔ)言的特點(diǎn), 轉(zhuǎn)換過(guò)程需要解決如下問(wèn)題:

    (1) 數(shù)組的處理. Fortran 中數(shù)組下標(biāo)可以采用形如A(index1:index2)形式來(lái)自定義起始下標(biāo)與終止下標(biāo), 若采用默認(rèn)定義, 則起始下標(biāo)為1[11]; 而在C 語(yǔ)言中所有數(shù)組下標(biāo)均從0 開(kāi)始, 且不支持自定義的方式來(lái)訪問(wèn)元素. 對(duì)于多維數(shù)組, Fortran 采用列優(yōu)先的方式進(jìn)行存儲(chǔ), 而C 語(yǔ)言為行優(yōu)先. 因此如何完成下標(biāo)映射將成為轉(zhuǎn)換過(guò)程中的一大難點(diǎn). 對(duì)于動(dòng)態(tài)分配的數(shù)組,定義中的維度用“:”來(lái)進(jìn)行, 需要額外檢索allocate 語(yǔ)句來(lái)獲取對(duì)應(yīng)的數(shù)組維度. Fortran 對(duì)數(shù)組的訪問(wèn)也更加靈活, 如對(duì)于維度相同的一維數(shù)組A、B, 則可以直接通過(guò)A(:)=B(:)來(lái)完成對(duì)應(yīng)元素的賦值. 因此對(duì)于使用“:”作為維度的相關(guān)語(yǔ)句需要進(jìn)行較為復(fù)雜的處理.

    (2) 引用外部模塊. Fortran90 采用module 將一系列的數(shù)據(jù)與函數(shù)封裝起來(lái), 任何程序都可以通過(guò)use語(yǔ)句來(lái)引用該module 中的內(nèi)容; 而在C 語(yǔ)言中引用其他變量通過(guò)include 或者extern 關(guān)鍵字來(lái)實(shí)現(xiàn). 因此轉(zhuǎn)換過(guò)程中, 文件的檢索范圍不僅限于本模塊, 還需要包含引用的所有外部模塊. 同時(shí)為了將轉(zhuǎn)換后的CUDA C 程序與原有的Fortran 程序鏈接起來(lái), 對(duì)變量的名稱(chēng)需要根據(jù)編譯器進(jìn)行額外的處理, 因此如何將引用的外部模塊轉(zhuǎn)換為同時(shí)兼容C 程序、Fortran 程序的形式將是一大難點(diǎn).

    (3) CUDA 函數(shù)的處理. 在異構(gòu)計(jì)算平臺(tái)上, CPU用于控制計(jì)算過(guò)程和實(shí)施存儲(chǔ)策略, 而具體的計(jì)算過(guò)程則由GPU 進(jìn)行[12]. 而在GPU 上不能直接訪問(wèn)CPU端的內(nèi)存, 因此GPU 計(jì)算所需的數(shù)據(jù)以及計(jì)算得到的結(jié)果必須顯式地與CPU 進(jìn)行數(shù)據(jù)的傳輸. 除此之外,在GPU 端執(zhí)行的代碼需針對(duì)并行做相應(yīng)的修改. 因此針對(duì)計(jì)算過(guò)程中的大量變量, 如何自動(dòng)生成函數(shù)實(shí)現(xiàn)內(nèi)存的分配、拷貝以及釋放將是轉(zhuǎn)換過(guò)程中的一大挑戰(zhàn).

    針對(duì)以上難點(diǎn), 本文進(jìn)行了相關(guān)算法設(shè)計(jì)和實(shí)現(xiàn).

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

    3.2.1 Fortran 語(yǔ)言到C 語(yǔ)言的轉(zhuǎn)換

    在Fortran 到C 語(yǔ)言的轉(zhuǎn)換過(guò)程中, 一方面需要完成相關(guān)語(yǔ)法、關(guān)鍵字等內(nèi)容的轉(zhuǎn)換, 另一方面對(duì)于每個(gè)變量, 需要從本文件或外部模塊中檢索來(lái)建立一張變量信息表, 表中需包含文件名稱(chēng)、變量名稱(chēng)、變量類(lèi)型、維度等轉(zhuǎn)換中必要的信息. 轉(zhuǎn)換流程如圖1 所示.

    圖1 Fortran 到C 的轉(zhuǎn)換流程圖

    (1) 規(guī)范代碼行

    處理源文件中的注釋與跨行. 為保證程序的可讀性, 源程序的注釋不刪除, 將“!”所注釋的內(nèi)容均修改為C 的“//”形式; 刪除跨行符“&”并合并多行為一行, 刪除文件中的空行.

    (2) 提取變量信息

    1) 數(shù)組型變量

    首先檢索源文件中的變量定義語(yǔ)句, 獲取所有的內(nèi)部數(shù)組變量名稱(chēng). 根據(jù)下標(biāo)運(yùn)算符“( )”提取所有可能的數(shù)組變量, 去除關(guān)鍵字、函數(shù)名以及內(nèi)部數(shù)組變量,得到所有外部數(shù)組類(lèi)型的變量名稱(chēng).

    通過(guò)對(duì)源文件進(jìn)行檢索, 截取數(shù)組變量的定義或allocate 語(yǔ)句的相關(guān)信息, 建立內(nèi)部數(shù)組變量與相應(yīng)維度、類(lèi)型的映射關(guān)系. 同理, 根據(jù)use 語(yǔ)句提取源文件引用的module 名稱(chēng), 在相應(yīng)文件中查找并建立外部數(shù)組變量信息表.

    2) 基本數(shù)據(jù)類(lèi)型變量

    由于直接從源文件篩選可能的變量名不僅效率低下, 而且準(zhǔn)確率較低, 因此從引用的模塊中提取出所有的變量定義(不含數(shù)組類(lèi)型變量), 依次進(jìn)行過(guò)濾, 僅保留在源文件中使用的子集, 從而建立外部變量與相應(yīng)類(lèi)型的映射關(guān)系.

    (3) 引用模塊轉(zhuǎn)換

    對(duì)源文件中引用的每一個(gè)模塊, 生成相應(yīng)的頭文件, 該文件中對(duì)使用到的相關(guān)變量進(jìn)行聲明. 對(duì)于非數(shù)組型變量直接將其轉(zhuǎn)換為C 語(yǔ)言的形式. 對(duì)于數(shù)組型變量, 由于C 程序數(shù)組的處理與Fortran 存在較大差異, 如C 程序數(shù)組維度僅能通過(guò)常量定義, 起始下標(biāo)為0, 不支持自定義下標(biāo)等, 因此將其聲明為同類(lèi)型的指針變量, 通過(guò)一維數(shù)組的方式進(jìn)行訪問(wèn).

    (4) 結(jié)構(gòu)轉(zhuǎn)換

    1) 關(guān)鍵字以及語(yǔ)句的轉(zhuǎn)換

    將Fortran 中的關(guān)鍵字與語(yǔ)句均轉(zhuǎn)換為C 語(yǔ)言中對(duì)應(yīng)的形式, 包括但不限于表1 的內(nèi)容. 注釋在C 程序中無(wú)需使用的語(yǔ)句, 最大限度保證程序的可讀性.

    表1 Fortran 與C 關(guān)鍵字及語(yǔ)句對(duì)照表

    2) 數(shù)組下標(biāo)索引的轉(zhuǎn)換

    對(duì)于Fortran 中定義的數(shù)組, 如real(8) dimension(index1) :: A, 則數(shù)組A 的維度大小為index1, 由于C 語(yǔ)言中起始下標(biāo)默認(rèn)為0, 當(dāng)通過(guò)下標(biāo)來(lái)進(jìn)行元素的訪問(wèn)時(shí)需要減去相應(yīng)的偏移量, 如A(i) 應(yīng)轉(zhuǎn)換為A[i-1]. 更一般的, 對(duì)于Fortran 中自定義下標(biāo)的數(shù)組,如: real(8) dimension(index1:index2) ::B, 則數(shù)組B 的維度大小為index2-index1+1, 相應(yīng)的訪問(wèn)B(i)應(yīng)轉(zhuǎn)換為B[i-index1].

    對(duì)于多維數(shù)組, 如Fortran 中定義數(shù)組real(8),dimension (dimx, dimy) :: D, 由于行列優(yōu)先的不同, 對(duì)應(yīng)C 程序的數(shù)組定義為: double D[dimy][dimx] , 相應(yīng)下標(biāo)訪問(wèn)D(i,j)對(duì)應(yīng)C 程序中的D[j-1][i-1]; 根據(jù)上文所述, 將多維數(shù)組均視為一維數(shù)組進(jìn)行相關(guān)運(yùn)算, 下標(biāo)訪問(wèn)需進(jìn)一步轉(zhuǎn)換為D[(j- 1)*dimy+(i-1)].

    3) 數(shù)組名稱(chēng)的轉(zhuǎn)換

    代碼的前后處理在CPU 上進(jìn)行, 一般使用原有代碼, 這就需要實(shí)現(xiàn)C 和Fortran 的混合編程, 主要是實(shí)現(xiàn)數(shù)組或變量的互相訪問(wèn). 以ifort 編譯器下的文件param.F90 中定義的外部數(shù)組變量b 為例, 將數(shù)組名稱(chēng)b 轉(zhuǎn)換為param_mp_b_, 所有外部數(shù)組變量均要做相應(yīng)的替換.

    Fortran 到C 的整體轉(zhuǎn)換算法如算法1 所示.

    算法1. Fortran 到C 的轉(zhuǎn)換1. 輸入Fortran 文件2. 預(yù)處理3. 匹配call 語(yǔ)句, 提取函數(shù)名稱(chēng)4. 匹配use 語(yǔ)句, 提取引用模塊名稱(chēng)5. for file in 源文件, 引用模塊文件6. 匹配變量define 語(yǔ)句、allocate 語(yǔ)句7. 存儲(chǔ)變量名稱(chēng)、所在文件、類(lèi)型、維度等信息8. end for 9. for var in 變量信息表10. if var in 引用模塊文件11. //以ifort 編譯器為例12. 替換變量名稱(chēng): var → filename_mp_var_13. end if 14. end for 15. 轉(zhuǎn)換Fortran 關(guān)鍵字、語(yǔ)句為C 形式16. 創(chuàng)建頭文件17. 輸出C 文件

    3.2.2 C 語(yǔ)言到CUDA C 的轉(zhuǎn)換

    CUDA C 語(yǔ)法規(guī)定用__global__修飾符所修飾的函數(shù)為核函數(shù), 核函數(shù)運(yùn)行在設(shè)備端, 而運(yùn)行在主機(jī)端的代碼與C 語(yǔ)言是完全兼容的. 因此從C 語(yǔ)言到CUDA C的轉(zhuǎn)換僅需考慮在設(shè)備端運(yùn)行的部分代碼即可, 這部分代碼所涉及的數(shù)據(jù)以及得出的結(jié)果均需要在主機(jī)與設(shè)備內(nèi)存間顯式的進(jìn)行復(fù)制[13], 即需要額外生成對(duì)應(yīng)的拷貝函數(shù). 除此之外, 由于核函數(shù)只能在主機(jī)端調(diào)用,設(shè)備端執(zhí)行[14], 因此主機(jī)端需要顯式的進(jìn)行核函數(shù)的調(diào)用, 并傳遞運(yùn)行時(shí)所需參數(shù), 核函數(shù)的內(nèi)容需結(jié)合多線程并行的特點(diǎn)做出相應(yīng)的調(diào)整. 轉(zhuǎn)換流程如圖2 所示.

    圖2 C 到CUDA C 的轉(zhuǎn)換流程圖

    (1) 內(nèi)存拷貝函數(shù)的生成

    1) 確定拷貝對(duì)象

    核函數(shù)中參與運(yùn)算的所有數(shù)組變量均需要在設(shè)備端顯式的進(jìn)行內(nèi)存的分配. 通過(guò)查找上文建立的變量信息表確定類(lèi)型與維度, 聲明同類(lèi)型空指針, 分別利用cudaMalloc、cudaFree 進(jìn)行GPU 內(nèi)存的分配與釋放.如參與運(yùn)算的某一數(shù)組定義為real, dimension(m, d):: a,則需生成如下CUDA C 語(yǔ)句:

    其中內(nèi)存分配與釋放語(yǔ)句中的CHECK 為宏定義,用于接收cudaError 并輸出提示信息, 保證程序的健壯性.

    2) 生成拷貝函數(shù)

    以所有外部數(shù)組變量為全集, 檢索源文件中賦值運(yùn)算符“=”, 出現(xiàn)在運(yùn)算符左側(cè)的所有變量將其從設(shè)備端拷貝到主機(jī)端, 相應(yīng)拷貝函數(shù)封裝為test_DtoH(), 出現(xiàn)在運(yùn)算符右側(cè)的變量將其從主機(jī)端拷貝到設(shè)備端,相應(yīng)拷貝函數(shù)封裝為test_HtoD(). 如對(duì)于c(j, i)=c(j,i)+a(j, k)*b(k, i), 則應(yīng)有如下函數(shù)被生成:

    extern "C" void test_DtoH(){//從GPU 到CPU 的內(nèi)存拷貝

    (2) 核函數(shù)的轉(zhuǎn)換

    1) 核函數(shù)范圍的確定

    一般情況下, 建議用戶(hù)將核函數(shù)部分放在一個(gè)單獨(dú)的Fortran 文件中, 使用subroutine 或者function 來(lái)將其封裝, 在主程序中通過(guò)call 語(yǔ)句來(lái)對(duì)其進(jìn)行調(diào)用.

    同時(shí), 我們?cè)试S手動(dòng)指定核函數(shù)的范圍, 在對(duì)應(yīng)的代碼塊加入如下指導(dǎo)語(yǔ)句:

    二者之間的代碼被認(rèn)為是一個(gè)完整的名為test 的核函數(shù).

    2) 形參列表的確立

    核函數(shù)中所用到的變量均需要作為形參列表的一部分來(lái)進(jìn)行傳遞, 具體分類(lèi)如下: ① 對(duì)于基本數(shù)據(jù)類(lèi)型: 整型、實(shí)型、字符型、邏輯型, 直接將其轉(zhuǎn)換為C 中所對(duì)應(yīng)的類(lèi)型, 作為參數(shù)來(lái)進(jìn)行傳遞. ② 對(duì)于數(shù)組型變量, 將其均視為一維數(shù)組, 相應(yīng)類(lèi)型的指針作為形參來(lái)進(jìn)行傳遞. ③ parameter 關(guān)鍵字定義的常量采用在頭文件中宏定義的方式進(jìn)行處理, 無(wú)需進(jìn)行參數(shù)的傳遞.

    3) 函數(shù)體的轉(zhuǎn)換

    GPU 上的計(jì)算以kernel 函數(shù)為主, 科學(xué)計(jì)算軟件中主要的計(jì)算代碼是do 循環(huán)計(jì)算(模板計(jì)算), 圖3 給出了模板計(jì)算的kernel 函數(shù)生成. 首先是插入了線程號(hào)計(jì)算代碼, 然后根據(jù)線程號(hào)將循環(huán)計(jì)算任務(wù)分配給相應(yīng)的線程. 由于控制循環(huán)的變量被修改, 因此原先由循環(huán)變量控制的數(shù)組下標(biāo)也要做出相應(yīng)的修改. 在Fortran 程序中由數(shù)組下標(biāo)i 控制的循環(huán), 在循環(huán)展開(kāi)后i 的含義變?yōu)镃UDA C 程序中的線程號(hào). 多維情況與一維情況類(lèi)似, 不再贅述.

    圖3 循環(huán)展開(kāi)格式

    C 到CUDA C 的整體轉(zhuǎn)換算法如算法2 所示.

    算法2. C 到CUDA C 的轉(zhuǎn)換1. 輸入C 文件2. for var in 變量信息表3. if var in 引用模塊文件4. 聲明設(shè)備端相應(yīng)變量, 創(chuàng)建cudaMalloc 函數(shù)5. if var match 賦值語(yǔ)句左側(cè)6. 創(chuàng)建GPU 到CPU 的cudaMemcpy 函數(shù)7. else if var match 賦值語(yǔ)句右側(cè)8. 創(chuàng)建CPU 到GPU 的cudaMemcpy 函數(shù)9. end if 10. 創(chuàng)建cudaFree 函數(shù)11. end if 12. end for 13. 確立形參列表, 生成核函數(shù)14. 轉(zhuǎn)換核函數(shù)函數(shù)體15. 輸出CUDA C 文件

    4 實(shí)驗(yàn)驗(yàn)證

    本文實(shí)驗(yàn)環(huán)境如表2 所示.

    表2 實(shí)驗(yàn)環(huán)境配置

    4.1 矩陣乘法的異構(gòu)代碼自動(dòng)生成

    稠密矩陣的乘法是典型的計(jì)算密集型問(wèn)題, 且具有較好的并行性. 以計(jì)算矩陣乘法:Am×dBd×n=Cm×n為例進(jìn)行測(cè)試, 輸入矩陣A、B均為隨機(jī)生成. 編寫(xiě)名為MatrixMul 的串行矩陣乘法Fortran 程序, 計(jì)算用到的數(shù)組以及相關(guān)變量定義于外部模塊(源程序位于param.F90 中). 基于正則表達(dá)式與shell 語(yǔ)言實(shí)現(xiàn)本文提出的轉(zhuǎn)換算法并進(jìn)行驗(yàn)證, 轉(zhuǎn)換所得結(jié)果與原Fortran 程序計(jì)算結(jié)果相同, 驗(yàn)證了轉(zhuǎn)換方法的正確性.

    轉(zhuǎn)換后程序的性能表現(xiàn)如圖4 所示, 其中橫坐標(biāo)是矩陣規(guī)模(m×d×n), 縱坐標(biāo)是計(jì)算時(shí)間. 點(diǎn)狀柱是原MPI 程序在1 個(gè)節(jié)點(diǎn)(2 顆CPU)下的計(jì)算時(shí)間, 條紋柱與灰柱分別對(duì)應(yīng)使用本文算法轉(zhuǎn)換完成和手動(dòng)實(shí)現(xiàn)的CUDA C 代碼在同1 張GPU 卡上的計(jì)算時(shí)間. 從計(jì)算結(jié)果中可以得出, 由本文算法自動(dòng)轉(zhuǎn)換得到的CUDA C矩陣乘法在性能上與人工編寫(xiě)的CUDA C 矩陣乘法相當(dāng), 較原MPI 程序平均加速了1.83 倍. GPU+CPU 的異構(gòu)計(jì)算較原CPU 并行能夠取得更好的加速效果.

    圖4 矩陣乘法性能對(duì)比

    4.2 海洋環(huán)流模式LICOM 的異構(gòu)代碼生成

    LICOM 是由中科院大氣物理研究所LASG 國(guó)家重點(diǎn)實(shí)驗(yàn)室發(fā)展的全球海洋環(huán)流模式. 它是中國(guó)科學(xué)院地球系統(tǒng)模式CAS-ESM 的重要組成部分[15].源程序采用Fortran 語(yǔ)言編寫(xiě), 核心計(jì)算程序普遍引用了多個(gè)模塊, 大量的數(shù)組變量通過(guò)allocate 語(yǔ)句來(lái)分配內(nèi)存, 以readyt 為例, 核函數(shù)部分計(jì)算變量累計(jì)86 個(gè), 其中數(shù)組型變量共52 個(gè), 引用自14 個(gè)模塊中數(shù)組變量共40 個(gè), 采用本文算法進(jìn)行代碼自動(dòng)轉(zhuǎn)換, 生成的文件結(jié)構(gòu)及功能如圖5 所示.

    圖5 readyt 轉(zhuǎn)換文件結(jié)構(gòu)及功能說(shuō)明

    實(shí)驗(yàn)證明: 對(duì)于復(fù)雜的大型程序, 本文提出的轉(zhuǎn)換算法仍能夠自動(dòng)檢索核函數(shù)所需變量, 從對(duì)應(yīng)文件中提取變量的相關(guān)信息, 自動(dòng)生成內(nèi)存分配、拷貝、釋放等一系列的函數(shù), 結(jié)合現(xiàn)有的變量信息表以及轉(zhuǎn)化完成的代碼進(jìn)行調(diào)試, 手動(dòng)修改少量代碼后即可編譯通過(guò), 轉(zhuǎn)化代碼的正確率高達(dá)80%以上, 初步完成了LICOM3 CUDA C 異構(gòu)代碼的開(kāi)發(fā).

    進(jìn)一步分析轉(zhuǎn)換算法的輸出結(jié)果, 探究轉(zhuǎn)換過(guò)程中出錯(cuò)的主要原因: (1)計(jì)算中含有冒號(hào)的數(shù)組索引未能進(jìn)行相應(yīng)的展開(kāi); (2) readyt 內(nèi)部定義的部分?jǐn)?shù)組變量在實(shí)際的CUDA C 程序中仍需進(jìn)行額外的處理. 若針對(duì)上述兩點(diǎn)預(yù)先對(duì)Fortran 程序進(jìn)行簡(jiǎn)單的修改, 則轉(zhuǎn)換正確率可達(dá)90%以上.

    經(jīng)過(guò)測(cè)試, Fortran 程序中readyt 函數(shù)平均耗時(shí)72.32 s, 轉(zhuǎn)換完成的CUDA C 程序中該函數(shù)平均耗時(shí)1.29 s, 加速了56.06 倍.

    5 結(jié)論展望

    本文在深入分析Fortran 語(yǔ)言以及CUDA C 相關(guān)特征的基礎(chǔ)上, 使用正則表達(dá)式和shell 語(yǔ)言, 實(shí)現(xiàn)了一套邏輯清晰、功能強(qiáng)大的Fortran 到CUDA C 的轉(zhuǎn)換方法. 經(jīng)過(guò)測(cè)試, 該方法轉(zhuǎn)換正確率高達(dá)80%以上,轉(zhuǎn)換后的代碼性能與人工編寫(xiě)的CUDA C 代碼相當(dāng),能夠有效節(jié)省大型程序的移植時(shí)間. 本文的實(shí)現(xiàn)存在一定的局限性, 對(duì)于較復(fù)雜的軟件代碼得到的轉(zhuǎn)換結(jié)果仍需開(kāi)發(fā)人員手動(dòng)進(jìn)行調(diào)試, 且實(shí)現(xiàn)的代碼還需要進(jìn)行深度優(yōu)化.

    猜你喜歡
    程序語(yǔ)言
    語(yǔ)言是刀
    文苑(2020年4期)2020-05-30 12:35:30
    試論我國(guó)未決羈押程序的立法完善
    讓語(yǔ)言描寫(xiě)搖曳多姿
    失能的信仰——走向衰亡的民事訴訟程序
    “程序猿”的生活什么樣
    多向度交往對(duì)語(yǔ)言磨蝕的補(bǔ)正之道
    英國(guó)與歐盟正式啟動(dòng)“離婚”程序程序
    累積動(dòng)態(tài)分析下的同聲傳譯語(yǔ)言壓縮
    創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
    我有我語(yǔ)言
    国产精品98久久久久久宅男小说| 大型黄色视频在线免费观看| 男女午夜视频在线观看| 精品国产美女av久久久久小说| 免费高清在线观看日韩| 男女下面进入的视频免费午夜 | 国产伦人伦偷精品视频| 亚洲精华国产精华精| 国产色视频综合| 制服诱惑二区| 久久久久久久久久久久大奶| 日本vs欧美在线观看视频| 老司机福利观看| 黄色片一级片一级黄色片| 国产在线观看jvid| 午夜91福利影院| 成熟少妇高潮喷水视频| 美女扒开内裤让男人捅视频| 国产精品一区二区在线不卡| 精品国内亚洲2022精品成人| 成人三级做爰电影| 欧美日韩福利视频一区二区| 免费看十八禁软件| 久久99一区二区三区| 国产精品日韩av在线免费观看 | av网站在线播放免费| 美女福利国产在线| 嫩草影视91久久| 午夜免费成人在线视频| 18禁国产床啪视频网站| 叶爱在线成人免费视频播放| 亚洲性夜色夜夜综合| 黄色视频,在线免费观看| 日韩 欧美 亚洲 中文字幕| 国产极品粉嫩免费观看在线| 成在线人永久免费视频| 色在线成人网| 久久久久久人人人人人| 久久香蕉精品热| 亚洲在线自拍视频| 国产亚洲欧美精品永久| 波多野结衣一区麻豆| 大型av网站在线播放| 视频区欧美日本亚洲| 国产高清激情床上av| 亚洲第一av免费看| 亚洲精品一区av在线观看| 国产主播在线观看一区二区| 一二三四社区在线视频社区8| 在线永久观看黄色视频| 日韩成人在线观看一区二区三区| 色婷婷久久久亚洲欧美| 免费在线观看日本一区| 最新美女视频免费是黄的| 欧美中文综合在线视频| 三级毛片av免费| 亚洲人成电影观看| 久久精品成人免费网站| 免费女性裸体啪啪无遮挡网站| 久久久水蜜桃国产精品网| 欧美激情极品国产一区二区三区| 如日韩欧美国产精品一区二区三区| 在线观看日韩欧美| 欧美中文日本在线观看视频| 成人18禁在线播放| 中文字幕精品免费在线观看视频| 亚洲人成网站在线播放欧美日韩| 亚洲欧美精品综合一区二区三区| 欧美久久黑人一区二区| a在线观看视频网站| 中文字幕另类日韩欧美亚洲嫩草| 巨乳人妻的诱惑在线观看| 午夜免费成人在线视频| 欧美不卡视频在线免费观看 | 黄色女人牲交| 日韩欧美三级三区| 欧美在线一区亚洲| 99久久精品国产亚洲精品| 在线播放国产精品三级| 亚洲va日本ⅴa欧美va伊人久久| 中文亚洲av片在线观看爽| 男女午夜视频在线观看| av有码第一页| 国产成人影院久久av| 女警被强在线播放| 欧美最黄视频在线播放免费 | 一进一出抽搐gif免费好疼 | 久久影院123| 在线国产一区二区在线| 亚洲 国产 在线| 久久精品国产亚洲av香蕉五月| 精品福利永久在线观看| 国产成人av教育| av天堂久久9| 国产免费男女视频| 日本五十路高清| 国产主播在线观看一区二区| av超薄肉色丝袜交足视频| 国产乱人伦免费视频| 伊人久久大香线蕉亚洲五| 亚洲激情在线av| 黄频高清免费视频| 一边摸一边抽搐一进一小说| 免费在线观看亚洲国产| 免费一级毛片在线播放高清视频 | 在线观看免费视频网站a站| 波多野结衣av一区二区av| 国产91精品成人一区二区三区| 欧美日本中文国产一区发布| cao死你这个sao货| 久久国产乱子伦精品免费另类| 国产亚洲精品一区二区www| www日本在线高清视频| 欧美亚洲日本最大视频资源| 日本 av在线| 99精国产麻豆久久婷婷| bbb黄色大片| 午夜成年电影在线免费观看| 亚洲国产欧美网| 国产99白浆流出| 国产又色又爽无遮挡免费看| 久久中文字幕一级| 女警被强在线播放| 久久 成人 亚洲| 日韩中文字幕欧美一区二区| 色在线成人网| 叶爱在线成人免费视频播放| 久久久国产成人免费| 成人亚洲精品av一区二区 | 欧美日本亚洲视频在线播放| 日本黄色日本黄色录像| 国产欧美日韩一区二区精品| 在线观看免费高清a一片| 欧美日韩黄片免| 久久亚洲精品不卡| 99在线人妻在线中文字幕| 久久中文字幕一级| 91老司机精品| 亚洲色图av天堂| 村上凉子中文字幕在线| 国产欧美日韩一区二区三| 欧美精品一区二区免费开放| 成人18禁在线播放| 中文亚洲av片在线观看爽| 国产av一区二区精品久久| 国产亚洲精品久久久久5区| 久9热在线精品视频| 9色porny在线观看| 久久香蕉精品热| 国产av一区二区精品久久| 亚洲七黄色美女视频| 国产精品 国内视频| 欧美成人免费av一区二区三区| 9191精品国产免费久久| 久久久国产欧美日韩av| 天堂中文最新版在线下载| 亚洲人成伊人成综合网2020| 午夜免费鲁丝| 久久久久久人人人人人| 国产免费现黄频在线看| 日本撒尿小便嘘嘘汇集6| 免费观看精品视频网站| 不卡一级毛片| a级片在线免费高清观看视频| 久久久久久久精品吃奶| 高清av免费在线| 国产伦一二天堂av在线观看| 神马国产精品三级电影在线观看 | 亚洲人成77777在线视频| 国产精品自产拍在线观看55亚洲| 亚洲av电影在线进入| 成人黄色视频免费在线看| 成人18禁在线播放| 欧美日韩精品网址| 搡老岳熟女国产| 极品教师在线免费播放| 性少妇av在线| 一级毛片高清免费大全| www日本在线高清视频| 欧美人与性动交α欧美软件| av中文乱码字幕在线| 久久久国产精品麻豆| 一区在线观看完整版| 91老司机精品| 亚洲精品中文字幕在线视频| www日本在线高清视频| av中文乱码字幕在线| 国产成人精品在线电影| 国产熟女午夜一区二区三区| 久久国产精品人妻蜜桃| 在线观看免费视频日本深夜| 日本欧美视频一区| 香蕉丝袜av| 久久久久国产一级毛片高清牌| 91在线观看av| 伊人久久大香线蕉亚洲五| 国产三级黄色录像| 一进一出抽搐动态| 50天的宝宝边吃奶边哭怎么回事| 亚洲欧美激情在线| 久久久久久久午夜电影 | 国产片内射在线| 国产精品一区二区精品视频观看| 美女午夜性视频免费| 欧美日韩乱码在线| 法律面前人人平等表现在哪些方面| 黑人操中国人逼视频| 免费少妇av软件| 午夜福利在线免费观看网站| 精品久久久久久成人av| 一级黄色大片毛片| www.999成人在线观看| 午夜精品在线福利| 夜夜躁狠狠躁天天躁| 欧美日本亚洲视频在线播放| 国产伦人伦偷精品视频| 欧美另类亚洲清纯唯美| 妹子高潮喷水视频| 久久人妻av系列| 老熟妇乱子伦视频在线观看| 久久精品aⅴ一区二区三区四区| 亚洲性夜色夜夜综合| 国产精品久久电影中文字幕| 一级a爱视频在线免费观看| 久久国产乱子伦精品免费另类| 国产精品免费一区二区三区在线| 他把我摸到了高潮在线观看| 国产精品一区二区三区四区久久 | 99国产极品粉嫩在线观看| 成人国产一区最新在线观看| 亚洲专区中文字幕在线| 亚洲中文字幕日韩| 欧美日韩精品网址| 亚洲熟女毛片儿| 丝袜在线中文字幕| 亚洲少妇的诱惑av| 国产一卡二卡三卡精品| 国产91精品成人一区二区三区| 天堂动漫精品| 中文欧美无线码| 亚洲第一欧美日韩一区二区三区| 欧美人与性动交α欧美软件| avwww免费| 中亚洲国语对白在线视频| 日本三级黄在线观看| 国产精品98久久久久久宅男小说| 久久精品aⅴ一区二区三区四区| 一级,二级,三级黄色视频| 精品第一国产精品| 麻豆久久精品国产亚洲av | 国产精品 欧美亚洲| 曰老女人黄片| 久久精品aⅴ一区二区三区四区| 一边摸一边抽搐一进一小说| 久久久久久久久免费视频了| 12—13女人毛片做爰片一| 亚洲精品国产精品久久久不卡| 女警被强在线播放| 成人永久免费在线观看视频| 色在线成人网| 国产精品久久视频播放| 精品第一国产精品| 纯流量卡能插随身wifi吗| 女生性感内裤真人,穿戴方法视频| 免费在线观看黄色视频的| 国产精品久久电影中文字幕| 成人特级黄色片久久久久久久| www.999成人在线观看| 人人妻人人澡人人看| 欧美日韩国产mv在线观看视频| 亚洲美女黄片视频| 欧美黄色片欧美黄色片| 天天添夜夜摸| 精品日产1卡2卡| 91字幕亚洲| 嫩草影院精品99| 久久草成人影院| 国产精品1区2区在线观看.| 久久天堂一区二区三区四区| 黄片大片在线免费观看| 少妇的丰满在线观看| 99国产精品一区二区三区| 国产精品久久久人人做人人爽| 人成视频在线观看免费观看| netflix在线观看网站| 亚洲国产精品sss在线观看 | 久久久久久久久免费视频了| 91字幕亚洲| 日本a在线网址| av天堂久久9| 18禁观看日本| 黄频高清免费视频| 亚洲一区高清亚洲精品| 夫妻午夜视频| 免费在线观看影片大全网站| 久久精品91无色码中文字幕| 黑人猛操日本美女一级片| 欧美日本亚洲视频在线播放| 日韩人妻精品一区2区三区| 怎么达到女性高潮| 国产xxxxx性猛交| 欧美成人性av电影在线观看| 久久国产精品人妻蜜桃| 天天躁狠狠躁夜夜躁狠狠躁| 在线观看午夜福利视频| 黄色丝袜av网址大全| 国产又色又爽无遮挡免费看| 制服诱惑二区| 女性被躁到高潮视频| 久久天堂一区二区三区四区| 18禁裸乳无遮挡免费网站照片 | 啦啦啦 在线观看视频| 国产成人一区二区三区免费视频网站| 在线观看舔阴道视频| 黄色女人牲交| 精品无人区乱码1区二区| 欧美日韩国产mv在线观看视频| 波多野结衣高清无吗| 久久久精品欧美日韩精品| 脱女人内裤的视频| 一级a爱片免费观看的视频| 一区二区三区精品91| 日韩大尺度精品在线看网址 | 精品国产美女av久久久久小说| 青草久久国产| 人人澡人人妻人| 少妇被粗大的猛进出69影院| 国产成人av教育| 老司机亚洲免费影院| 欧美老熟妇乱子伦牲交| 无人区码免费观看不卡| 成年版毛片免费区| 黄片小视频在线播放| 国产精品 欧美亚洲| 欧美一区二区精品小视频在线| 久久久久久久精品吃奶| 久久久久久久久中文| av在线播放免费不卡| 国产精品久久视频播放| 韩国av一区二区三区四区| 久热这里只有精品99| 国产欧美日韩一区二区精品| 热99国产精品久久久久久7| 男女床上黄色一级片免费看| 亚洲人成电影免费在线| 激情视频va一区二区三区| 99国产综合亚洲精品| 欧洲精品卡2卡3卡4卡5卡区| 久久人人97超碰香蕉20202| 国产精品香港三级国产av潘金莲| 无人区码免费观看不卡| 麻豆成人av在线观看| 精品久久久久久久毛片微露脸| 三级毛片av免费| 欧美日韩国产mv在线观看视频| 黄片小视频在线播放| 欧美黄色淫秽网站| 一进一出抽搐gif免费好疼 | 久久精品国产综合久久久| 男人舔女人下体高潮全视频| 99精品久久久久人妻精品| 欧美国产精品va在线观看不卡| 久久中文字幕一级| 日本三级黄在线观看| www.自偷自拍.com| 电影成人av| 国产精品野战在线观看 | 亚洲精品粉嫩美女一区| 久久99一区二区三区| 欧美色视频一区免费| 淫妇啪啪啪对白视频| 一边摸一边做爽爽视频免费| 无遮挡黄片免费观看| 俄罗斯特黄特色一大片| 精品熟女少妇八av免费久了| 午夜久久久在线观看| 美女国产高潮福利片在线看| 无遮挡黄片免费观看| 久久人妻熟女aⅴ| www国产在线视频色| 97人妻天天添夜夜摸| 午夜福利免费观看在线| 91大片在线观看| 欧美av亚洲av综合av国产av| 欧美乱妇无乱码| 不卡av一区二区三区| 久久精品影院6| 夫妻午夜视频| 日韩欧美国产一区二区入口| cao死你这个sao货| 咕卡用的链子| 男女之事视频高清在线观看| 欧美激情久久久久久爽电影 | 亚洲成国产人片在线观看| 丁香欧美五月| 夫妻午夜视频| 深夜精品福利| 啦啦啦在线免费观看视频4| 日韩三级视频一区二区三区| 丁香六月欧美| 国产一区二区三区在线臀色熟女 | 国产精品久久视频播放| 欧美日韩黄片免| 99香蕉大伊视频| 纯流量卡能插随身wifi吗| 国产成人一区二区三区免费视频网站| 波多野结衣av一区二区av| 99久久综合精品五月天人人| 精品人妻在线不人妻| 亚洲男人的天堂狠狠| 99国产极品粉嫩在线观看| 国产精品成人在线| 欧美日韩av久久| www.999成人在线观看| 最新在线观看一区二区三区| 黄网站色视频无遮挡免费观看| 欧美日韩乱码在线| 真人做人爱边吃奶动态| 一进一出好大好爽视频| 精品一区二区三区四区五区乱码| 精品电影一区二区在线| 中文字幕人妻丝袜制服| 亚洲av五月六月丁香网| 18禁美女被吸乳视频| 色尼玛亚洲综合影院| 日韩欧美三级三区| 欧美另类亚洲清纯唯美| 国产在线观看jvid| a在线观看视频网站| 欧美亚洲日本最大视频资源| 又大又爽又粗| a级毛片黄视频| 亚洲av电影在线进入| 欧美 亚洲 国产 日韩一| 黄色视频不卡| 我的亚洲天堂| 国产精品香港三级国产av潘金莲| 男女高潮啪啪啪动态图| 啦啦啦免费观看视频1| 国产熟女午夜一区二区三区| 亚洲精品在线观看二区| 操出白浆在线播放| 麻豆久久精品国产亚洲av | 精品卡一卡二卡四卡免费| 亚洲男人天堂网一区| 精品午夜福利视频在线观看一区| 精品国产美女av久久久久小说| 大码成人一级视频| 好男人电影高清在线观看| 女人被狂操c到高潮| 97碰自拍视频| 女警被强在线播放| 亚洲美女黄片视频| 国产97色在线日韩免费| 精品人妻1区二区| 免费看十八禁软件| 国产精品综合久久久久久久免费 | 成人18禁高潮啪啪吃奶动态图| 国产又爽黄色视频| av片东京热男人的天堂| 一区福利在线观看| 成年女人毛片免费观看观看9| 97碰自拍视频| 亚洲人成电影免费在线| 久久久国产欧美日韩av| 97超级碰碰碰精品色视频在线观看| 老熟妇仑乱视频hdxx| 1024视频免费在线观看| 不卡av一区二区三区| 久久精品91无色码中文字幕| 黄色成人免费大全| 视频在线观看一区二区三区| 色婷婷久久久亚洲欧美| 黄片大片在线免费观看| 亚洲欧美激情在线| www.www免费av| 午夜视频精品福利| 欧美人与性动交α欧美精品济南到| 日韩中文字幕欧美一区二区| 啦啦啦 在线观看视频| 亚洲专区字幕在线| 国产精品自产拍在线观看55亚洲| 天堂影院成人在线观看| 亚洲第一av免费看| xxx96com| 日本精品一区二区三区蜜桃| 男女高潮啪啪啪动态图| 欧美在线黄色| 可以免费在线观看a视频的电影网站| 一进一出抽搐gif免费好疼 | 亚洲专区国产一区二区| 免费人成视频x8x8入口观看| 久久国产精品人妻蜜桃| 他把我摸到了高潮在线观看| 99国产精品99久久久久| 女生性感内裤真人,穿戴方法视频| 久久热在线av| 新久久久久国产一级毛片| 黑人猛操日本美女一级片| 在线观看免费视频网站a站| 久久久国产一区二区| www.自偷自拍.com| 黄色片一级片一级黄色片| 久久国产精品影院| 美女高潮到喷水免费观看| 久久草成人影院| 亚洲男人天堂网一区| 美女扒开内裤让男人捅视频| 12—13女人毛片做爰片一| videosex国产| 人人妻人人澡人人看| 搡老熟女国产l中国老女人| 国产av一区二区精品久久| 麻豆国产av国片精品| 一本综合久久免费| 少妇被粗大的猛进出69影院| 三级毛片av免费| 亚洲欧美精品综合一区二区三区| 国产精品免费一区二区三区在线| 亚洲人成伊人成综合网2020| 亚洲欧美日韩另类电影网站| 女生性感内裤真人,穿戴方法视频| av网站在线播放免费| 纯流量卡能插随身wifi吗| 精品福利永久在线观看| 国产1区2区3区精品| 国产主播在线观看一区二区| bbb黄色大片| 少妇 在线观看| 男女床上黄色一级片免费看| 亚洲免费av在线视频| av免费在线观看网站| 岛国视频午夜一区免费看| 久久久国产成人精品二区 | 老熟妇仑乱视频hdxx| 最近最新免费中文字幕在线| 怎么达到女性高潮| 搡老岳熟女国产| 欧美日韩视频精品一区| 又黄又爽又免费观看的视频| 天天影视国产精品| 桃红色精品国产亚洲av| 国产精品电影一区二区三区| 不卡一级毛片| 日本黄色日本黄色录像| 高清av免费在线| 97碰自拍视频| 高清毛片免费观看视频网站 | 亚洲第一欧美日韩一区二区三区| 午夜精品国产一区二区电影| 亚洲黑人精品在线| netflix在线观看网站| 天堂动漫精品| 欧美日韩亚洲国产一区二区在线观看| 伊人久久大香线蕉亚洲五| 亚洲一卡2卡3卡4卡5卡精品中文| 9热在线视频观看99| 亚洲av电影在线进入| 亚洲欧洲精品一区二区精品久久久| 涩涩av久久男人的天堂| 别揉我奶头~嗯~啊~动态视频| 水蜜桃什么品种好| 国产精品爽爽va在线观看网站 | 可以免费在线观看a视频的电影网站| 老汉色∧v一级毛片| 免费搜索国产男女视频| 在线观看舔阴道视频| 国产91精品成人一区二区三区| 亚洲免费av在线视频| 亚洲精品国产区一区二| 国产成人精品久久二区二区91| 一级毛片女人18水好多| 午夜a级毛片| 午夜精品久久久久久毛片777| 男女高潮啪啪啪动态图| 最近最新中文字幕大全电影3 | 18禁黄网站禁片午夜丰满| 国产免费男女视频| 一二三四社区在线视频社区8| 欧美一级毛片孕妇| 激情视频va一区二区三区| 午夜亚洲福利在线播放| 亚洲在线自拍视频| 欧美黑人精品巨大| 国产一区在线观看成人免费| 成人国语在线视频| 天堂√8在线中文| 一边摸一边抽搐一进一出视频| 久久这里只有精品19| 免费在线观看完整版高清| www日本在线高清视频| 人人妻人人澡人人看| 亚洲,欧美精品.| 日韩国内少妇激情av| 一级作爱视频免费观看| av视频免费观看在线观看| 久久精品国产综合久久久| 制服诱惑二区| 男女做爰动态图高潮gif福利片 | 免费一级毛片在线播放高清视频 | 精品一区二区三区av网在线观看| 欧美在线一区亚洲| 免费看a级黄色片| 精品国内亚洲2022精品成人| 麻豆av在线久日| 在线观看一区二区三区激情| 真人做人爱边吃奶动态| 亚洲五月婷婷丁香| 日本欧美视频一区| 亚洲av片天天在线观看| 久久午夜亚洲精品久久| 日韩精品免费视频一区二区三区| 色综合婷婷激情| 国产欧美日韩一区二区精品| 丰满的人妻完整版|