CUDA專項

1、講講shared memory bank conflict的發生場景?以及你能想到哪些解決方案?

CUDA中的共享內存(Shared Memory)是GPU上的一種快速內存,通常用于在CUDA線程(Thread)之間共享數據。然而,當多個線程同時訪問共享內存的不同位置時,可能會遇到bank conflict(銀行沖突)的問題,這會導致性能下降。

Bank Conflict的發生場景

CUDA的共享內存被組織成多個bank,每個bank都可以獨立地進行讀寫操作。然而,當多個線程訪問同一個bank的不同地址時,這些訪問會被串行化,導致性能下降。具體來說,bank conflict的發生場景如下:

  1. 同一warp中的線程訪問同一個bank的不同地址:在CUDA中,線程被組織成warp(線程束),一個warp包含32個線程。如果這32個線程中的某些線程訪問同一個bank的不同地址,就會發生bank conflict。
  2. 不規則的訪問模式:如果線程訪問共享內存的模式是不規則的,即線程訪問的地址沒有一定的規律,那么bank conflict的發生概率就會增加。

解決方案

  1. 合理的內存分配:通過合理的內存分配策略,將不同數據分配到不同的banks中,從而減少bank conflict的可能性。例如,可以使用CUDA提供的內存對齊工具來確保數據按照bank的大小進行對齊。
  2. 內存訪問模式優化:通過優化線程的訪存順序和數據分布,使得不同線程訪問的bank地址不重疊,從而避免bank conflict。例如,可以使用循環展開(Loop Unrolling)等技術來減少線程之間的內存訪問沖突。
  3. 使用更多的共享內存:如果可能的話,可以增加共享內存的大小,從而減少每個bank的訪問壓力。但是需要注意的是,共享內存的大小是有限的,因此需要權衡性能和內存使用之間的平衡。
  4. 使用其他內存層次結構:除了共享內存之外,CUDA還提供了其他內存層次結構,如全局內存、常量內存和紋理內存等。在某些情況下,可以使用這些內存層次結構來替代共享內存,從而避免bank conflict的問題。
  5. 使用CUDA提供的內置函數:CUDA提供了一些內置函數來幫助程序員管理共享內存和避免bank conflict。例如,__shfl_sync函數可以用于在warp內部進行數據的交換和廣播,從而避免不必要的共享內存訪問。
  6. 使用原子操作:如果必須讓多個線程同時訪問和修改同一個地址的數據,可以使用原子操作(Atomic Operations)來確保數據的一致性。但是需要注意的是,原子操作會引入額外的開銷,并且可能會降低性能。

綜上所述,避免CUDA共享內存bank conflict的關鍵在于合理的內存分配、內存訪問模式優化以及使用CUDA提供的內置函數和工具。

2、CUDA里面如何分配GPU顯存?為什么里面的參數是二級指針?

在CUDA中,GPU顯存的分配主要通過使用特定的函數和內存管理策略來實現。以下是關于CUDA中顯存分配的基本信息:

  1. 全局內存分配:全局內存是CUDA中最常用的一種顯存分配方式。所有線程都可以訪問和修改全局內存,它是通過cudaMalloc函數在設備端(即GPU)上進行分配的。由于全局內存的分配是在主機端(即CPU)進行的,因此需要在主機端進行相應的內存管理。

  2. 為什么使用二級指針

    • 在CUDA編程中,當需要向函數(如cudaMalloc)傳遞一個指針的地址,以便該函數可以修改這個指針的值(即分配的內存地址)時,就需要使用二級指針。這是因為一級指針(即普通的指針)在傳遞時只能傳遞指針本身的值(即它所指向的地址),而不能修改這個指針本身。而二級指針(即指向指針的指針)可以傳遞一個指針的地址,從而允許函數修改這個指針的值。
    • cudaMalloc為例,這個函數的目的是在GPU上分配內存,并將分配的內存地址存儲在一個指針中。由于這個操作需要在GPU上進行,而函數的調用是在CPU上進行的,因此需要一個機制來將分配的內存地址從GPU傳遞回CPU。通過使用二級指針,cudaMalloc可以接收一個指向指針的指針(即二級指針),然后將分配的內存地址存儲在這個二級指針所指向的一級指針中。這樣,當cudaMalloc返回時,CPU就可以通過這個一級指針訪問到在GPU上分配的內存了。
  3. 其他顯存分配方式:除了全局內存外,CUDA還支持其他類型的顯存分配方式,包括:

    • 共享內存:一種位于GPU上的高速緩存,訪問速度比全局內存快。它是在每個線程塊(block)中共享的,同一線程塊中的線程可以相互通信和共享數據。
    • 常量內存:一種只讀的內存,適用于在整個計算過程中不會被修改的數據。
    • 紋理內存:一種特殊的內存,適用于對內存訪問具有空間局部性的計算。
    • 局部內存:一種在每個線程中私有的內存,用于存儲線程私有的臨時變量。

