V4L2 小整理

V4L2 全名 Video For Linux Version 2, 它是 Linux 裡面多媒體類的 kernel module [1]. 和它同等地位的包括 DTV, CEC 等其他 user space API. 比較複雜的系統也可能使用 Media Controller API 來維護 [5], 因為 V4L2 不提供查找 device 的能力, 但後者可以. 

V4L2 支援 16 種介面 (Interface), 在 [2] 裡面會各自稍微給一點介紹. 重點部分還是在它的 function [3] 和基本操作流程. 標準的 V4L2 使用流程, 包括下面 6 個步驟. 但執行順序可調換, 也可以省略其中幾步.

  • Opening the device
  • Changing device properties, selecting a video and audio input, video standard, picture brightness a. o.
  • Negotiating a data format
  • Negotiating an input/output method
  • The actual input/output loop
  • Closing the device

不可省略的像是基本安裝和打開關閉 device (open()/close()) 等等, 例如

mknod /dev/video0 c 81 0 // V4L2 的 major number 是 81.

某些 device 可以接受多次 open(), 表示各自得到使用的權利. 理論上每個 node 都可以支援所有的 function, 但這偏離現實. 我們可以使用 ioctl VIDIOC_QUERYCAP 這個 ioctl 去看一個 device 支援那些 function 和 IO method.

附帶一題, 最近不常看書, 所以很少找到印刷錯誤. 但我覺得 [6] 這裡打錯了, hyperlink 也錯. 畫紅線的地方應該是 mmap(), 要 link 到 [7] 才對.

在這數十個 function 之中, 最基本的就是: open(), close(), read(), write(), select(),poll(), mmap(), unmap(). 其他 97 個 VIDIOC_ 開頭的 request 都是代入 V4L2  ioctl() 使用. 

[REF]

  1. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/v4l2.html
  2. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/devices.html#devices
  3. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/user-func.html
  4. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/open.html
  5. https://www.kernel.org/doc/html/v4.16/media/uapi/mediactl/media-controller.html
  6. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/libv4l-introduction.html
  7. https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/func-mmap.html

散熱小註解

最近公司的 IC 上了小板子有點燙, 還有技嘉的顯卡也燙, 因此對於搞清楚散熱的相關計算產生了好奇.

大家說技嘉顯卡的散熱墊片的熱傳導係數(heat transfer coefficient, K) 是 3Wm/k, 換成 12 Wm/k, VRM 和 GDDR6 的溫度就會下降. 換言之, 高導熱係數比較容易傳導熱量到正面的銅管和背面的鋁板上.

首先以顯卡來考量, 一張顯卡在 65% 功率限制下, 大概消耗 240 W. 火力全開假設是 370W (1 Watt = 1 J/s, J = 焦耳) .

Q=cm△t

W = Q/T = cm△t/T

所以一秒鐘內, 水冷想要降低顯卡 75 度 (100 –> 25), 考慮水的比熱 (容量) [1] = 4.2*103 焦耳每千克攝氏度, 水冷液 150 ml= 150 g = 0.15kg

240  = (4.2*10* 0.15 * 75) /t

t = 47250/240 =  196.875 (sec) ~= 3.3 min

所以水冷一開始會很有用, 但是過了三四分鐘水溫已經到極限, 就算冷排加風扇可以把 100 度往下降一點, 但溫差太小還是來不及散熱. 火力如果全開, t = 47250/370 = 127.7 秒 大概兩分鐘多就飽和了. 換言之水冷排不夠好, 就算水量多 3 倍也沒太大幫助. 真正能被持續帶走的熱量是水冷排貢獻的. 所以我好奇未來是不是該出現固態散熱線?

再來看散熱墊片, 散熱墊片的功能類似前面提到的水. 但為何賣散熱墊片的人不用比熱, 要用導熱係數 (W/ (m*k)) 為單位呢? 查著查著, 又看到一個相似的名詞熱導率/熱傳導率 (thermal conductivity), 因為單位一樣 [4], 看起來是兩岸翻譯不同.

