2020年9月28日 星期一

關於 clang/gcc vector extension 的 unaligned data load / store

從 ARM 平台開始學習著手寫 SIMD intrinsics 有個相當大的好處 - 在 ARM 平台上 vector load/store 在任何 memory address 都可以使用 vld1q_u32 or vst1q_u32 這類的 intrinsics (另外像是 vld3q_u8 / vst3q_u8 對於 interleaving RGB 非常好用, 在 x86 上就很頭大, 但這是題外話了), 也就是說 ARM 的 vector load / store 可以不用考慮 vector width alignment. 

然而 ARM NEON 的 vector load / store 指令設計是少數, 在多數的 SIMD ISA 平台都不是如此, 像是 Intel AVX / SSE 就必須顧慮到 alignment ( 請參考 Intel Intrinsics Guide 網站 ):
以 SSE 而言:

  • _mm_load_si128 - 這是用來針對 aligned address
  • _mm_loadu_si128 - 這是使用來處理 unaligned address

對於 AVX :

  • _mm256_load_si256 - 這是用來針對 aligned address
  • _mm256_loadu_si256 - 這是使用來處理 unaligned address

在 unaligned address 使用 aligned instruction 就會發生 crash / error, 因此不可不慎, 而這在硬體上會反映在內部 pipeline 狀態到 memory request 的頻率/數量, 對於效能有一定程度的影響. 在多數 DSP 上由於使用 banked SRAM, 因此有可能有更嚴格的 alignment 限制. 

在 clang / gcc 中使用 vector extension 是可以較為簡單撰寫 SIMD-friendly code 的方法之一, 然而無論在 clang 的 vector extension 說明 或是 gcc 的 vector extension 說明 都採用 aligned vector 的形式, 所以通常在撰寫 data loading 時就必須注意 pointer alignment:

// clang vector type
typedef
float float4 __attribute__((ext_vector_type(4)));
...
float4 *vdata = *((float4*)(data_ptr + offset));

對於像是 CV / Image Processing 通常必須注意 padding, boundary 與 data_ptr 的 offset, 最簡單的方式當然是透過 memalign 之類的方式配置 buffer, 然後將 layout 設計好符合 SIMD width. 然而並非所有演算都可以如此輕鬆, 一些像是 connected conponents 之類的演算, 能夠有一定程度的 SIMD, 但是又並不保證起點由 aligned address 處理, 這時通常處理方式有二:

  1. 使用 unaligned read + indications/select
  2. 轉為 aligned-based loops

兩者都有人使用, 這裡要談的不是 algorithm 層級的事情, 且 1. 的部份會簡單一些, 那麼問題就在於該如何讓 compiler 產生 unaligned load / store. 對於 gcc / clang vector extension 而言這在於 type alignment 屬性 (詳情請參考 StackOverflow 對此問題的回覆) , 將上述的 float4 型別宣告改為:

typedef float float4 __attribute__((ext_vector_type(4), aligned(1)));

如此 float4 型別的 alignment 會是 1-byte, 如此 compiler 會轉為產生 unaligned load / store 指令, 便能在 c code 當中於任意位置做資料的存取與處理.

2020年9月27日 星期日

正體中文資訊考古 - Microsoft Works 3.0

 

易學易用萬事通 - Microsoft Works
這其實是著手後第一批到手的舊軟體
當年家中購入第三台 Pentium 66 的電腦時
除了隨機授權的 Windows 3.1 外還有附上這套軟體
雖然沒有光碟上沒標示版號, 事實上這是 MS Works 3.0
沒意外的話, 這應該也是 Works 第一個官方中文化的版本
Works 辦公套件主要是因應一般家庭並不需要功能強大價格高昂的 Office
對此市場需求因而推出了 Works
在台灣能見度不高應該跟國人消費習慣有關
而 Works 事實上一直有持續推出, 直到免費的 Office 2010 Starter 推出後停止



 
 
 
 
 
 
 
 
 
 
 
 