這些不同類型的內存具有不同的訪問權限、生命周期和用途,可以根據具體的應用場景和需求來選擇合適的內存類型。

3、優化CUDA程序的訪存效率,你可以想到哪些?

化CUDA程序的訪存效率是一個復雜而重要的任務,以下是一些建議的策略和方法:

  1. 優化內存訪問

    • 重新組織數據布局:使數據訪問更符合GPU的內存訪問機制,減少內存訪問延遲。
    • 合并內存訪問:通過合并多個內存訪問請求,減少訪問次數,提高內存訪問效率。
    • 利用緩存:通過合理的數據訪問模式,盡可能利用GPU的L1和L2緩存,減少全局內存的訪問。
  2. 減少線程同步開銷

    • 優化算法設計,減少線程同步的次數,以提高GPU的并行計算效率。
    • 使用原子操作(atomic operations)時,要謹慎,因為它們可能會引入額外的同步開銷。
  3. 合理使用寄存器

    • 合理使用GPU的寄存器來存儲臨時數據,以減少數據傳輸延遲和內存訪問開銷。
    • 避免過多的寄存器溢出,這會導致額外的內存訪問和性能下降。
  4. 使用Pinned Memory

    • Pinned Memory(頁鎖定存儲器)可以更快地在主機和設備之間傳輸數據。通過cudaHostAlloc函數分配Pinned Memory,并使用cudaHostRegister函數將已分配的變量轉換為Pinned Memory。Pinned Memory允許實現主機和設備之間數據的異步傳輸,從而提高程序的整體性能。
  5. 全局內存訪存優化

    • 分析數據流路徑,確定是否使用了L1緩存,并據此確定當前內存訪問的最小粒度(如32 Bytes或128 Bytes)。
    • 分析原始數據存儲的結構,結合訪存粒度,確保數據訪問的內存對齊和合并訪問。
    • 使用Nvprof或Nsight等工具來分析和優化全局內存的訪問效率。
  6. 選擇合適的CUDA版本和編譯器選項

    • 根據GPU的型號和CUDA版本,選擇最適合的編譯器選項和內存訪問模式。
    • 關注CUDA的更新和改進,以利用新的功能和優化。
  7. 算法和代碼優化

    • 優化算法和數據結構,減少不必要的計算和內存訪問。
    • 使用循環展開(loop unrolling)和向量化(vectorization)等技術來提高代碼的執行效率。
    • 避免在內核函數中使用復雜的條件語句和循環,以減少分支預測錯誤和同步開銷。
  8. 內存管理優化

    • 使用內存池(memory pooling)技術來管理GPU內存,減少內存分配和釋放的開銷。
    • 在必要時,使用零拷貝(zero-copy)技術來避免不必要的數據傳輸。
  9. 性能分析和調試

    • 使用CUDA的性能分析工具(如Nsight和Visual Profiler)來分析和識別性能瓶頸。
    • 根據性能分析結果,針對瓶頸進行針對性的優化。
  10. 注意GPU的硬件特性

    • 了解GPU的硬件特性,如緩存大小、內存帶寬和延遲等,以編寫更高效的CUDA代碼。
    • 根據硬件特性選擇合適的優化策略和方法。

通過綜合應用以上策略和方法,可以有效地提高CUDA程序的訪存效率,從而提升程序的整體性能。

4、優化CUDA程序的計算效率,你又可以想到哪些?