根據 [2], “Thermal conductivity, also known as Lambda (denoted by the greek symbol λ)…It is measured in Watts per Metre Kelvin (W/mK)." 但這兩者應該有關係吧!? 果然老外也有人跟我有一樣的疑問 [3], 但是老中比較不好奇所以沒有討論.

有位 Elisan Magalhaes  說:

As the matter of fact, you can correlating both through the thermal diffusivity (熱擴散係數). The thermal diffusivity is defined as:
 α = k/(ρCp)
where:
α – the thermal diffusivity
k – the thermal conductivity
 ρ – density
Cp – the specific heat capacity at constant pressure
 
不過這樣還是只回答了一半, 也就是說熱擴散係數正比於導熱係數, 反比於比熱. 深一層的意義是, 比熱沒考慮到材料散熱面積, 只考慮總容量. 導熱係數有個變數是厚度. 故不能單獨決定散熱倒底好不好?  只有  α 比較能夠反映熱擴散的速度.
 
BTW, 網路上都寫α = k/ρCp, 但是按照單位來說, 應該是寫成 α = k/(ρCp) 比較不會混淆.
 
meter2/sec = (Watt / (meter * K)) / ((kg/meter3 )*(J/( kg · K))
 
12 (W/mK) = X Watt / (0.002m * 373.15 K) ==> X ~= 9W
 
所以導熱率 12 的散熱墊片, 如果有 2 mm 厚, 單面接觸 100 度攝氏度 (373.15 度 K) , 最多可以傳走  9W. 而導熱係數 3, 只譨帶走 9/4 = 2.25 W. 我理解為會多留下 6.75 W 在 PCB 上傳不走. 這部分還找不到網路上得實例, 繼續研究中.
 

[REF]

  1. 比熱容
  2. https://www.thegreenage.co.uk/article/thermal-conductivity-r-values-and-u-values-simplified/
  3. https://www.researchgate.net/post/Is_there_any_relation_between_the_heat_capacity_and_the_thermal_conductivity
  4. 熱導率

Tensorflow V2.0 相容性小實驗

為了一圓 AI 大夢, 我買了一塊 GTX 3090. 原本在 PCHOME 觀望三分鐘, 嫌貴沒按下去, 後來就再也買不到了!!!  電腦的東西不是應該慢慢降價嗎? “早買早享受, 晚買享折扣" 是大家都知道的定律啊!? 不過這次不一樣, 顯卡價錢還一天比一天高. 最後只好破釜沉舟買了蝦皮最後一張現貨, 而且是散熱貼片品質不好的技嘉. 

卡片到手之後, 先找個 BenchMark 來燒機, 結果老舊的 i7 扯了後腿, 分數還差正常的 3090 一成. 腦筋一賺, 來挖礦吧! 結果以前會動的 guiminer 程式都連不上礦池. 上網一查才知道電腦已經不能挖比特幣了. 不死心的我研究了一下, 得知可以在 Nicehash 挖別的幣換比特幣, 這樣果然就行了. 但是算力全開的話, VRM 瞬間就飆到 110 度. 嚇得死人了. 只敢開溫和模式當背景程式跑.

好了, 言歸正傳. 算 AI 會不會燒 VRM 要試了才知道.  然而, 客戶的事情如雪片般飛來, 我始終不能定下心跑程式. 兩個月過去, 比特幣都挖了 0.005 顆了, 但是正事還沒開工. 好不容易有清明連假, 趕快把電腦環境安裝起來. 有一篇文章跟我以前的軌跡很相似 [1], 於是我就按照這個思路來恢復環境.

不過 Google 排名靠前 – 很多人引用的文章相對都是比較舊的. 前述文章中的 Cuda 9 已經該進版到 Cuda 11.2, Cudnn 由 7.5 進版到 8.1.1, 其他流程都差不多. 按照文章一路破關, 然後在測試環境這邊卡住了. 當我執行 c = tf.matmul(a, b) 會得到:

" failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED"

根據 [2] 所述, 這是分配記憶體的問題. 按照官網 [3] 要下tf.config.experimental.set_visible_devices.

但這個還是只能治標, 不能治本. 晚點還是會遇到

tensorflow.python.framework.errors_impl.InternalError: Blas xGEMM launch failed : a.shape=[1,2,3], b.shape=[1,3,2], m=2, n=2, k=3 [Op:MatMul]

看起來正確解答是這三行 [4]:

import tensorflow as tf
physical_devices = tf.config.list_physical_devices('GPU') 
tf.config.experimental.set_memory_growth(physical_devices[0], True)

但是要在 init 的時候下, 不能臨時抱佛腳. 所以要重來一次.

然後在 tensorflow 2.0, 過去的 tf.Session() 也被淘汰了, 要改用 f.compat.v1.Session(). tf.ConfigProto 也換成  tf.compat.v1.ConfigProto (待確認). 比較嚴重的區別是 tensorflow 2.0 預設開 eager execution. 會遇到

RuntimeError: The Session graph is empty. Add operations to the graph before calling run()

所以有三個方法:

A. 直接設定跟舊版相容 [7]:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

B. 或是關掉 eager execution [6]:

tf.compat.v1.disable_eager_execution()

C. 或者先宣告 session, 而不是等要用的時候才宣告. 例如 [6]:

 # Launch the graph in a session.
 with tf.compat.v1.Session() as ses:

     # Build a graph.
     a = tf.constant(5.0)
     b = tf.constant(6.0)
     c = a * b

     # Evaluate the tensor `c`.
     print(ses.run(c))

重來一次完整的步驟就是. 從 Anaconda 打開 Python 的 terminal.

import tensorflow as tf

physical_devices = tf.config.list_physical_devices('GPU') 
tf.config.experimental.set_memory_growth(physical_devices[0], True)
tf.compat.v1.disable_eager_execution()
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True))
print(sess.run(c))

 

