0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解GPU硬件與CUDA開發(fā)工具

sanyue7758 ? 來源:UDA 編程 ? 2024-03-21 10:15 ? 次閱讀

GPU 硬件簡介

從十多年前起,GPU 的浮點(diǎn)數(shù)運(yùn)算峰值就比同時(shí)期的 CPU 高一個(gè)量級;GPU 的內(nèi)存帶寬峰值也比同時(shí)期的 CPU 高一個(gè)量級。

CPU 和 GPU 的顯著區(qū)別是:一個(gè)典型的 CPU 擁有少數(shù)幾個(gè)快速的計(jì)算核心,而一個(gè)典型的 GPU 擁有幾百到幾千個(gè)不那么快速的計(jì)算核心。CPU 中有更多的晶體管用于數(shù)據(jù)緩存和流程控制,但 GPU 中有更多的晶體管用于算術(shù)邏輯單元。

所以,GPU 是靠眾多的計(jì)算核心來獲得相對較高的計(jì)算性能的。圖 1.1 形象地說明了(非集成) GPU 和 CPU 在硬件架構(gòu)上的顯著區(qū)別。

GPU 計(jì)算不是指單獨(dú)的 GPU 計(jì)算,而是指 CPU + GPU 的異構(gòu)(heterogeneous)計(jì)算。

一塊單獨(dú)的 GPU 是無法獨(dú)立地完成所有計(jì)算任務(wù)的,它必須在 CPU 的調(diào)度下才能完成特定任務(wù)。在由 CPU 和 GPU 構(gòu)成的異構(gòu)計(jì)算平臺中,通常將起控制作用的 CPU 稱為主機(jī)(host),將起加速作用的 GPU 稱為設(shè)備(device)。主機(jī)和(非集成)設(shè)備都有自己的 DRAM(dynamic random-access memory,動態(tài)隨機(jī)存取內(nèi)存),它們之間一般由 PCIe 總線(peripheral component interconnect express bus)連接,如圖 1.1 所示。

ca8c873c-dd5d-11ee-a297-92fbcf53809c.png

本書中說的 GPU 都是指英偉達(dá)(Nvidia)公司推出的 GPU,因?yàn)?CUDA 編程目前只支持該公司的 GPU。以下幾個(gè)系列的 GPU 都支持 CUDA 編程:

? Tesla 系列:其中的內(nèi)存為糾錯(cuò)內(nèi)存(error-correcting code memory,ECC 內(nèi)存),穩(wěn)定性好,主要用于高性能、高強(qiáng)度的科學(xué)計(jì)算。

? Quadro 系列:支持高速 OpenGL 渲染,主要用于專業(yè)繪圖設(shè)計(jì)。

? GeForce 系列:主要用于游戲與娛樂,但也常用于科學(xué)計(jì)算。GeForce 系列的 GPU 沒有糾錯(cuò)內(nèi)存,用于科學(xué)計(jì)算時(shí)具有一定的風(fēng)險(xiǎn)。然而,GeForce 系列的 GPU 價(jià)格相對低廉、性價(jià)比高,用于學(xué)習(xí) CUDA 編程是沒有任何問題的。即使是便攜式計(jì)算機(jī)中 GeForce 系列的 GPU 也可以用來學(xué)習(xí) CUDA 編程。

? Jetson 系列:嵌入式設(shè)備中的 GPU。作者對此無使用經(jīng)驗(yàn),本書也不專門討論。

ca9bff28-dd5d-11ee-a297-92fbcf53809c.png

每一款 GPU 都有一個(gè)用以表示其“計(jì)算能力”(compute capability)的版本號。該版本號可以寫為形如 X.Y 的形式。其中,X 表示主版本號,Y 表示次版本號。版本號決定了 GPU 硬件所支持的功能,可為應(yīng)用程序在運(yùn)行時(shí)判斷硬件特征提供依據(jù)。

初學(xué)者往往誤以為 GPU 的計(jì)算能力越高,性能就越高,但后面我們會看到,計(jì)算能力和性能沒有簡單的正比關(guān)系