優化CUDA程序的計算效率是一個復雜但重要的任務,以下是一些可以考慮的優化策略:

  1. 優化內存訪問
    • 重新組織數據布局,使得數據訪問更符合GPU的內存訪問機制,以減少內存訪問延遲。
    • 合并多個內存訪問請求,以減少訪問次數,提高內存訪問效率。
    • 盡量減少Host(CPU)和Device(GPU)之間的數據拷貝,通過優化算法和數據結構來減少數據傳輸的開銷。
  2. 合理使用GPU資源
    • 在配置kernel時,分配合理的thread(線程)個數和block(線程塊)個數,以最大化device的使用效率,充分利用硬件資源。
    • 盡可能使用shared memory(共享內存)來存儲需要頻繁訪問的數據,以減少對global memory(全局內存)的訪問次數。
  3. 減少線程同步開銷
    • 優化算法設計,減少線程同步的次數,以提高GPU的并行計算效率。
    • 在同一個warp(線程束)中,盡量減少分支,以減少線程之間的分歧和同步開銷。
  4. 優化算法和數據結構
    • 將串行代碼并行化,特別是針對可以并行化的循環結構,如for循環。
    • 使用更高效的數據結構和算法來減少計算量和內存使用。
  5. 注意數據類型和精度
    • 在可能的情況下,使用更小的數據類型來減少內存使用和傳輸開銷。
    • 注意浮點數的精度問題,避免不必要的精度損失和計算開銷。
  6. 編譯器優化
    • 使用合適的編譯器選項和設置來優化代碼生成和性能。
    • 了解并使用CUDA編譯器提供的性能分析工具來找出性能瓶頸和優化點。
  7. 硬件和驅動優化
    • 確保GPU驅動和硬件是最新的,以獲得最佳的性能和兼容性。
    • 根據具體的應用場景和硬件特性,調整CUDA程序的配置和參數設置。
  8. 使用CUDA提供的內置函數和庫
    • CUDA提供了許多內置函數和庫,如數學函數庫、內存管理庫等,這些函數和庫經過優化,可以提供更高的性能。
  9. 代碼審查和重構
    • 定期進行代碼審查,找出潛在的性能問題和改進點。
    • 對代碼進行重構和優化,以提高代碼的可讀性、可維護性和性能。
  10. 測試和驗證
    • 在不同的硬件和配置下測試CUDA程序的性能,確保優化策略的有效性。
    • 使用驗證數據集來驗證CUDA程序的正確性和準確性。

請注意,優化CUDA程序的計算效率是一個持續的過程,需要不斷地進行實驗和調整。同時,不同的應用場景和硬件環境可能需要不同的優化策略。

1、GPU是如何與CPU協調工作的?
?

GPU與CPU的協調工作主要通過它們之間的接口和通信機制實現。具體而言,以下是它們協同工作的一般流程:

  1. 任務分配:CPU作為計算機系統的主要控制單元,負責將需要處理的任務分配給不同的處理器。當任務涉及大量的圖形、圖像處理或視頻編碼等計算密集型任務時,CPU會將這些任務分配給GPU處理。
  2. 數據傳輸:在任務分配后,CPU需要將相關的數據傳輸給GPU。這通常通過內存總線或專用接口(如PCIe總線)進行。數據傳輸的速度和帶寬對于整個系統的性能至關重要,因為它們決定了GPU能夠多快地獲取所需的數據。
  3. 并行處理:GPU接收到數據后,會利用其大量的核心進行并行處理。GPU的核心數量遠多于CPU,因此能夠同時處理更多的任務和數據。這使得GPU在處理計算密集型任務時具有顯著的優勢。
  4. 結果回傳:當GPU完成處理后,會將結果回傳給CPU。CPU會對這些結果進行處理和整合,以便后續使用或輸出。

在硬件層面,GPU和CPU的協調工作主要通過以下方式實現:

  1. 架構差異:CPU的架構通常是基于馮·諾依曼體系結構的,采用串行的方式執行指令,每個時鐘周期只能執行一條指令。而GPU的架構通常是基于SIMD(單指令多數據流)的,采用并行的方式執行指令,每個時鐘周期可以執行多條指令。這種架構差異使得GPU更適合處理計算密集型任務。
  2. 內存和緩存:GPU擁有獨立的顯存和緩存機制,用于存儲和處理圖形和圖像數據。這些內存和緩存與CPU的內存和緩存是分開的,但可以通過內存總線或專用接口進行通信。在數據處理過程中,CPU和GPU會根據需要相互協作,將數據從主內存傳輸到顯存或緩存中。
  3. 通信接口:CPU和GPU之間的通信主要通過PCIe總線等接口進行。這些接口提供了高速的數據傳輸通道,使得CPU和GPU能夠快速地交換數據和指令。