2020年9月26日 星期六

正體中文資訊考古 - 莎士比亞 國民版 v4.02

今日入手當年的新人類出版的文書排版軟體 - "莎士比亞 國民版 v4.02"
上面雖然寫著 for Windows 95
然而事實上這是能在 Windows 3.1 上運行的
在那時許多電腦繪製的海報/手冊都是出自本軟體
購入的光碟是全新未拆, 但是並沒有沒有附上序號卡
最後是網路上尋找後安裝成功
BTW. 莎士比亞 v6.0 目前可以免費下載並於 新人類官網申請序號
 


2020年9月22日 星期二

正體中文資訊考古 - Microsoft Office 4.2 + 自然注音 3.11

Microsoft Office 4.2 中文版搭配自然注音輸入法, 
在小弟中學求學時期算很潮的軟體工具, 
如果有台噴墨印表機可以列印資料算是很前衛了.
個人那時很多的文件與資料準備, 
甚至到高中升大學的一些推甄/保送的文件都是這樣的環境趕出來的.
前一陣子因為找 OS/2 4.0 中文資訊而發現到, 
20~30 年前時代的資訊相當多已亡佚, 
看到很多國外年代久遠的軟體在 archive.org 都有上傳, 
很多人應該不希望那些就這樣只留在記憶之中, 
程式與人的使用與互動之間形成了生活與回憶. 
很可惜的台灣做相關收藏與整理的人並不多, 
這些生活足跡只能在新時代中慢慢流失.
 
下午與同事分享過當然那些日子已經離去很久, 
也是網路尚未發達的時代, 隨著新一代的網路服務/軟體的推陳出新, 
舊世代的軟體, 特別是那些有時代意義的中文化或是本土商的軟體, 
都慢慢隨著時間而逝去, 
除了少有人有動機從舊媒介上取下之外, 
從 Y2K 前後設立網站的關閉到空間消失, 
甚至每一次的搬家與整理, 
那些曾經那麼熟悉的事物, 
很可能很大一部份就因此不復重現, 
但其實它們是台灣文化的一部份, 
也是台灣資訊發展的歷史一環. 
能讓它們能展示運作會比只有 Wikipedia 上的只留一行註解來得有意義的多.
 
接著會嘗試把個人熟悉與持有的 CD or 資訊找出, 
分享或上傳 archive.org, 做個紀錄那段時代的見證者

Office 4.3 正體中文版

自然注音輸入法 3.11

 

 

 
 
  

2020年9月9日 星期三

正體中文資訊考古 - OS/2 T4.0 正體中文版


後續會陸續把中文相關的檔案上傳 (4.0 的附屬光碟, 3.0 中文版光碟)
主要是最近找了一下 archive.org
發現 OS/2 4.0 原文的東西相當多
 
像是這個 collection, 有人把很多語言版本都上傳了(但是沒有正體中文版)
加上近年其實可以感受到原有的網路資訊逐漸消失
為了做一些歷史資料保存與見證
就花了點時間把 OS/2 T4.0 iso 檔案上傳了
T4.0 真的就是懷舊了, 一點可用性都沒有
原以為更新到 fixpack 5 (OS/2 4.0 最後的 fixpack)就有機會能夠使用 SVGA
但 ... 果然我想太多了 (是說裡面的 telnet 還可以用)
裝了 Netscape Communicator 4.61, 但是因為 https 加密演算不支援, 加上也不支援 HTML4 所以寸步難行
 
話說 eCS 1.2 中文版不難找, 
主要是版本蠻新的, 
有些可能還有在使用 (甚至還能安裝 GCC 9.2)
所以不管是 eCS or OS/2 MCP2/4.52 暫時決定還是不要放到 archive.org
 (也的確 archive.org 上相關檔案不多)
 
 
 
 
 
 
 


在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...