ca9ff93e-dd5d-11ee-a297-92fbcf53809c.png

CUDA 程序開發(fā)工具

CUDA 編程語言最初主要是基于 C 語言的,但目前越來越多地支持 C++ 語言。還有基于 Fortran 的 CUDA Fortran 版本及由其他編程語言包裝的 CUDA 版本,但本書只涉及基于 C++ 的 CUDA 編程。我們稱基于 C++ 的 CUDA 編程語言為 CUDA C++。

對 Fortran 版本感興趣的讀者可以參考網(wǎng)站 https://www.pgroup.com/。用戶可以免費(fèi)下載支持 CUDAFortran 編程的 PGI 開發(fā)工具套裝的社區(qū)版本(Community Edition)。對應(yīng)的還有收費(fèi)的專業(yè)版本(Professional Edition)。PGI 是高性能計(jì)算編譯器公司 Portland Group, Inc. 的簡稱,已被英偉達(dá)公司收購。

CUDA 提供了兩層 API(Application Programming Interface,應(yīng)用程序編程接口)給程序員使用,即 CUDA 驅(qū)動(driver)API 和 CUDA 運(yùn)行時(shí)(runtime)API。

其中,CUDA 驅(qū)動 API 是更加底層的 API,它為程序員提供了更為靈活的編程接口;

CUDA 運(yùn)行時(shí) API 是在 CUDA 驅(qū)動 API 的基礎(chǔ)上構(gòu)建的一個(gè)更為高級的 API,更容易使用。

這兩種 API 在性能上幾乎沒有差別。從程序的可讀性來看,使用 CUDA 運(yùn)行時(shí) API 是更好的選擇。在其他編程語言中使用 CUDA 的時(shí)候,驅(qū)動 API 很多時(shí)候是必需的。因?yàn)樽髡邲]有使用驅(qū)動 API 的經(jīng)驗(yàn),故本書只涉及 CUDA 運(yùn)行時(shí) API

caa5e7f4-dd5d-11ee-a297-92fbcf53809c.png

圖 1.2 展示了 CUDA 開發(fā)環(huán)境的主要組件。開發(fā)的應(yīng)用程序是以主機(jī)(CPU)為出發(fā)點(diǎn)的。

應(yīng)用程序可以調(diào)用 CUDA 運(yùn)行時(shí) API、CUDA 驅(qū)動 API 及一些已有的 CUDA 庫。所有這些調(diào)用都將利用設(shè)備(GPU)的硬件資源。

對 CUDA 運(yùn)行時(shí) API 的介紹是本書大部分章節(jié)的重點(diǎn)內(nèi)容;第 14 章將介紹若干常用的 CUDA 庫。

CUDA 版本也由形如 X.Y 的兩個(gè)數(shù)字表示,但它并不等同于 GPU 的計(jì)算能力。

可以這樣理解:CUDA 版本是 GPU 軟件開發(fā)平臺的版本,而計(jì)算能力對應(yīng)著 GPU 硬件架構(gòu)的版本。

CUDA 開發(fā)環(huán)境搭建示例

我們說過,GPU 計(jì)算實(shí)際上是 CPU+GPU(主機(jī) + 設(shè)備)的異構(gòu)計(jì)算。在 CUDA C++ 程序中,既有運(yùn)行于主機(jī)的代碼,也有運(yùn)行于設(shè)備的代碼。

其中,運(yùn)行于主機(jī)的代碼需要由主機(jī)的 C++ 編譯器編譯和鏈接。

所以,除了安裝 CUDA 工具箱,還需要安裝一個(gè)主機(jī)的 C++ 編譯器。在 Windows 中,最常用的 C++ 編譯器是 Microsoft Visual C++ (MSVC),它目前集成在 Visual Studio 中,所以我們首先安裝 Visual Studio