在編程和開發層面,程序員可以通過特定的編程語言和庫(如CUDA、OpenCL等)來利用GPU進行加速計算。這些庫提供了豐富的API和工具,使得程序員能夠輕松地編寫和調試GPU程序,并將其與CPU程序進行集成和協同工作。

總之,GPU和CPU的協調工作是通過它們之間的接口、通信機制以及編程和開發層面的支持來實現的。這種協同工作使得計算機能夠更高效地處理各種任務和數據,提高了整個系統的性能和效率。

2、GPU也有緩存機制嗎?有幾層?它們的速度差異多少?

GPU也有緩存機制,但通常主流GPU芯片上的緩存層數比CPU少。主流CPU芯片上有四級緩存,而主流GPU芯片最多有兩層緩存。

關于GPU緩存的速度差異,一般來說,離處理器越近的緩存級別速度越快,但容量也越小。例如,L1緩存(一級緩存)的速度最快,但容量最小;L2緩存(二級緩存)的速度稍慢,但容量較大。這種設計是為了在速度和容量之間找到一個平衡,以便在處理數據時能夠快速訪問到所需的數據。

然而,具體的速度差異取決于具體的處理器和緩存設計。不同的GPU型號和制造商可能會使用不同的緩存設計和架構,因此它們之間的速度差異也會有所不同。

總的來說,GPU的緩存機制對于提高處理器的性能和效率非常重要,但具體的緩存層數和速度差異取決于處理器的設計和制造商的選擇。

3、GPU的渲染流程有哪些階段?它們的功能分別是什么?

  1. 頂點處理(Vertex Processing)
    • 功能:此階段主要負責處理輸入的頂點數據,包括三維坐標(x, y, z)和其他頂點屬性(如顏色、法線等)。通過頂點著色器(Vertex Shader)對這些頂點進行變換,將三維頂點坐標映射到二維屏幕坐標上,并計算各頂點的亮度值等。
    • 特點:這個階段是可編程的,允許開發者定義自己的頂點處理邏輯。輸入與輸出一一對應,即一個頂點被處理后仍然是一個頂點,各頂點間的處理相互獨立,可以并行完成。
  2. 圖元生成(Primitive Generation)
    • 功能:根據應用程序定義的頂點拓撲邏輯(如三角形、線段等),將上階段輸出的頂點組織起來形成有序的圖元流。這些圖元記錄了由哪些頂點組成,以及它們在輸出流中的順序。
  3. 圖元處理(Primitive Processing)
    • 功能:此階段進一步處理圖元,通常通過幾何著色器(Geometry Shader)完成。幾何著色器可以創建新的圖元(例如,將點轉換為線,或將線轉換為三角形),也可以丟棄圖元。這個階段也是可編程的,允許開發者定義自己的圖元處理邏輯。
  4. 光柵化(Rasterization)
    • 功能:光柵化階段將圖元轉換為像素(片段),并為每個像素生成一個片元記錄。這些片元記錄包含了像素在屏幕空間中的位置、與視點之間的距離以及通過插值獲得的頂點屬性等信息。
    • 特點:這一階段會對每一個圖元在屏幕空間進行采樣,每個采樣點對應一個片元記錄。
  5. 片元處理(Fragment Processing)
    • 功能:在片元著色器(Fragment Shader)中,對每個片元進行顏色計算和紋理映射等操作。片元著色器會考慮各種因素(如光照、材質等),為每個片元計算出最終的顏色值。
  6. 屏幕映射(Screen Mapping)
    • 功能:此階段將處理后的片元信息映射到屏幕坐標系中,以便最終顯示在屏幕上。
  7. 輸出合并(Output Merging)
    • 功能:在這一階段,將片元著色器輸出的顏色與屏幕上已有的顏色進行合并。這通常包括深度測試(確保物體按正確的順序渲染)、模板測試(用于實現特殊效果,如陰影)和混合(用于實現透明效果)等操作。

需要注意的是,不同的GPU架構和渲染引擎可能會有一些細微的差別,但上述階段和功能是GPU渲染流程中比較通用的部分。

4、Early-Z技術是什么?發生在哪個階段?這個階段還會發生什么?會產生什么問題?如何解決?