[REF]

  1. https://ithelp.ithome.com.tw/articles/10237846
  2. https://www.itread01.com/content/1545441880.html
  3. https://www.tensorflow.org/guide/gpu
  4. ://stackoverflow.com/questions/43990046/tensorflow-blas-gemm-launch-failed
  5. https://stackoverflow.com/questions/55142951/tensorflow-2-0-attributeerror-module-tensorflow-has-no-attribute-session
  6. https://github.com/OlafenwaMoses/ImageAI/issues/400
  7. https://github.com/tensorflow/tensorflow/issues/25446

 

 

ATSC A/85 中的 DialNorm 和 DRC

客戶又有新的 audio 專家來開會了, 只好考前猜題準備一下相關背景知識.

首先是整體音量的方面, 這裡有一篇中文的介紹非常棒 [3]. 看了以後對 audio normalization 會有基本的了解. 計算音量的方式有 A-weight (acoustic) 和 K-weight (單純對頻域 weighting), 把整片每個聲道掃完就會得到平均音量 [6]. ITU-R BS.1770 的公式 (2) 給了一個測量 loudness 方法 [6], 它的另外一個主題是測 True Peak.

接下來專注討論人聲的部分, 在 objective audio 的時代, 據說聲音該大聲就大聲, 該小聲就小聲, 但人聲必須是正常而且受到規範的 (CALM) [7]. CALM 言明要規範的是 perceived loudness, 然後又說 “Perceived loudness compliance is based on Dialog
Normalization – dialnorm. Dialnorm is defined in ATSC A/85″, 所以 DialNorm = Perceived loudness. 

DialNorm 是一個 metadata. 它的值介於 0~31, 也就是 -30~0dB 的音量 [1], 其中 0 是 reserved. DialNorm = 1 => 0dB, DialNorm = 31 => -30dB.  DialNorm = 12 表示很大聲, DialNom = 27 表示溫和 (soft). [2]

ATSC A/85 對 DialNorm 的規範是 -24 LKFS (想成 dB 就好) [4], 並且允許大約 ± 2dB 的量測誤差. 在 AC3 的碼流中會帶著這個 metadata, 而這裡的 0dB 是片源允許的最大音量. 我們可以透過調整電視音量, 讓電視的輸出的人聲落在 DialNorm 的上下區間 (comfort zone) [5].