作者安裝了最高版本的 Visual Studio 2019 16.x。因?yàn)檫@是個(gè)人使用的,故選擇了免費(fèi)的 Community 版本。下載地址為https://visualstudio.microsoft.com/free-developer-offers/。對于 CUDA C++ 程序開發(fā)來說,只需要選擇安裝 Desktop development with C++ 即可。當(dāng)然,讀者也可以選擇安裝更多的組件。

caa9694c-dd5d-11ee-a297-92fbcf53809c.png

關(guān)于 CUDA,作者選擇安裝 2019 年 8 月發(fā)布的 CUDA Toolkit 10.1 update2。首先,進(jìn)入網(wǎng)址 https://developer.nvidia.com/cuda-10.1-download-archive-update2。

然后根據(jù)提示,做如下選擇:Operating System 項(xiàng)選擇 Windows;Architecture 項(xiàng)選擇 x86_64;Version 項(xiàng)選擇操作系統(tǒng)版本,我們這里是 10;Installer Type 項(xiàng)可以選擇 exe (network) 或者 exe (local),分別代表一邊下載一邊安裝和下載完畢后安裝。

接著,運(yùn)行安裝程序,根據(jù)提示一步一步安裝即可。該版本的 CUDA 工具箱包含一個(gè)對應(yīng)版本的 Nvidia driver,故不需要再單獨(dú)安裝 Nvidia driver。

安裝好 Visual Studio 和 CUDA 后,進(jìn)入到如下目錄(讀者如果找不到 C 盤下的 ProgramData 目錄,可能是因?yàn)闆]有選擇顯示一些隱藏的文件):

C:ProgramDataNVIDIA CorporationCUDA Samplesv10.11_UtilitiesdeviceQuery

然后,用 Visual Studio 2019 打開文件 deviceQuery_vs2019.sln。接下來,編譯(構(gòu)建)、運(yùn)行。若輸出內(nèi)容的最后部分為 Result = PASS,則說明已經(jīng)搭建好 Windows 中的 CUDA 開發(fā)環(huán)境。若有疑問,請參閱 Nvidia 的官方文檔:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows。

在上面的測試中,我們是直接用 Visual Studio 打開一個(gè)已有的解決方案(solution),然后直接構(gòu)建并運(yùn)行。本書不介紹 Visual Studio 的使用,而是選擇用命令行解釋器編譯與運(yùn)行程序。

這里的命令行解釋器指的是 Linux 中的 terminal 或者 Windows 中的 command prompt 程序。

在 Windows 中使用 MSVC 作為 C++ 程序的編譯器時(shí),需要單獨(dú)設(shè)置相應(yīng)的環(huán)境變量,或者從 Windows 的開始(start)菜單中找到 Visual Studio 2019 文件夾,然后單擊其中的“x64 Native Tools Command Prompt for VS 2019”,而從打開一個(gè)加載了 MSVC 環(huán)境變量的命令行解釋器。

在本書的某些章節(jié),需要有管理員的權(quán)限來使用 nvprof 性能分析器。此時(shí),可以右擊“x64 Native Tools Command Prompt for VS 2019”,然后選擇“更多”,接著選擇“以管理員身份運(yùn)行”。

用命令行解釋器編譯與運(yùn)行 CUDA 程序的方式在 Windows 和 Linux 系統(tǒng)幾乎沒有區(qū)別,但為了簡潔起見,本書后面主要以 Linux 開發(fā)環(huán)境為例進(jìn)行講解。雖然如此,Windows 和 Linux 中的 CUDA 編程功能還是稍有差別。我們將在后續(xù)章節(jié)中適當(dāng)?shù)牡胤街赋鲞@些差別。

用 nvidia-smi 檢查與設(shè)置設(shè)備

caafe574-dd5d-11ee-a297-92fbcf53809c.png

可以通過 nvidia-smi(Nvidia’s system management interface)程序檢查與設(shè)置設(shè)備。

它包含在 CUDA 開發(fā)工具套裝內(nèi)。該程序最基本的用法就是在命令行解釋器中使用不帶任何參數(shù)的命令 nvidia-smi。