5、SIMD和SIMT是什么?它們的好處是什么?co-issue呢?

6、GPU是并行處理的么?若是,硬件層是如何設計和實現的?

7、GPC、TPC、SM是什么?Warp又是什么?它們和Core、Thread之間的關系如何?

8、頂點著色器(VS)和像素著色器(PS)可以是同一處理單元嗎?為什么?

頂點著色器(VS)和像素著色器(PS)不是同一處理單元。盡管它們都是GPU中的可編程著色階段,但它們各自執行不同的任務和具有不同的功能。

  1. 頂點著色器(VS)階段處理輸入匯編程序的頂點,執行每個頂點運算,例如轉換、外觀、變形和每頂點照明。頂點著色器始終在單個輸入頂點上運行并生成單個輸出頂點。它的主要任務是處理圖形的頂點數據,進行坐標變換、光照計算等操作。
  2. 像素著色器(PS)階段則支持豐富的著色技術,如每像素照明和后處理。像素著色器是一個程序,它將常變量、紋理數據、內插的每頂點值和其他數據組合起來以生成每像素輸出。它的主要任務是對每個像素進行顏色計算和渲染,以實現更豐富的視覺效果。

由于頂點著色器和像素著色器在圖形渲染過程中執行的任務不同,因此它們需要不同的處理單元來分別處理。在GPU中,通常會有多個頂點著色器和像素著色器的處理單元,以便能夠并行處理多個頂點和像素的數據,提高渲染效率。

因此,頂點著色器和像素著色器不是同一處理單元,它們在圖形渲染過程中各自扮演著不同的角色,協同工作以實現高效的圖形渲染。

9、像素著色器(PS)的最小處理單位是1像素嗎?為什么?會帶來什么影響?

10、Shader中的if、for等語句會降低渲染效率嗎?為什么?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10464.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BUUCTF[PWN]

BUUCTF[PWN] 題目:warmup_csaw_2016 地址:warmup_csaw_2016ida打開,進main函數:gets函數的棧溢出:給出了sub_40060D函數的地址直接,溢出到sub_40060D的地址即可: from pwn import *p remote…

[Cmake Qt]找不到文件ui_xx.h的問題?有關Qt工程的問題,看這篇文章就行了。

前言 最近在開發一個組件,但是這個東西是以dll的形式發布的界面庫,所以在開發的時候就需要上層調用。 如果你是很懂CMake的話,ui_xx.h的文件目錄在 ${CMAKE_CURRENT_BINARY_DIR} 下 然后除了有關這個ui_xx.h,還有一些別的可以簡…

Verlog-流水燈-FPGA

Verlog-流水燈-FPGA 引言: ? 隨著電子技術的飛速發展,現場可編程門陣列(FPGA)已成為電子設計自動化(EDA)領域中不可或缺的組件。FPGA以其高度的靈活性和可定制性,廣泛應用于通信、圖像處理、工…

go-zero整合asynq實現分布式定時任務

本教程基于go-zero微服務入門教程,項目工程結構同上一個教程。 go-zero微服務入門教程(點擊進入) 本教程主要實現go-zero整合asynq實現分布式定時任務。 本文源碼:https://gitee.com/songfayuan/go-zero-demo (教程源…

外賣點餐單店+多店自由切換小程序源碼系統全功能版 帶完整的安裝代碼包以及搭建部署教程

近年來,外賣市場持續火爆,但許多餐飲商家在接入外賣平臺時面臨著諸多困擾。高昂的平臺費用、復雜的操作流程以及數據安全隱患等問題,讓商家們倍感壓力。為了解決這些問題,小編給大家分享一款集單店與多店管理于一體的外賣點餐系統…

ACM實訓沖刺第四天

【碎碎念】最近的任務有點繁重,所以考慮到實際情況,視頻學習決定放置一段時間,重點是學校的實訓練習題,對于我而言,目標不是優秀/良好,綜合考慮我的實際情況,保佑我及格、順利通過就可&#xff…

通過自建鏡像方式搭建RabbitMQ集群

通過自建鏡像方式搭建RabbitMQ集群 1. 應用準備1.1 應用目錄結構1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 編寫DockerFile2.1 將所有本地文件拷貝到工作目錄2.2 拷貝文件到源目錄&增加執行權限2.3 安裝Erlang & rab…

