❶ 學習編程有必要做筆記嗎
我感覺用不著寫筆記, 如果真的想記錄一些做仿自己遇到的問題, 不如在csdn或者其他地方開個博客, 這樣也便於保存, 每天基胡戚可以把學習心得寫到博客里。 見證自己的成長。搏陵
最最重要的, 學習編程要多實踐, 學到的每個例子最好都能自己領會,然後不看教程上機編一變, 提高會很快
❷ cuda編程筆記(一):首次嘗試
在深入了解GPU底層前,建議直接嘗試一個編程小例子,學習正反饋更強。一個典型的CUDA程序實現流程如下:
首先,內存管理是關鍵,使用`cudaMalloc`函數類似C語言的`malloc`,還有其他內存管理函數如`cudaMemcpy`。`cudaMemcpy`是同步執行的,這意味著CPU會等待內存復制操作完成後再繼續執行,這通常會占據大量時間,耗時的不是計算,而是內存拷貝。了解`cudaMemcpy`的`kind`參數,用於確定復制的方向,一般有幾種選項。
此外,函數的返回值是`cudaError_t`枚舉類型,成功時返回`cudaSuccess`,失敗時返回其他錯誤代碼,可以使用`cudaGetErrorString`將錯誤代碼轉換為可讀的錯誤消息。
在GPU中,內存可以分為全局內存和共享內存。全局內存類似於CPU的系統內存,共享內存則類似CPU的緩存。GPU的共享內存可以被編程直接控制,而CPU的緩存則不可以。這兩者的具體區別將在後續的文章中詳細介紹。
線程管理在GPU中非常重要,GPU用於管理大量線程。首先,了解線程由進程產生,一個GPU進程由CPU創建,這代表了一個核函數kernel的執行。在GPU上,可以同時運行多個GPU進程或核函數。
軟體層面的層次化管理包括線程網格Grid、線程塊Block、線程thread。網格和塊都是三維的組織結構。在定義核函數時,需要使用`__global__`修飾符。CUDA提供了三種限定符,用於控制核函數的執行方式。
調用核函數時,使用`<< >>>`配置運算符傳遞核函數的執行參數,包括網格形狀、塊形狀、共享內存大小和執行流。其中網格和塊都是`dim3`類型,表示三個維度,可以通過其x、y、z欄位獲取。
理解`threadIdx`和`blockIdx`在核函數中的作用是至關重要的。`threadIdx`和`blockIdx`是核函數中需要預初始化的內置變數,用於線程索引的建立和數組索引的獲取。在核函數中,線程通常會執行數組操作,如數組加法。
核函數預初始化了兩個內置變數:`blockDim`和`gridDim`,分別表示線程塊的維度范圍和線程格的維度范圍。當有多個GPU設備時,根據`multiProcessorCount`來選擇最優的GPU設備。
在實現數組加法的CUDA代碼中,確保數據從CPU內存復制到GPU內存,執行核函數進行操作,並將結果從GPU內存復制回CPU內存。理解代碼流程是至關重要的。
最後,核函數是非同步執行的,可以通過`cudaDeviceSynchronize()`方法顯示同步。了解如何查詢和管理GPU設備信息,如使用CUDA運行時API函數查詢設備屬性和數量,以便在運行時優化設備配置。
❸ 學習編程|Spring源碼深度解析 讀書筆記 第4章:bean的載入
在Spring框架中,bean的載入過程是一個精細且有序的過程。首先,當需要載入bean時,Spring會嘗試通過轉換beanName來識別目標對象,可能涉及到別名或FactoryBean的識別。
載入過程分為幾步:從緩存查找單例,Spring容器內單例只創建一次,若緩存中無數據,會嘗試從singletonFactories尋找。接著是bean的實例化,從緩存獲取原始狀態後,可能需要進一步處理以符合預期狀態。
原型模式的依賴檢查是單例模式特有的,用來避免循環依賴問題。然後,如果緩存中無數據,會檢查parentBeanFactory,遞歸載入配置。BeanDefinition會被轉換為RootBeanDefinition,合並父類屬性,確保依賴的正確初始化。
Spring根據不同的scope策略創建bean,如singleton、prototype等。類型轉換是後續步驟,可能將返回的bean轉換為所需的類型。FactoryBean的使用提供了靈活的實例化邏輯,用戶自定義創建bean的過程。
當bean為FactoryBean時,getBean()方法代理了FactoryBean的getObject(),允許通過不同的方式配置bean。緩存中獲取單例時,會執行循環依賴檢測和性能優化。最後,通過ObjectFactory實例singletonFactory定義bean的完整載入邏輯,包括回調方法用於處理單例創建前後的狀態。