戴鈞彥

@ranvd

Joined on Oct 15, 2020

  • 環境: NAME="Ubuntu" VERSION="20.04.6 LTS (Focal Fossa)" GPU=NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] 步驟 因為每次先裝好 driver 在裝 cuda,driver 就會壞掉,因此經過嘗試過後發現步驟要反過來。或是 driver 壞掉後重新安裝 driver 即可。 刪除 NVIDIA 驅動 安裝 cuda (先)
     Like 1 Bookmark
  • contributed by < ranvd > 「因為自動飲料機延畢的那一年」與課程啟發 閱讀這一系列的文章讓我深受感動,我不僅佩服他們的勇氣,也更加意識到許多事情只有真正去做,才能發現其中的困難。相信即使不是在製造實體物品,也會遇到類似的挑戰。這讓我想起老師曾經說過的一句話,「重造輪子才能夠體會造輪子的困難」。只有通過這個過程,我們才能夠理解並改進現有的問題,同時對過去的成果保持著敬畏。 雖然文中的自動掉冰塊機最終是直接購買現成的,但同時也點出了一個重要的觀念:當一個問題暫時難以解決時,我們應該考慮尋求現成的解答,避免過度浪費時間在同一個問題上。這種方式能夠幫助我們更有效地解決問題,並將有限的時間和資源用於更有意義的事情上,同時也可以透過解析現成解答的方式獲得更多知識。 :::danger 問題呢? :::
     Like  Bookmark
  • contributed by < ranvd > Linux 核心如何找到核心模組 以下內容為 Linux 核心版本 5.15,其他版本的檔案位置與內容可以有些出入 在過去的教材中有提到 LKM 在 Linux kernel 中是透過鍊結串列維護。在 include/linux/module.h 中可以看到 module 結構體,其中可以看到有一項熟悉的結構體 struct list_head,根據註解可以猜測 Linux 核心中的 modules 是透過鍊結串列的方式儲存,同時也使用 enum 型態紀錄目前 module 的狀態。 struct module { ... /* Member of list of modules */
     Like 1 Bookmark
  • contributed by < ranvd > 第三周測驗 1 根據 Digit-by-digit calculation 的方法,一個數字 $Z$ 可以表示為 $(x+y)^2$,假設以 10 為底的話 $Z=(a_n+\cdots+a_0)^2$ 其中 $a_m=10^m$ 或 $0$,同樣的方式可以推廣至以 2 為底。如果將整個公式展開的可以表示成下面公式 $$Z=a_0^2+[2a_0+a_1]a_1+[2(a_0+a_1)+a_2]a_2+\cdots+[2(\sum_{i=0}^{n-1}a_i)+a_n]a_n$$ 接著假設 $P_m=(a_n+\cdots+a_m);;Z=P_0^2$,其中 $a_i$ 代表 $2^i$ 或 $0$,因此可以列出遞迴關係式 $P_m=P_{m+1}+a_m$。在 $m$ 從 $n\to0$ 的迭代過程中判斷 $P_m^2$ 是否大於 $Z$ 即可判斷 $a_m$ 是 0 或 $2^m$。但為了不要每次都重新做平方運算,因此定義 $X_m=Z-P_m^2$,並列出遞迴關係式 $$X_m=X_{m+1}-Y_m$$,其中 $Y_m=P_m^2-P_{m+1}^2=2P_{m+1}a_m+a_m^2$。 又可以將 $Y_m$ 拆解成 $$Y_m=\begin{cases}c_m + d_m & \text{if }a_m=2^m\ 0&\text{if }a_m=0\end{cases}$$ 其中 $c_m=P_{m+1}2^{m+1};d_m=(2^m)^2$,從這裡可以得知,當 $m=-1$ 時,$c_{-1}=P_02^0=P_0$,因此 $c_{-1}$ 為 $\lfloor\sqrt{z}\rfloor$,接著可以推導出 $c_m$ 與 $d_m$ 的遞迴關係式。 $$c_m=\begin{cases}{c_{m+1}\over 2}+d_m&\text{if }a_{m+1}=2^{m+1}\{c_{m+1}\over 2}&\text{if } a_{m+1}=0\end{cases}$$ $$d_m={d_{m+1}\over4}$$ 因此從上面可以看到 $X_{n}=X_{n+1}-Y_{n+1}=X_n-c_{n+1}+d_{n+1}$,其中 $d_{n+1}=4^{n+1}$ 因此在初始化時須將其設為不超過 x 且為 4 的冪的數值。因此才會使用 int d = 1UL << ((31 - __builtin_clz(x)) & ~1UL) 做初始化。由於 $X_{m}\ge0$ 因此可以透過判斷 $X_{m+1}-Y_m$ 來判斷 $a_{m+1}=2^{m+1}\text{ or } 0$,並根據上述的公式來更新數值。
     Like  Bookmark
  • contributed by < ranvd > Reviewed by Shawn531 開發紀錄中可以加入 commit 連結以便追蹤。 善用 diff Reviewed by ShawnXuanc 可以減少完整程式碼的張貼 程式碼有善用 list 巨集以及將重複的程式碼再利用
     Like  Bookmark
  • contributed by < ranvd > 第一周測驗 1 測驗一中的 quicksort 採用 begin 和 end 兩個堆疊的資料結構來替代遞迴所需的額外記憶體堆疊。主要是利用 begin 和 end 分別紀錄尚未處理的鏈結串列的起始位址和結束位址。 node_t *begin[max_level], *end[max_level]; 每次迭代中會分別從 begin 和 end 中提取鏈結串列的起始和結束位址,並將其設定為 L 和 R,分別代表鏈結串列的最左邊和最右邊。接著,將 L 設定為 pivot,然後透過 while(p) 掃描目前正在處理的鏈結串列 (即從 begin 到 end)。將大於pivot的節點放至 right 中,反之則放至 left 中。 如果在每次迭代時,從 begin 與 end 拿出的數值相同即代表該節點已經在正確的位置,因此可以將其加入已排序好的鏈結串列 result 中。
     Like 1 Bookmark