4 月
11
2012
0

CUDA multiple/dynamic texture reference

最近論文慢到不用CUDA無法跑完的境界,在使用Texture Reference上遇到了許多問題,故寫下此整理後查

我遇到的問題是必須要做驚人次數的bi-linear interpolation warping,故希望能用GPU的texture mapping功能,但同時必須要在多張影像中間切換

先轉述一篇文章片段

Those of you who have used CUDA textures should be familiar with the insane programming interface that they present. Texture references can be declared only as global variables, and only in the file where you are using them. You can’t pass them around as by-value/by-reference arguments in functions, you can’t create them inside function/class scope, and you cannot make arrays of them.

我們都看到這些限制拉,既然不能做texture reference array,這也代表我們不能在kernel function中index它,故每張影像一個texture reference是不可行的,當然這並不包括你硬刻影像數量的texture reference array在code中,同時你還必須受到一個kernel function僅能access 128個texture rerference的限制,並且在未知影像數量下也做不到硬刻code。

解決辦法一:在要使用texture時bind texture reference,但這似乎牽涉到複製到texture memory的問題,當你頻繁的切換時會有巨大的overhead。

解決辦法二:爛招合併所有影像到同一個texture,自然就可以僅用一texture reference,但你會受到texture size limit,這僅對小影像的合併有用,並且CUDA似乎不希望你開一個巨大的texture block,會在runtime時死掉,這個大小是與你的GPU記憶體無關的。還有另一個問題是你在fetch影像邊界的texture時可能會染到上下一張影像的pixel顏色,因為它當作是同一張圖了!

解決辦法三:使用3D texture reference,使用第三個維度來作為2D texture的影像index,但明顯的你的影像大小最好要全部一樣,並且也會發生解法二的顏色問題

解決辦法四:放棄使用你的高階CUDA語法,有low-level的解法,使用”DEPRECATED”的CUDA Driver API,咦?

解決辦法五:放棄使用CUDA! DirectX10有提供texture array! XDD

最終解法:使用cudaArrayLayered! interpolation 僅在該layer,不會跨layer interpolation

Written by in: 電腦三兩事 | 標籤:
2 月
25
2012
2

Point Cloud Library (PCL) include list

最近要用到PCL來做visualization,但官方的tutorial都是教你用cmake開專案
要整合到現有的專案檔就很麻煩~~
所以自己整理了該include的清單備查

For PCL version 1.5.1

C:/Program Files/PCL 1.5.1/include/pcl-1.5
C:/Program Files/PCL 1.5.1/3rdParty/VTK/include/vtk-5.8
C:/Program Files/PCL 1.5.1/3rdParty/Eigen/include
C:/Program Files/PCL 1.5.1/3rdParty/Boost/include
C:/Program Files/PCL 1.5.1/3rdParty/Flann/include
C:/Program Files/PCL 1.5.1/3rdParty/Qhull/include
C:/Program Files/OpenNI/Include