在作者的計(jì)算機(jī)中使用該命令,得到如下文本形式的輸出:

從中可以看出一些比較有用的信息

? 第一行可以看到 Nvidia driver 的版本及 CUDA 工具箱的版本。

? 作者所用計(jì)算機(jī)中有一型號為 GeForce RTX 2070 的 GPU。該 GPU 的設(shè)備號是 0。該計(jì)算機(jī)僅有一個(gè) GPU。如果有多個(gè) GPU,會將各個(gè) GPU 從 0 開始編號。如果讀者的系統(tǒng)中有多個(gè) GPU,而且只需要使用某個(gè)特定的 GPU(比如兩個(gè)之中更強(qiáng)大的那個(gè)),則可以通過設(shè)置環(huán)境變量 CUDA_VISIBLE_DEVICES 的值在運(yùn)行 CUDA 程序之前選定一個(gè) GPU。假如讀者的系統(tǒng)中有編號為 0 和 1 的兩個(gè) GPU,而讀者想在 1 號 GPU 運(yùn)行 CUDA 程序,則可以用如下命令設(shè)置環(huán)境變量:

$ export CUDA_VISIBLE_DEVICES=1

這樣設(shè)置的環(huán)境變量在當(dāng)前 shell session 及其子進(jìn)程中有效

? 該 GPU 處于 WDDM(windows display driver model )模式。另一個(gè)可能的模式是 TCC(tesla compute cluster),但它僅在 Tesla、Quadro 和 Titan 系列的 GPU 中可選??捎萌缦路绞竭x擇(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):

sudo nvidia-smi -g GPU_ID -dm 1 # 設(shè)置為 TCC 模式

這里,GPU_ID 是 GPU 的編號。

? 該 GPU 當(dāng)前的溫度為 38 攝氏度。GPU 在滿負(fù)荷運(yùn)行時(shí),溫度會高一些。

? 這是 GeForce 系列的 GPU,沒有 ECC 內(nèi)存,故 Uncorr. ECC 為 N/A,代表不適用(not applicable)或者不存在(not available)。

? Compute M. 指計(jì)算模式(compute mode)。該 GPU 的計(jì)算模式是 Default。在默認(rèn)模式中,同一個(gè) GPU 中允許存在多個(gè)計(jì)算進(jìn)程,但每個(gè)計(jì)算進(jìn)程對應(yīng)程序的運(yùn)行速度一般來說會降低。還有一種模式為 E. Process,指的是獨(dú)占進(jìn)程模式(exclusive processmode),但不適用于處于 WDDM 模式的 GPU。在獨(dú)占進(jìn)程模式下,只能運(yùn)行一個(gè)計(jì)算進(jìn)程獨(dú)占該 GPU??梢杂萌缦旅钤O(shè)置計(jì)算模式(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):

sudo nvidia-smi -i GPU_ID -c 1 # 獨(dú)占進(jìn)程模式

這里,-i GPU_ID 的意思是希望該設(shè)置僅僅作用于編號為 GPU_ID 的 GPU;如果去掉該選項(xiàng),該設(shè)置將會作用于系統(tǒng)中所有的 GPU。

關(guān)于 nvidia-smi 程序更多的介紹,請參考如下官方文檔:https://developer.nvidia.com/nvidia-system-management-interface。

CUDA 的官方手冊