根據 A/85.  電視節目製作人應該要保證他們的輸出都有適當的 DialNorm 控制, 包括所有片源都固定一個 DialNorm (fixed), 或者對每部片子預設一個值 (preset), 或者是可以從外部動態取得 (agile). 至於插片或是廣告的音量, 當然也要受到管制, 這也是 A/85 的目的. (This ATSC Recommended Practice (RP) provides guidance…to effectively control program-to-interstitial loudness.) 但 program-to-interstitial 的音量變化經常都是亂源. 

A/85 還講到 DRC (Dynamic Range Control) 有開關是為了要達到 reversible, 不然動態範圍壓下去就無法復原了. 在 P.26 提到: The AC-3 DRC system should not be relied upon to control program-to-interstitial loudness variations. 表示 DRC 也管不了廣告. 在 9.1.3 (P.29) 提到, DialNorm 是反映整部片子音量的準則, 所謂太大聲大小聲要拉起來壓下去, 都是依據 DialNorm 做判斷標準.

然後 9.1.4 解釋了 Dolby MS12 (密) 文件中沒有解釋的 profile, 幸好在公開的文件中就有講. AC3 定義了五種 profile, MS12 多一種 null profile. 但 9.1.5 有講到 DRC = “none", 也就是沒有 DRC 開關的選項.

• Music Light
• Music Standard
• Film Light
• Film Standard
• Speech

基本上這五種 profile 都跟 DialNorm 有關, 因為 Music 沒有對白, Speech 全部都是對白, 所以不同 profile 就代表不同的 DRC 調整. Light 跟不 light 的區別在於, light 版有比較多的 null area, 所以調的地方比較少. 

(The “Light” versions of the profiles have a much wider null area. Thus, gain reduction or expansion begins farther away from average program audio, resulting in less gain reduction or expansion than with the “Standard” version of the profile.) 

這也解釋了 [3] 裡面提到, Youtube 大約是 -13 LUFS, 而 Spotify 是 -14 LUFS (LHFS = LKFA). Youtube 基本上是 movie, Spotify 基本是 music. 如果對 Speech profile 開 DRC, 理論上會造成失真. 因為它已經全部都是人聲了, 壓了應該會破壞朗誦效果, 哈!

DRC 又可以分為有 metadata 和沒有 metadata. 有 metadata 就是前面講的這些, 沒有 metadata 的就像是 AGC (automatic gain control). 因為沒有 metadata, 所以是 irreversible.

[REF]

  1. https://en.wikipedia.org/wiki/Dialnorm
  2. https://www.atsc.org/wp-content/uploads/2015/03/Techniques-for-establishing-and-maintaining-audio-loudness-1.pdf
  3. 有關Audio normalization兩三事
  4. loudness, K-weighted, relative to full scale, measured with equipment that implements
    the algorithm specified by BS.1770. A unit of LKFS is equivalent to a decibel.
  5. Comfort Zone – the Comfort Zone is a range ( +2.4dB, -5.4dB) of the change to audio loudness that was found to be acceptable to a sample of listeners. The 0 dB point on the Comfort Zone scale is the average Target Loudness value or dialnorm of the channel.
  6. https://www.itu.int/dms_pubrec/itu-r/rec/bs/R-REC-BS.1770-4-201510-I!!PDF-E.pdf
  7. https://www.ensembledesigns.com/file_download/640/Ensemble_CALM_wp.pdf

IC 設計公司營收排名 2020

去年底有新聞一度說瑞昱在全世界無晶圓 IC 設計公司的排名超越聯詠和 Marvell, 由世界第九進步到世界第七, 害我開心了一下 [3]. 不過看起來聯詠成功拉尾盤, 把瑞昱擠回台灣老三. 至於台灣 IC 公司有沒有成功追上 Marvel 或是 Xilinx 就等大家都用可以同一種貨幣來結算時再分高下了. 

[2021/6]