C:/Program Files/PCL 1.5.1/lib
C:/Program Files/PCL 1.5.1/lib/$(Configuration)
C:/Program Files/PCL 1.5.1/3rdParty/Boost/lib/
C:/Program Files/PCL 1.5.1/3rdParty/VTK/lib/vtk-5.8/
C:/Program Files/PCL 1.5.1/3rdParty/Flann/lib/
C:/Program Files/PCL 1.5.1/3rdParty/Qhull/lib/
C:/Program Files/OpenNI/Lib/

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
opengl32.lib
ws2_32.lib
comctl32.lib
wsock32.lib
openNI.lib
pcl_common_debug.lib
pcl_octree_debug.lib
pcl_surface_debug.lib
pcl_registration_debug.lib
pcl_keypoints_debug.lib
pcl_tracking_debug.lib
pcl_apps_debug.lib
pcl_kdtree_debug.lib
pcl_search_debug.lib
pcl_filters_debug.lib
pcl_segmentation_debug.lib
pcl_visualization_debug.lib
pcl_features_debug.lib
pcl_io_debug.lib
pcl_sample_consensus_debug.lib
flann_cpp_s-gd.lib
qhullstatic_d.lib
libboost_system-vc100-mt-gd-1_47.lib
libboost_filesystem-vc100-mt-gd-1_47.lib
libboost_thread-vc100-mt-gd-1_47.lib
libboost_date_time-vc100-mt-gd-1_47.lib
libboost_iostreams-vc100-mt-gd-1_47.lib
vtkCommon-gd.lib
vtkRendering-gd.lib
vtkHybrid-gd.lib
vtkGraphics-gd.lib
vtkverdict-gd.lib
vtkImaging-gd.lib
vtkIO-gd.lib
vtkFiltering-gd.lib
vtkDICOMParser-gd.lib
vtkNetCDF_cxx-gd.lib
vtkmetaio-gd.lib
vtksys-gd.lib
vtksqlite-gd.lib
vtkpng-gd.lib
vtktiff-gd.lib
vtkzlib-gd.lib
vtkjpeg-gd.lib
vtkexpat-gd.lib
vtkftgl-gd.lib
vtkfreetype-gd.lib
vtkexoIIc-gd.lib
vtkNetCDF-gd.lib
vfw32.lib

Written by in: 電腦三兩事 |
1 月
13
2012
0

Run Length Coding/Encoding (RLC/RLE) CCITT Group 3/4 Example

又是影像處理期末考的玩意兒
網路上完全找不到詳細的例子,好險自己領悟一番有點感覺了,故寫下此筆記後查

這邊舉例CCITT 4的RLC編碼方式,我們都知道有Pass mode、Vertical mode與Horizontal mode三種模式,以及幾個重要的座標點
a0:編碼行的參考點,預設為-1(假設element從0開始)
a1:編碼行a0後第1個transition位置
a2:編碼行a0後第2個transition位置
b1:參考行(前一行)a0後第1個transition位置(值與a0相反)
b2:參考行(前一行)a0後第2個transition位置

Pseudocode

initialize a0
detect a1, b1, b2
if (b2 < a1) {
    Pass mode encoding
    a0 = b2
} else {
    if ( abs(a1-b1) <= 3 ) {
        Vertical mode encoding
        a0 = a1
    } else {
        detect a2
        Horizontal mode encoding
        a0 = a2
    }
}

課本的例子Example 1:
參考行
編碼行

■□□□■■■■■□□■■■□□□□■■■□□□
■■■■■■■□□□□□□□□□□■■■■■□■

未完…

1 月
02
2012
0

LZW compression & decompression pseudocode

期末考記錄用
參考自此但我覺得需要修改

LZW compression

string = NULL;
while character = next input character{
    if string+character is in table {
        string = string + character
    } else {
        output code of string
        add string+character to table
        string = character
    }
}

LZW decompression

while code = next input code {
    if code is new code {
        string = translated code
        output string
        // string(0) is the first character of string
        add prevString+string(0) to table
    } else {
        add to table for known code sequence
        string = translated code
        output string
    }
    prevString = string
}
9 月
13
2011
0

visual studio 視覺化動態陣列 visualize dynamic array

如果你常用Matlab寫矩陣運算,一定對這個變數瀏覽工具不陌生,這真是太美好了,可以一眼望盡矩陣內所有的數值,如果你有更大的螢幕,甚至可以想像如Nash一樣在數字海中找到真理

但是這些美夢到visual studio中卻應聲破裂,散亂成16進位的記憶體亂碼,本文就是要帶領你回到美好的debug時光,重拾回可以”看見”的資料

(more…)

Written by in: 電腦三兩事 |
8 月
31
2011
0

平行化技術大亂鬥

最近有空看了不少平行化的技術和語言,寫此篇作為紀錄

平行化就硬體層面來說可分為CPU和GPU兩種平行化,CPU的平行化我們稱之為Multi-Thread,也就是我們所熟知的執行緒;而GPU的平行化運算統稱為GPGPU(General-purpose computing on graphics processing units),泛指在GPU上非rendering的計算。而GPU的thread與我們常見的CPU thread不太相同(可異質的thread,如GUI與背景計算),他必須是要「相同執行步驟」的thread(如矩陣運算),才能由GPU執行平行化,所以在撰寫的思考會比較沒有自由。