Leedcode題目:移除鏈表元素

題目: 這個題目就是要我們將我們的鏈表中的值是val的節點刪除。 我們題目提供的接口是 傳入了指向一個鏈表的第一個節點的指針,和我們要刪除的元素的值val,不只要刪除第一個, 思路 我們這里可以創建一個新的鏈表,…

【C++】學習筆記——模板進階

文章目錄 十一、模板進階1. 非類型模板參數2. 按需實例化3. 模板的特化類模板的特化 4. 模板的分離編譯 未完待續 十一、模板進階 1. 非類型模板參數 模板參數分為類型形參和非類型形參 。類型形參即:出現在模板參數列表中,跟在class或者typename之類的…

掌握SEO優化的關鍵:提升網站排名的秘籍(如何提高網站seo排名)

你是否曾經在搜索引擎上搜索過一個關鍵詞,然后點擊了排在前幾位的網站?如果是,那么你已經體會到了SEO(搜索引擎優化)的威力。SEO是一項關鍵的網絡營銷策略,它能夠讓你的網站在搜索引擎中獲得更高的排名&…

Apache ECharts

Apache ECharts介紹: Apache ECharts 是一款基于 Javascript 的數據可視化圖表庫,提供直觀,生動,可交互,可個性化定制的數據可視化圖表。 官網地址:https://echarts.apache.org/zh/index.html Apache ECh…

Stable Diffusion寫真完整教程

前言 最近自己對AI非常癡迷,并且今后也會一直在這個領域深耕,所以就想著先入門,因此花時間研究了一番,還好,出了點小成果,接下來給大家匯報一下。 AI繪畫 提到AI繪畫,大家可能立馬會想到made…

A-loam建圖算法

A-LOAM構建3d點云地圖并實時轉存二維柵格地圖 A-loam算法。源代碼用的是velodyne雷達話題,但是現在用rslidar來處理。所以也會遇到另外一個包來轉換相關的數據。 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.githttps://github.com/HViktorTsoi/r…

重慶市工程技術生態環境專業職稱申報條件

重慶市工程技術生態環境專業職稱申報條件鏈接重慶市人力資源和社會保障局 重慶市生態環境局關于印發重慶市工程技術生態環境專業職稱申報條件的通知_重慶市人力資源和社會保障局類別基本條件業績成果備注工程師具備博士學位;或具備碩士學位或第二學士學位&#xff0…

cin.ignore()函數和stoll函數

cin.ignore()函數 cin.ignore() 是一個非常實用的函數,主要用于控制輸入流 cin 的行為 cin.ignore(int n 1, char delimiter EOF); n:一個整數參數,表示要忽略的字符數量。默認值是1,意味著只忽略下一個字符。delimiter&#x…

Android 屏幕適配全攻略(下)-百變屏幕無壓力,這才是Android屏幕適配的終極解決方案

在上一篇文章中,我們介紹了Android屏幕適配的基本方法,比如使用限定符資源、圖片適配、矢量圖等。 感興趣的朋友,請前往查閱:Android 屏幕適配全攻略(中)-從九宮格到矢量圖,揭秘Android多屏幕適…

模擬集成電路(3)----單級放大器(共源極)

模擬集成電路(3)----單級放大器(共源極) 放大是模擬電路的基本功能 大多數自然模擬信號太小而無法處理需要足夠的信噪比 理想的放大器 線性:無限的幅度和頻率范圍 輸入阻抗無限大 輸出阻抗無限小 共源放大器 共源放大器就是將源極接A…

01面向類的講解

指針指向類成員使用 代碼&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依賴對象 }; void Test::static…

JavaScript 動態網頁實例 —— 事件處理應用

前言 事件處理的應用很廣泛。在事件處理的應用中,鼠標事件的應用是最常用到的。本章給出幾個鼠標事件處理應用的示例,包括:頁面預覽、圖像切換、點亮文本、鼠標跟隨、鼠標感應和禁用鼠標按鍵。在這些示例中,有的可以直接拿來應用,有的則只提供了一種應用的方法,稍加拓展,…

示例十一、聲音傳感器

通過以下幾個示例來具體展開學習,了解聲音傳感器原理及特性&#xff0c;學習聲音傳感器的應用&#xff08;干貨版&#xff09;&#xff1a; 示例十一、聲音傳感器 ino文件源碼&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…