基于CUDA的加速M(fèi)ATLAB計(jì)算研究
近幾年來,計(jì)算機(jī)顯卡核心單元GPU(graphics processing unit)在浮點(diǎn)運(yùn)算性能方面取得了突飛猛進(jìn)的發(fā)展(如NVIDIA公司推出的GeForce GTX200系列高端顯卡,浮點(diǎn)運(yùn)算速度逼近每秒萬億次左右,相當(dāng)于過去小型機(jī)的處理能力),GPU以其遠(yuǎn)遠(yuǎn)超過CPU的浮點(diǎn)運(yùn)算性能、高內(nèi)存帶寬、高性價(jià)比等優(yōu)點(diǎn),越來越受到廣大科研人員的重視,并在分子生物模擬、地震數(shù)據(jù)處理、超級(jí)計(jì)算機(jī)、金融模型計(jì)算等[5~8]方面取得了不錯(cuò)的加速效果,一些計(jì)算的加速效果達(dá)到100多倍。雖然GPU計(jì)算有如此好的加速效果和高速浮點(diǎn)運(yùn)算性能等優(yōu)點(diǎn),但是在巖土工程的相關(guān)計(jì)算中還沒有引入該方法。基于這一目的,本文介紹了NVIDIA公司的GPU通用計(jì)算框架CUDA,以及利用CUDA加速計(jì)算MATLAB程序的原理,通過規(guī)模矩陣計(jì)算、快速傅里葉變換(FFT)、支持向量機(jī)(SVM)等巖土工程計(jì)算中的常見算法,分析了CUDA加速M(fèi)ATLAB程序的情況。
1 CUDA框架特點(diǎn)
1.1 CUDA簡(jiǎn)介
為了充分發(fā)揮GPU的高速浮點(diǎn)運(yùn)算等方面性能,NVIDIA公司研究人員針對(duì)該公司的GPU設(shè)計(jì)出了一種新的計(jì)算框架CUDA。該框架是一個(gè)軟硬件協(xié)同的完整并行計(jì)算解決方案,提供了硬件的直接訪問接口以及高性能計(jì)算指令,可以使GPU與CPU協(xié)同工作,合理管理GPU設(shè)備、存儲(chǔ)器、流、事件等,充分利用GPU高速內(nèi)存帶寬,從而實(shí)現(xiàn)復(fù)雜的問題加速計(jì)算,尤其是大規(guī)模的并行計(jì)算問題。CUDA開發(fā)工具主要包括CUDA驅(qū)動(dòng)程序、CUDA運(yùn)行時(shí)庫、CUDA庫三個(gè)組件。CUDA軟件的核心層次結(jié)構(gòu)如圖1所示[9]。
1.2 MATLAB在CUDA框架下的的使用
由于MATLAB的M語言編程時(shí)與外部環(huán)境的數(shù)據(jù)和程序的交互非常有限,MATLAB提供了功能更強(qiáng)大的MEX腳本文件。利用MEX文件,可以調(diào)用C、Fortran等語言、輸入或輸出數(shù)據(jù)、與其他軟件建立客戶/服務(wù)器通信、直接控制硬件等功能[10]。
NVIDIA公司針對(duì)MATLAB開發(fā)了一個(gè)新的插件,該插件包含一個(gè)名為nvmex腳本和一個(gè)簡(jiǎn)化CUDA配置的可選配置文件。通過nvmex可以將CUDA源程序編譯為MATLAB的MEX腳本文件,使MATLAB軟件方便地調(diào)用CUDA函數(shù)庫,方便數(shù)據(jù)計(jì)算[11,12]。
一個(gè)基本的CUDA mex文件數(shù)據(jù)計(jì)算操作包含以下幾個(gè)步驟:a)在GPU中分配合適的數(shù)據(jù)存儲(chǔ)空間。b)將數(shù)據(jù)從主機(jī)內(nèi)存移動(dòng)到GPU內(nèi)存中,GPU開始分配線程塊等準(zhǔn)備工作,并根據(jù)CUDA代碼調(diào)用相關(guān)函數(shù)庫,做相應(yīng)的數(shù)據(jù)計(jì)算操作。GPU計(jì)算完成后,將數(shù)據(jù)返回主機(jī)內(nèi)存中。c)釋放GPU中的數(shù)據(jù)存儲(chǔ)空間,完成整個(gè)計(jì)算流程[10]。其流程如圖2所示。
2 MATLAB加速計(jì)算在巖土工程中的應(yīng)用
在巖土工程中,常常使用矩陣計(jì)算、快速傅里葉變換(FFT)、支持向量機(jī)等算法來解決巖土工程中的計(jì)算問題。例如,矩陣計(jì)算可以解決巖土力學(xué)[13]、滲流有限元分析[14]等方面問題,快速傅里葉變換模型可以解決動(dòng)荷載作用下土的動(dòng)力響應(yīng)[15,16]問題,支持向量機(jī)模型可以解決巖體工程分級(jí)[17]、地下工程可靠性分析[18]、邊坡穩(wěn)定性[19]等方面問題。
下面將從測(cè)試平臺(tái)、測(cè)試算法、測(cè)試結(jié)果方面,詳細(xì)探討MATLAB對(duì)上述算法的加速效果。
2.1 測(cè)試平臺(tái)環(huán)境選擇
本文軟件測(cè)試平臺(tái)選用的是Windows XP SP2操作系統(tǒng),支持CUDA插件的MATLAB 7.3.0 (R2006b),CUDA 2.1版本庫。硬件測(cè)試平臺(tái)是雙核的Intel Core2Duo E4400 2.0 GHz CPU,影馳9600GT顯卡(其核心是NVIDIA GeForce 9600 GT),DDR2 800金士頓1 GB內(nèi)存。
2.2 測(cè)試算法
CUDA加速M(fèi)ATLAB的主要原理是將流程控制的操作如串行代碼放在CPU中操作,而一些需要大規(guī)模并行計(jì)算的操作代碼放在GPU中處理,從而縮短了整個(gè)計(jì)算操作的時(shí)間。MATLAB中數(shù)據(jù)的計(jì)時(shí)方式采用tic、toc函數(shù)來標(biāo)記起止時(shí)間。CUDA計(jì)算數(shù)據(jù)的流程如圖2所示。下面詳細(xì)介紹這些算法的實(shí)現(xiàn)。
2.2.1 矩陣計(jì)算
矩陣計(jì)算模型采用的是常見的矩陣乘法,通過不同維度的矩陣相乘,比較出在不同維度下的加速效果。為了研究的方便和矩陣數(shù)據(jù)一致性,這里的矩陣都采用方陣,矩陣數(shù)據(jù)是由生成的隨機(jī)數(shù)填充,并保存在txt文件中。
傳統(tǒng)MATLAB的實(shí)現(xiàn)方式是先在主機(jī)上分配好矩陣的存儲(chǔ)空間,將txt文件數(shù)據(jù)讀入到數(shù)組中,然后調(diào)用矩陣乘法命令,將計(jì)算的結(jié)果保存到指定的結(jié)果數(shù)組中,完成整個(gè)?計(jì)算。?
基于CUDA的實(shí)現(xiàn)方式主要是利用CUDA自帶的CUBLAS庫進(jìn)行矩陣計(jì)算。其步驟是主機(jī)先將txt文件數(shù)據(jù)讀入主機(jī)內(nèi)存;然后GPU調(diào)用cublasInit函數(shù)初始化GPU,并調(diào)用cublasAlloc函數(shù)分配矩陣的GPU存儲(chǔ)空間,將主機(jī)內(nèi)存中的矩陣數(shù)據(jù)讀入GPU中;最后GPU調(diào)用cublasSgemm函數(shù)進(jìn)行矩陣乘法計(jì)算,并通過cublasGetVector函數(shù)將計(jì)算結(jié)果返回主機(jī),調(diào)用cublasFree函數(shù)釋放GPU上的矩陣存儲(chǔ)空間,完成整個(gè)計(jì)算工作[11]。
2.2.2 快速傅里葉變換(FFT)
FFT計(jì)算方式與矩陣計(jì)算類似,也是先生成隨機(jī)的FFT原始數(shù)據(jù),并將數(shù)據(jù)保存在txt文件中,保證測(cè)試數(shù)據(jù)的統(tǒng)一性。
傳統(tǒng)MATLAB的實(shí)現(xiàn)方式是將txt文件的數(shù)據(jù)讀入到指定的數(shù)組中,然后調(diào)用fft函數(shù),并返回指定結(jié)果,完成整個(gè)?計(jì)算。?
基于CUDA的實(shí)現(xiàn)方式是利用CUDA自帶的CUFFT庫。實(shí)現(xiàn)步驟是先將txt文件的數(shù)據(jù)讀入主機(jī)內(nèi)存;然后GPU調(diào)用cudaMalloc分配GPU上的存儲(chǔ)空間,調(diào)用cudaMemcpy將數(shù)據(jù)從主機(jī)內(nèi)存復(fù)制到GPU內(nèi)存,再調(diào)用cufftPlan1d建立一維FFT plan;最后調(diào)用cufftExecC2C函數(shù)完成FFT變換,將計(jì)算結(jié)果返回主機(jī)內(nèi)存,釋放plan以及GPU上的數(shù)據(jù)存儲(chǔ)空間,完成整個(gè)計(jì)算工作[11]。
2.2.3 支持向量機(jī)(SVM)
SVM算法分為訓(xùn)練、預(yù)測(cè)兩部分。其計(jì)算方式與上述算法類似,先生成一定數(shù)量的訓(xùn)練樣本和測(cè)試樣本數(shù)據(jù),然后保存在txt文件中,由兩種算法分別對(duì)測(cè)試樣本進(jìn)行訓(xùn)練、?預(yù)測(cè)。?
傳統(tǒng)的MATLAB的實(shí)現(xiàn)方式是將txt文件的數(shù)據(jù)讀入指定的數(shù)組中,然后設(shè)定好訓(xùn)練參數(shù),調(diào)用svmtrain函數(shù)進(jìn)行訓(xùn)練并得到訓(xùn)練模型,根據(jù)訓(xùn)練模型和測(cè)試數(shù)據(jù)調(diào)用svmclassify函數(shù)進(jìn)行預(yù)測(cè),并返回相應(yīng)的預(yù)測(cè)結(jié)果。
基于CUDA的實(shí)現(xiàn)方式主要是利用參考文獻(xiàn)[20]的?cuSVM?庫進(jìn)行實(shí)驗(yàn)。實(shí)現(xiàn)步驟是先讀取txt文件數(shù)據(jù),然后設(shè)置好訓(xùn)練參數(shù),調(diào)用cuSVMTrain函數(shù)對(duì)訓(xùn)練樣本進(jìn)行訓(xùn)練并生產(chǎn)訓(xùn)練模型,根據(jù)訓(xùn)練模型和測(cè)試數(shù)據(jù)調(diào)用cuSVMPredict函數(shù)進(jìn)行預(yù)測(cè),返回相應(yīng)預(yù)測(cè)結(jié)果,完成整個(gè)計(jì)算。
2.3 測(cè)試結(jié)果
2.3.1 矩陣計(jì)算
#p#page_title#e#
矩陣測(cè)試的數(shù)據(jù)采用行列數(shù)相同的方陣,分別采用維度為500×500、800×800、1 000×1 000、3 000×3 000、5 000×5 000的矩陣(方陣)相乘,計(jì)算時(shí)間如表1所示。表1中的加速倍數(shù)是由傳統(tǒng)方式計(jì)算時(shí)間與CUDA方式計(jì)算時(shí)間的比值得到的,本文中的其他算法表格的加速倍數(shù)均采用類似方式計(jì)算。從表1中可以看出,當(dāng)矩陣規(guī)模為500×500時(shí),CUDA方式時(shí)間為0.026 3 s,而傳統(tǒng)方式時(shí)間為0.015 6 s,可以看出CUDA方式不僅沒有加速作用,反而落后于傳統(tǒng)的計(jì)算方式約1倍的時(shí)間(0.59倍);當(dāng)矩陣規(guī)模增加到800×800、1 000×1 000時(shí),CUDA方式略有增加,但是效果不是很明顯,只有1.28倍和1.58倍加速;當(dāng)矩陣規(guī)模增到3 000×3 000時(shí),CUDA方式取得了明顯的加速效果,達(dá)到了5.16倍,比傳統(tǒng)方式節(jié)約了29.734-5.761=23.973 s的時(shí)間;當(dāng)矩陣規(guī)模達(dá)到5 000×?5 000?時(shí),CUDA方式取得了不錯(cuò)的加速效果,達(dá)到了22.39倍,遠(yuǎn)小于傳統(tǒng)方式計(jì)算所花的時(shí)間。
表1 矩陣計(jì)算結(jié)果
矩陣規(guī)模傳統(tǒng)方式時(shí)間/sCUDA方式時(shí)間/s加速倍數(shù)
500×5000.015 6000.026 3000.59
800×8000.578 0000.453 0001.28
1 000×1 0001.188 0000.752 0001.58
3 000×3 00029.734 0005.761 0005.16
5000×5000137.844 0006.156 00022.39
2.3.2 快速傅里葉變換(FFT)
FFT測(cè)試的數(shù)據(jù)分別采用維度為1 024×8、1 024×32、?1 024×128?、1 024×512、1 024×1 024的一維FFT變換。這里FFT數(shù)據(jù)規(guī)模均采用2的整數(shù)次冪,主要是為了方便FFT計(jì)算。計(jì)算時(shí)間如表2所示。
表2 FFT計(jì)算結(jié)果
FFT規(guī)模傳統(tǒng)方式時(shí)間/sCUDA方式時(shí)間/s加速倍數(shù)
1 024×80.016 0000.0121.33
1 024×320.094 0000.0234.09
1 024×1280.453 0000.04111.78
1 024×5122.015 0000.05735.36
1 024×1 0243.844 0000.08246.88
從表2可看出,當(dāng)FFT規(guī)模為1 024×8時(shí),CUDA方式與傳統(tǒng)方式計(jì)算相差不大,時(shí)間相差0.016-0.012=0.004 s,加速倍數(shù)為1.33;當(dāng)FFT規(guī)模為1 024×32、1 024×128時(shí),CUDA方式取得了明顯的加速效果,分別達(dá)到了4.09倍、11.78倍;當(dāng)FFT規(guī)模為1 024×512、1 024×1 024時(shí),CUDA方式取得了驚人的加速效果,分別達(dá)到了35.36倍、46.88倍,遠(yuǎn)遠(yuǎn)優(yōu)于傳統(tǒng)計(jì)算方式。
2.3.3 支持向量機(jī)(SVM)
SVM采用的樣本特征值數(shù)為100,樣本數(shù)分別3 000、?5 000?、8 000、10 000、30 000,訓(xùn)練參數(shù)采用的是C?SVC核心函數(shù),C值為100,γ值為0.5。預(yù)測(cè)計(jì)算采用的測(cè)試數(shù)據(jù)是訓(xùn)練樣本中的部分?jǐn)?shù)據(jù),根據(jù)訓(xùn)練模型進(jìn)行預(yù)測(cè)。訓(xùn)練結(jié)果和預(yù)測(cè)結(jié)果分別如表3和4所示。
表3 SVM訓(xùn)練結(jié)果
樣本規(guī)模傳統(tǒng)方式時(shí)間/sCUDA方式時(shí)間/s加速倍數(shù)
3 00065.728 00018.735 0003.51
5 000112.997 00020.178 0005.60
8 000220.542 00023.972 0009.20
10 000357.984 00029.832 00012.01
30 000523.538 00032.614 00016.05
表4 SVM預(yù)測(cè)結(jié)果
測(cè)試?規(guī)模
傳統(tǒng)方式
時(shí)間/s精度/%
CUDA方式
時(shí)間/s精度/%
加速?倍數(shù)
2 0005.796 00092.740.386 00092.8315.02
4 0008.652 00093.270.412 00093.2121.00
6 00013.095 00093.860.485 00093.8427.01
8 00020.026 00094.760.572 00094.7935.01
10 00031.721 00095.590.618 00095.5651.32
從表3可以看出,當(dāng)樣本規(guī)模為3 000、5 000、8 000時(shí),CUDA方式雖然有一定的加速效果,但是效果不是很突出;當(dāng)樣本規(guī)模達(dá)到10 000、30 000時(shí),CUDA方式取得了明顯的加速效果。從表4可以看出,兩種計(jì)算方式的預(yù)測(cè)精度比較接近,但是計(jì)算時(shí)間差別較大。當(dāng)測(cè)試規(guī)模為2 000時(shí),CUDA方式就取得了15.02倍的明顯加速效果;當(dāng)測(cè)試規(guī)模不斷加大時(shí),CUDA方式加速效果越來越明顯,在測(cè)試規(guī)模達(dá)到10 000時(shí),加速效果達(dá)到了驚人的51.32倍!
2.3.4 測(cè)試結(jié)論
分析上述測(cè)試結(jié)果,可以得出以下結(jié)論:
a)數(shù)據(jù)規(guī)模對(duì)加速效果的影響。從表1~4的測(cè)試結(jié)果簡(jiǎn)單分析中可以看出,同樣的算法,當(dāng)計(jì)算規(guī)模較小時(shí),CUDA方式加速效果不太明顯,甚至出現(xiàn)“減速”效果,如矩陣計(jì)算規(guī)模為500×500,傳統(tǒng)計(jì)算時(shí)間為0.015 6 s,CUDA方式計(jì)算時(shí)間為0.026 3 s,落后于傳統(tǒng)方式計(jì)算;當(dāng)規(guī)模較大時(shí),CUDA加速效果顯著,產(chǎn)生了十幾倍到幾十倍的加速,而且規(guī)模越大,加速效果越明顯。
產(chǎn)生該現(xiàn)象的原因是,主機(jī)(host)內(nèi)存數(shù)據(jù)與GPU內(nèi)存數(shù)據(jù)交互(讀入、返回)需要一定的時(shí)間開銷,規(guī)模不大時(shí)這部分開銷對(duì)最終的計(jì)算時(shí)間有很大影響,只有當(dāng)數(shù)據(jù)規(guī)模很大時(shí),數(shù)據(jù)交互時(shí)間所占比例較小,GPU計(jì)算時(shí)間足以抵過這部分開銷,CUDA加速的效果才比較突出。
b)算法復(fù)雜度的影響。表5總結(jié)了各個(gè)算法的加速效果對(duì)比。從加速倍數(shù)的變化效果上看,矩陣規(guī)模從500×500擴(kuò)大到5 000×5 000時(shí),加速倍數(shù)從0.59擴(kuò)大到22.39,即加速效果擴(kuò)大了22.39/0.59≈37.95倍;FFT規(guī)模從1024×8擴(kuò)大到1024×1024時(shí),加速倍數(shù)從1.33擴(kuò)大到46.88,即加速效果擴(kuò)大了46.88/1.33≈35.25倍;SVM訓(xùn)練算法規(guī)模從3 000擴(kuò)大到30 000時(shí),加速倍數(shù)從3.51擴(kuò)大到16.05,即加速效果擴(kuò)大了16.05/3.51≈4.57倍;SVM預(yù)測(cè)規(guī)模從2 000擴(kuò)大到?10 000時(shí)?,加速倍數(shù)從15.02擴(kuò)大到51.32,即加速效果擴(kuò)大了51.32/15.02≈3.42倍。
表5 各算法加速效果
矩陣規(guī)模加速?倍數(shù)FFT?規(guī)模加速?倍數(shù)SVM樣?本規(guī)模加速?倍數(shù)SVM測(cè)試?規(guī)模加速?倍數(shù)
500×5000.591024×81.3330003.51200015.02
800×8001.281024×324.0950005.60400021.00
1000×10001.581024×12811.7880009.20600027.01
3000×30005.161024×51235.361000012.01800035.01
5000×500022.391024×102446.883000016.051000051.32
#p#page_title#e#
從這里可以看出,矩陣計(jì)算和FFT計(jì)算加速效果非常明顯,而SVM訓(xùn)練計(jì)算和預(yù)測(cè)計(jì)算效果略差。產(chǎn)生該現(xiàn)象的原因是矩陣乘法和FFT算法相對(duì)簡(jiǎn)單,沒有復(fù)雜的控制;而SVM訓(xùn)練算法和預(yù)測(cè)算法比較復(fù)雜,尤其是SVM訓(xùn)練算法有很多分支控制,而且GPU在分支控制等指令方面能力遠(yuǎn)不如CPU,大大削弱了GPU的大規(guī)模并行處理能力,導(dǎo)致加速效果變化不明顯。
c)CUDA加速的擴(kuò)展性問題。圖3~6列出了上述算法的時(shí)間對(duì)比曲線圖。
從圖3可以看出,當(dāng)矩陣規(guī)模在1 000×1 000以內(nèi)時(shí),傳統(tǒng)方式和CUDA方式的曲線斜率變化都不大;當(dāng)矩陣規(guī)模從?1 000?×1 000擴(kuò)展到3 000×3 000時(shí),傳統(tǒng)方式曲線斜率變化非常明顯,而CUDA方式曲線斜率仍變化不大;當(dāng)矩陣規(guī)模從3 000×3 000擴(kuò)展到5 000×5 000時(shí),傳統(tǒng)方式曲線斜率急劇增加,而CUDA方式曲線變化仍不明顯。同樣地,從圖4~6中可以看出,隨著計(jì)算規(guī)模的加大,傳統(tǒng)方式曲線斜率的變化都大于CUDA曲線斜率的變化。
曲線斜率的大小,在一定程度上可以反應(yīng)出計(jì)算規(guī)模與計(jì)算時(shí)間的關(guān)系,即在相同的計(jì)算規(guī)模下,曲線斜率越大,說明該計(jì)算方式耗費(fèi)的時(shí)間越多。當(dāng)曲線斜率大到一定程度時(shí),計(jì)算規(guī)模稍微擴(kuò)大,也能導(dǎo)致計(jì)算時(shí)間的急劇增加,這時(shí)計(jì)算規(guī)模與耗費(fèi)時(shí)間的性價(jià)比極低,形成了計(jì)算瓶頸,擴(kuò)展性較差。
根據(jù)上述分析,可以看出傳統(tǒng)方式的擴(kuò)展性不如CUDA方式,傳統(tǒng)方式更容易形成計(jì)算瓶頸。在巖土工程計(jì)算規(guī)模和復(fù)雜度不斷擴(kuò)大的趨勢(shì)下,傳統(tǒng)方式無法應(yīng)對(duì)這一問題,而CUDA方式則更有優(yōu)勢(shì)。
從上面的分析可以看出,CUDA方式加速M(fèi)ATLAB計(jì)算比傳統(tǒng)方式更有優(yōu)勢(shì),可以有效地應(yīng)對(duì)巖土工程計(jì)算規(guī)模日益擴(kuò)大的問題,同時(shí)為了充分發(fā)揮CUDA的加速效果,應(yīng)盡量選擇數(shù)據(jù)計(jì)算規(guī)模較大、沒有復(fù)雜控制的算法才能取得較好的加速效果,而且規(guī)模越大,算法越簡(jiǎn)單,加速效果越理想。
3 結(jié)束語
隨著科學(xué)技術(shù)的不斷提高,巖土工程方向的建設(shè)規(guī)模越來越大,一些相關(guān)計(jì)算工作也越來越復(fù)雜,MATLAB的計(jì)算效率嚴(yán)重影響了科研工作的進(jìn)展。如何加快MATLAB計(jì)算速度,是科研人員研究的一項(xiàng)重要內(nèi)容。為了加速M(fèi)ATLAB計(jì)算速度,本文利用NVIDIA公司開發(fā)的GPU通用計(jì)算框架CUDA,并結(jié)合巖土工程計(jì)算領(lǐng)域中常用的矩陣計(jì)算、快速傅里葉變換、支持向量機(jī)算法進(jìn)行測(cè)試。測(cè)試結(jié)果顯示,這些算法的最好加速效果分別達(dá)到了22.39倍、46.88倍、51.32倍,取得了不錯(cuò)的加速效果,證明了CUDA加速M(fèi)ATLAB計(jì)算模式的有效性以及可行性。本文提出了基于CUDA的加速M(fèi)ATLAB計(jì)算模式,充分利用GPU強(qiáng)大的浮點(diǎn)運(yùn)算功能和并行處理能力,能夠有效地加速M(fèi)ATLAB計(jì)算,該方案的低成本、高效率的優(yōu)勢(shì),可以有效地解決過去MATLAB加速計(jì)算問題。隨著巖土工程研究工作的不斷深入,科研計(jì)算工作的不斷增加,基于CUDA的加速M(fèi)ATLAB計(jì)算模型將會(huì)發(fā)揮越來越重要的作用。
參考文獻(xiàn):
[1]葛修潤(rùn), 豐定祥. 巖體工程中流變問題的有限元分析[J]. 巖土力學(xué), 1980(3): 15-20.
[2]馮夏庭, 刁心宏. 智能巖石力學(xué)(1)——導(dǎo)論[J]. 巖石力學(xué)與工程學(xué)報(bào), 1999,18(2): 222-226