接下來則是我們常見的CPU與GPU平行化的framework

CPU:

  • Pthread:本是UNIX的thread,目前有許多跨平台的版本,實做了複雜的thread介面與同步機制
  • openMP:與compiler綁定的#pragma巨集語法,目前大多數的C/C++ compiler都有支援(VC2010),使用相當簡單迅速
  • windows.h: 與pthread類似,但不跨平台

對初學者來說,我相當建議使用openMP來實作平行化,如果有寫過matlab的平行化「parfor」,openMP就是差不多的東西,並且也實作非常容易使用的同步機制如「critial」,優點是其巨集式的語法,並且可以在需要的時後跳過巨集語法變回single thread的程式(方便debug),具有撰寫快速、維護容易的特性,讓我們可以專注在平行邏輯,而不是在封裝thread function。缺點是要寫出複雜的同步邏輯如condition就比較無力。但是對於非real time導向的科學計算加速很有幫助,要處理伺服器的複雜同步機制還是得使用自定thread function的傳統thread(如pthread)。

GPU:

  • Nvidia CUDA: 目前最完整的GPGPU framework,包括了許多類似STL的加速資料結構與矩陣計算函式,如果你想省時間學習開發,選CUDA
  • ATI Stream: 他們跑去玩openCL了~
  • Miscrsoft DirectCompute: 微軟基於DirectX的GPGPU framework,理所當然的windows ONLY
  • openCL: 由許多廠商共同支援跨GPU的通用framework,理論上是可以支援所有顯卡的,不過由於跨平台的特性,所以語法更低階更難寫,並且發展緩慢,但是在未來會成為主流

所以結論就是CUDA(啥?),你甚至可以使用類似openMP的#pragma語法來實作GPU thread,叫做HMPP,其主要規格定義在openHMPP,但這軟體是要錢的…

Intel為什麼沒有參一腳呢? 按照我在研討會上聽到的資訊,他們認為GPU以運算時間做為效能依據不夠客觀,應以工耗比(Performance/Power)來競爭才夠客觀,畢竟現在顯示卡已經可以算是一個小型主機版架構了,所以他們認為CPU是很給力的(了不起我們再買NV嘛)~~~

Written by in: 電腦三兩事 |
6 月
22
2011
1

人體鍊成果然是禁止的

最近很紅的AKB48虛擬偶像阿~

雖然同一樓層的蔡教授早就在做了,我本來也想趕流行製作虛擬正妹的說

信手拈來就是個──魚柱小姐

我不信邪多按了幾次隨機產生,但僅是多了些魚柱小姐的兄弟姊妹…

人體鍊成果然是禁忌阿…

Written by in: 電腦三兩事 |
4 月
02
2011
0

來自google的明信片─AdSense pin

重寄了兩次,整整超過2個月的等待,終於來到手中的pin card

(more…)

3 月
29
2011
1

開箱!! HTC Incredible S & iPad

一口氣開了不少箱阿~其實加上配件應該要更多的,不過我懶了(攤

開箱數與生活壓力成正比~哈哈哈

(more…)

Written by in: 攝影,電腦三兩事 |
8 月
18
2010
0

Adobe Air to Exe

最近想把air轉成exe檔案,卻遇到一些問題,首先

官方的說明文件是錯誤的,如果你照著作將會得到下面的錯誤訊息

-storetype is required


在這裡有提到解決的方法,不過有些地方要修正

1. 下載AIR 2.0 SDK 之後,直接解壓縮覆蓋到你現有的SDK中

2. 原文中

<application xmlns=”http://ns.adobe.com/air/application/2.0beta”>

改為

<application xmlns=”http://ns.adobe.com/air/application/2.0″>

正式版已經出來了

其實並不是變成原生EXE檔,而是加入了自動下載AIR Runtime的程序…

我的系統是win 7 64bit,目前看來一切正常

Written by in: 電腦三兩事 | 標籤: ,

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com