任何關(guān)于 CUDA 編程的書籍都不可能替代官方提供的手冊等資料。以下是幾個(gè)重要的官方文檔,請讀者在有一定的基礎(chǔ)之后務(wù)必查閱。限于作者水平,本書難免存在謬誤。當(dāng)讀者覺得本書中的個(gè)別論斷與官方資料有沖突時(shí),當(dāng)以官方資料為標(biāo)準(zhǔn)(官方手冊的網(wǎng)址為 https://docs.nvidia.com/cuda)。在這個(gè)網(wǎng)站,包括但不限于以下幾個(gè)方面的文檔:

? 安裝指南(installation guides)。讀者遇到與 CUDA 安裝有關(guān)的問題時(shí),應(yīng)該仔細(xì)閱讀此處的文檔。

? 編程指南(programming guides)。該部分有很多重要的文檔:– 最重要的文檔是《CUDA C++ Programming Guide》,見以下網(wǎng)址:https://docs.nvidia.com/cuda/cuda-c-programming-guide。– 另一個(gè)值得一看的文檔是《CUDA C++ Best Practices Guide》,見以下網(wǎng)址:https://docs.nvidia.com/cuda/cuda-c-best-practices-guide。– 針對最近的幾個(gè) GPU 架構(gòu)進(jìn)行優(yōu)化的指南,包括以下網(wǎng)址:

https://docs.nvidia.com/cuda/kepler-tuning-guide。

https://docs.nvidia.com/cuda/maxwell-tuning-guide。

https://docs.nvidia.com/cuda/pascal-tuning-guide。

https://docs.nvidia.com/cuda/volta-tuning-guide。

https://docs.nvidia.com/cuda/turing-tuning-guide。

這幾個(gè)簡短的文檔可以幫助有經(jīng)驗(yàn)的用戶迅速了解一個(gè)新的架構(gòu)。

? CUDA API 手冊(CUDA API references)。這里有:– CUDA 運(yùn) 行 時(shí) API 的 手 冊:https://docs.nvidia.com/cuda/cuda-runtime-api。– CUDA 驅(qū)動 API 的手冊:https://docs.nvidia.com/cuda/cuda-driver-api。– CUDA 數(shù) 學(xué) 函 數(shù) 庫 API 的 手 冊:https://docs.nvidia.com/cuda/cuda-math-api– 其他若干 CUDA 庫的手冊。

為明確起見,在撰寫本書時(shí),作者參考的是與 CUDA 10.2 對應(yīng)的官方手冊。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4740

    瀏覽量

    128951
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136841
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1945

    瀏覽量

    34740
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    13628

原文標(biāo)題:一文講清楚GPU 硬件與 CUDA 程序開發(fā)工具

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用開發(fā)工具和套件設(shè)計(jì)RF通信設(shè)備的開發(fā)系統(tǒng)

    為了滿足當(dāng)前的產(chǎn)品上市時(shí)間限制,設(shè)計(jì)工程師需要更高級別的構(gòu)建模塊和全面的開發(fā)工具。所選的固件和硬件需要集成,測試,監(jiān)控,表征,認(rèn)證和批準(zhǔn)。硬件和軟件工程師需要協(xié)同工作,而開發(fā)工具通常是
    的頭像 發(fā)表于 03-05 08:19 ?4717次閱讀

    英飛凌MCU開發(fā)工具軟件安裝詳解

    電路設(shè)計(jì):電子工程師【心頭好】—英飛凌MCU硬件電路設(shè)計(jì)收藏http://www.infineonic.org/bbs/article_1166_376111.html英飛凌MCU開發(fā)工具軟件安裝詳解.pdf (3.21 MB
    發(fā)表于 12-14 09:38

    款用于通信硬件開發(fā)工具

    款用于通信硬件開發(fā)工具
    發(fā)表于 10-22 10:19

    嵌入式軟件開發(fā)工具

    翻譯自這篇博不同物理設(shè)備之間的數(shù)字轉(zhuǎn)換可以說是隨處可見,讓其智能又強(qiáng)大。驅(qū)動設(shè)備的引擎是嵌入式軟件,它是快速發(fā)展的IoT生態(tài)系統(tǒng)中不可或缺的部分。本篇博客主要談嵌入式軟件開發(fā)工具。解釋
    發(fā)表于 10-28 08:21

    GPU高性能運(yùn)算之CUDA

      全面介紹使用CUDA進(jìn)行通用計(jì)算所需   要的語法、硬件架構(gòu)、程序優(yōu)化技巧等知識,是進(jìn)行GPU通用計(jì)算程序開發(fā)的入門教材和參考書。   本書共分5章。第1章
    發(fā)表于 08-16 16:21 ?0次下載

    SoPC應(yīng)用設(shè)計(jì)的PLD開發(fā)工具要求詳解

    電子發(fā)燒友網(wǎng)核心提示:對SoPC的開發(fā)而言,PLD工具是必不可少的。PLD開發(fā)工具必須進(jìn)步發(fā)展,從而與技術(shù)進(jìn)步和EDA產(chǎn)業(yè)的發(fā)展相適應(yīng)。器件的復(fù)雜度在不斷地增加,設(shè)計(jì)方法也必須在
    發(fā)表于 11-30 09:41 ?1794次閱讀

    STM32 VR開發(fā)工具

    STM32 VR開發(fā)工具
    發(fā)表于 02-17 13:38 ?39次下載

    ARM開發(fā)工具解讀

    、評估板、JTAG仿真器和在線仿真器等,目前世界上大約有四十多家公司提供以上不同種類的開發(fā)產(chǎn)品。 Realview系列開發(fā)工具的英文全稱為Realview Developer Suite,是ARM公司(www.arm.com)為方便用戶在ARM芯片上進(jìn)行應(yīng)用軟件
    發(fā)表于 10-18 13:29 ?3次下載
    ARM<b class='flag-5'>開發(fā)工具</b>解讀

    6個(gè)高效的前端開發(fā)工具

    高效的前端開發(fā)工具有哪些?在互聯(lián)網(wǎng)中許多開發(fā)工具可以讓前端開發(fā)人員的工作生活變得更加輕松。應(yīng)用程序的功能越來越豐富,也導(dǎo)致了前端開發(fā)的復(fù)雜度大幅增加,急需好的
    的頭像 發(fā)表于 01-05 16:00 ?4564次閱讀

    JavaScript開發(fā)工具有哪些?

    Web設(shè)計(jì)開發(fā)逐漸成為計(jì)算機(jī)編程重要部分之,在這篇將分享八個(gè)最好用的JavaScript開發(fā)工具及代碼編譯器,希望對網(wǎng)頁設(shè)計(jì)師和開發(fā)人員
    的頭像 發(fā)表于 07-27 16:06 ?5721次閱讀

    硬件開發(fā)工具介紹

    MaskROM IC 制作了相關(guān)的硬件開發(fā)工具,包括 FDB 演示板、OTP 和相關(guān)燒錄器、Romter、ICE 等不 同的硬件工具,結(jié)合相關(guān)的軟件
    發(fā)表于 06-14 15:14 ?4次下載
    <b class='flag-5'>硬件</b><b class='flag-5'>開發(fā)工具</b>介紹

    NVIDIA CUDA工具包的概念及主要功能

    NVIDIA CUDA 工具包提供了開發(fā)環(huán)境,可供開發(fā)、優(yōu)化和部署經(jīng) GPU 加速的高性能應(yīng)用。
    的頭像 發(fā)表于 06-10 12:03 ?3519次閱讀

    國產(chǎn)GPU繞不開的CUDA生態(tài)

    CUDA(Compute Unified Device Architecture,統(tǒng)計(jì)算架構(gòu))是由英偉達(dá)所推出的種集成技術(shù),是該公司對于GPGPU的正式名稱。通過這個(gè)技術(shù),用戶可利用NVIDIA的
    的頭像 發(fā)表于 11-29 09:36 ?3811次閱讀

    嵌入式硬件的軟件開發(fā)工具趨勢

    嵌入式硬件的軟件開發(fā)工具趨勢
    的頭像 發(fā)表于 12-28 09:51 ?1061次閱讀

    開發(fā)板和開發(fā)工具指南

    與使用開發(fā)環(huán)境相比,許多工程師更傾向于將調(diào)試點(diǎn)嵌入其代碼并使用測試設(shè)備來驗(yàn)證其硬件。歐時(shí)電子指南將詳述開發(fā)板和開發(fā)工具的優(yōu)勢,并提供關(guān)于使用和選擇恰當(dāng)
    的頭像 發(fā)表于 10-26 14:35 ?613次閱讀