感謝網友的指教, 我新增了兩家公司 (晶心, 天鈺). 與更正 “笙泉" 的名稱.

並且在註解中更新了世界排名, 這個版本把 Apple 的 M1 算進 fabless IC design,  排名是世界第五, 海思是世界第七.

排名 公司 股號 2020 (K NTD) 註解
1 聯發科 2454 322,145,988 世界第四
2 聯詠 3034  79,955,521 世界第十
3 瑞昱 2379 77,759,469 世界第 11
  群聯 [*] 8299   48,496,522 IC 設計佔 25% 左右
  擎亞 [*] 8096  26,889,818 電子通路
4 奇景光電 HIMX 26,214,000 887.3 M USD  [1][4]
  新唐 [*] 4919 20,668,056 有晶圓廠
5 慧榮 SIMO 15,507,030 539.5 M USD [2][5]
6 譜瑞 4966 15,278,350  
7 晶豪 3006 15,268,091  
8 義隆 2458 15,099,690  
9 瑞鼎 3592  14,425,152  
10 矽力 6415 13,936,157 股王
11 矽創 8016 13,804,562  
12 敦泰 3545  13,800,348  
13 創意 3443 13,569,441  
14 天鈺 4961 10,884,838 顯示器驅動為主
15 原相 3227   8,148,017  
16 致新 8081  7,407,799  
17 祥碩 5269 6,987,470 `
18 威盛 2388  6,502,741  
19 盛群 6202 5,614,539  
20 智原 3035  5,498,295  
21 凌陽 2401  6,439,865  
22 茂達 6138 5,389,874  
23 松翰 5471  5,370,626  
24 立積 4968 5,350,200 大成長
25 聯陽 3014  4,817,829  
26 愛普 6531 3,551,551  
27 鈺創 5351  3,550,544  
28 晶焱 6411 3,187,850  
29 富鼎 8261  3,125,719  
30 信驊 5274 3,063,552  
31 宜特 [*] 3289 3,042,863 FIB IC
32 凌通 4952  2,899,677  
33 偉詮 2436 2,619,977  
34 創惟 6104  2,575,769  
35 尼克森 3317 2,480,399  
36 揚智 3041  2,071,615  
37 聚積 3527 1,901,224  
38 凌陽創新 5236  1,849,662  
39 力旺 3529 1,776,653  
40 研通 6229  1,745,035  
41 通嘉 3588  1,446,599  
42 晶宏 3141 1,338,872  
43 類比科 3438 1,279,266  
44 禾瑞亞 3556 1,224,398  
45 海德威 3268 1,162,747  
46 九齊 6494 1,160,305  
47 安國 8054 1,148,503  
48 系微 6231 1,130,536  
49 普誠 6129  1,096,933  
50 虹冠 3257 1,071,450  
51 點序 6485 939,612  
52 九暘 8040 832,299 被 MTK 買了
53 驊訊 6237 822,358  
54 亞信 3169 725,429  
55 鑫創 3259 650,504  
56 迅杰 6243  636,513  
57 晶心 6533  581,012  
58 笙泉 3122  494,732  
59 通泰 5487  467,087  
60 笙科 5272  445,014  
61 佑華微 8024 437,366  
62 金麗科 3228 378,261  
63 旺玖 6233  373,854  
64 聯傑 3094  233,542  
65 沛亨 6291  182,832  
66 矽統 2363  160,071  
67 凱鈺 5468 142,684  
68 點晶 3288  100,512  
69 倚強 3219 89,929  
70 凌泰 6198  34,052  
71 太欣 5302  28,016  
72 世紀民生 5314 19,789  
73 合邦 6103 13,715 大衰退
         

[REF]

[1] marketbeat.com/stocks/NASDAQ/HIMX/

[2] https://www.nasdaq.com/press-release/silicon-motion-announces-preliminary-fourth-quarter-2020-revenue-and-earnings

[3] https://udn.com/news/story/7251/5107710

[4] https://ec.ltn.com.tw/article/breakingnews/3432703

[5] https://finance.technews.tw/2021/02/05/simo-financial-report-at-2020/