2015年5月27日 星期三
c++ stream 使用科學記號
learn for awk
從這網站上可以學習到awk的一些基礎
awk 是個相當方便的程式語言,我想我應該好好熟悉它的。
舉例來說,我有個檔案格式是兩個colum組成的,我想取第一個colum的平均值,方法如下:
awk 'BEGIN{sum=0} {sum+=$1} END{sum/=NR; print sum}' test.dat
就這樣一行就可以完結了,相當的方便。
大二的時候就聽師揚介紹過,但並沒有很常用,但今後我應該要好好熟悉它。
2015年5月25日 星期一
Convert Eigen Matrix to C-style array
2015年5月20日 星期三
定時執行某段程式
2015年5月19日 星期二
解決 vim 在 tmux 下底色問題
這件事情之前也困擾著我,今天上網查到了還算滿意的解答:
根據第二篇回答,只要在 .vimrc 中加入 set t_ut= 這段即可解決
不過照理來說應該還是有辦法去修改 tmux 的設定來解決,畢竟出問題的不是vim,有種找錯仇家的感覺阿......
2015年5月18日 星期一
use vundle to install youcompleteme in vim
vi .vimrc
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'Valloric/YouCompleteMe'
run
:BundleInstall
cd ~/.vim/bundle/YouCompleteMe
./install.sh --clang-completer
copy
https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py
set .vimrc
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
2015年5月16日 星期六
BLAS 矩陣筆記
BLAS分別有 Level 1 ~Level 3 共三個級別,分別對應到三個不同複雜度的計算類型:向量-向量運算、矩陣-向量運算以及矩陣-矩陣運算,大概是加減乘的功能,它規範了一個標準的介面(API)給開發者,雖然未必完全遵守,但至少讓大家可以很方便的使用這類的功能,轉換各種函式庫的時候相當的方便。
剛學習 BLAS 的時候,我總是有個困惑:線性代數的功能不是很容易就能寫出了嗎?為什麼我不能自己寫就好了?還得去另外學別的API?
是的,簡單的矩陣相乘、相加這類的演算法大家都能實做出來,但在學習CUDA後,我大概瞭解這件事並不是那麼簡單,如果要讓實做出來的程式具有良好的效能,那得考量到許多硬體的特性,如記憶體、快取等等問題,另外矩陣相乘也有不同的演算法可以讓時間複雜度大大降低,總之,現存的BLAS並不是那麼簡單的東西,許多高階的軟體如matlab之類的底層都使用BLAS。
在BLAS中,最早被實現的是LAPACK這個庫,它是基於Fortran的一個庫,而它的API似乎也經常被拿來參考,而今天要記下的則是BLAS中經常讓我感到困惑的一個小概念,就是矩陣中的「lda」參數。
先來看一下 DGEMM 這個矩陣相乘的函數吧
DGEMM - perform one of the matrix-matrix operations C := alpha*op( A )*op( B ) + beta*C,
DGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC )
以上是這函數的簡介,那數學式相當簡單明瞭,但下面那函式的參數就讓人很困惑了,「LDA」「LDB」「LDC」這三個參數在數學式中完全沒有出現過,於是我去查了說明:
LDA - INTEGER. On entry, LDA specifies the first dimension of A as declared in the calling (sub) program. When TRANSA = 'N' or 'n' then LDA must be at least max( 1, m ), otherwise LDA must be at least max( 1, k ).Unchanged on exit.
大致上說明了這是拿來指定DGEMM時A矩陣的第一個維度的長度,也就是假設你的矩陣是A[M][N],則這個地方輸入M即可。Well……如果是平常使用,那其實這樣也就夠了,反正M和N輸入一個隨便試總是會有正確的。但為什麼明明我已經輸入了M N了,他還要再跟我要一次矩陣的大小?這其實是有其意義的。
先回顧一下非BLAS的庫吧,以Eigen舉例,如果宣告一個 5 x 5 的矩陣,但我只需要取最左上角的 3 x 3 的矩陣進行運算要怎麼做?
具官方文件的說明,做法如以下
M.block().block(0,0,3,3);
在BLAS中並沒有內建 .block 這類的函式,但它仍能靠「LDA」這類的參數實現這個功能。
在牽扯到矩陣的運算中,總會有幾個參數幾乎是必然會出現的,那就是 M、N、LDA(LDB和LDA性質相同,故不提),光是這三個參數就足夠實現 .block 的運算了。
假設我們有個 4 x 4 的矩陣如下
1 2 3 0 4 5 6 0 7 8 9 0 0 0 0 0
你可以說這是4x4,但多數情況下它不會只是4x4,而可能是100x100,但只有左上方的3x3為非零,我們會希望只取3 x 3 的矩陣進行運算,以節少許多運算時間。
這時我該怎麼做?在BLAS中的方法是:
原點=0 M=3 N=3 lda=4
在這裡,M和LDA有了不同的數值,相當的奇怪,但當我們仔細探討LDA這參數在這裡面的意義時就有了些不同。
在多數時候,一個3 x 3 的陣列儲存於電腦中時是使用1*9*sizeof(data_type)的記憶體儲存,而如果我們指定[2][2],通常是要取得第3*2+2個記憶體位址的值,以c++舉例,A[2][2]=*(A+3*2+2)。
但這和LDA有什麼關係呢? 關係可大了,LDA其實並不是單單標記矩陣的大小而已,它代表的是指標的位移量,如果把上面指定M N LDA的過程用中文詳述的話,大概如下:
『指標從原點開始向前走,走M格後,指標重新指向原點+LDA的位址,並繼續往前走M格,再把指標重新指向原點+2*LDA的位址,並繼續往前走M格』
也就是說,透過指定原點以及M N LDA 就可以達成.block的功能了。
另外,如果結果有出錯,那可能得檢查一下指標的宣告和變數的宣告是否有所不同,如果有不同的話那可能會造成指標指向錯誤的位置,而這種錯誤編譯器通常不會報錯,得小心注意。
2015年5月15日 星期五
CUBLAS 和 Eigen 之比較
稍微進行了BLAS 3 的運算
測試的內容是兩個矩陣相乘,而測試的矩陣是 M(i,j)=i*N+j
橫軸為N,縱軸為所花費的時間,紅色線為Eigen而藍線為CUBLAS
使用的平台分別是i52410M 以及 GT 540M,Eigen並沒有使用平行運算的功能
這測試並不是很嚴謹,可以多少看到對於大的矩陣來說兩者有了將近兩倍的差距,沒有想像中差那麼多,但也算堪用了。
另外,同樣的Eigen程式在node33上面跑,結果似乎是比起用筆電跑慢了許多,這點雖然不是很意外,畢竟機房的電腦主要是拿來丟一大堆工作或做平行運算用的,但還是多少有點小失望。
下星期一會把同樣的CUDA程式丟到圖書館的電腦跑看看,希望GT640可以有著更顯著的進步。如果有很明顯的進步的話,我會考慮去買買看GTX980來玩玩看的,做運算是其一,跑一些遊戲應該也能用到。
2015年5月14日 星期四
[梗記事] 屋頂上的
「那屋頂上的東西是什麼?」
「欸,哪個阿?」
「就是那黃黃的點狀物體阿」
「喔,那個是我爸的ㄒ……好痛!你幹嘛打我?」
「你一定又要說些怪東西了」
「沒有阿,我要說的是ㄒ……別再打了!」
「叫你別說你還說?!」
「我想他要說的是西哩控啦……」
「對啊,就是西哩控啦」
「西哩控?」
「是矽膠啦,拿來抓漏之類的東西,不過其實我也不是很懂」
Ubuntu 15.04 CUDA 配置
首先,我安裝一些編譯的包
sudo apt-get install build-essential
接著,用ALT+ CTRL +F1 進入文字模式,並把 lightdm 關掉
sudo service lightdm stop
安裝驅動源(這步驟我不清楚是什麼)
sudo add-apt-repository ppa:xorg-edgers/ppa sudo apt-get update
安裝 nvidaia 的驅動程式
sudo apt-get install nvidia-340 sudo apt-get install nvidia-340-uvm
到官方網站下載CUDA 7選擇Linux x86 中的 Ubuntu 14.10 版本並下載https://developer.nvidia.com/cuda-downloads
安裝下載的檔案:
sudo dpkg –i [剛剛下載的那個檔案]
更新 apt-get
sudo apt-get update
安裝CUDA TOOLKIT(這步我也不是很理解,在windows下只要安裝完下載的那個檔案就可以了)
sudo apt-get install -y cuda
修改環境變數,這部分和windows差不多,讓系統可以很方便的去找到庫文件
export cuda_home=/usr/local/cuda-7.0 export LD_LIBRARY_PATH=${cuda_homw}/lib64 PATH=${cuda_homw}/bin:${PATH} export PATH
以上過程如果沒出錯,那大概就算完成了。
如果需要測試的話,可以到 /usr/local/cuda-7.0/samples 中去找範例來執行看看,照理來說應該是可以直接跑。
這裡我是使用 1_Utilities/bandwidthTest 來測試,跑出來的結果應該類似下面這種格式:
[CUDA Bandwidth Test] - Starting...
Running on...
Device 0: GeForce GT 540M
Quick Mode
Host to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 6458.8
Device to Host Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 5794.6
Device to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 24402.9
Result = PASS
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
2015年5月10日 星期日
fedora server 21 設定 LAMP 網頁伺服器
如標題,這篇主要是設定LAMP網頁伺服器的筆記。
LAMP通常是指 Linux+apache+MySQL+php 的意思,是很常用的網頁伺服器配置。
安裝 fedora server 的部分不詳述了,一切讓它自動安裝就可以(也許會需要自行分割什麼的,但這並非必要就不提了),只是這篇是使用 fedora server 21的版本,防火牆似乎和過去不太一樣,不是預設使用 iptables ,所以相關的操作也許不能用在別的版本,這點得稍微注意。
首先,我們得安裝好需要的軟體:
yum install -y httpd
yum install -y mysql mysql-server
yum install -y links
yum install -y php
yum install -y phpmyadmin
上面所安裝的很容易就能看懂,接著是把服務打開
systemctl enable httpd
systemctl enable mariadb.service
systemctl start httpd
systemctl start mariadb.service
systemctl 這指令似乎是新的,CentOS也可以看到,以前好像是使用servics,更早以前則好像是要把它加入/etc/rc.d 中,如果使用的是舊的版本可能這方法就行不通了,你得另外去查一下相關的文件。而enable和disable代表這設定會被儲存起來,往後開機時都會執行,start 和 stop 則是代表現在馬上打開或關掉,而下次重開機則依 disable 或 enable 來看。
最後,關掉防火牆
systemctl disable firewall.service
systemctl stop firewall.service
會這麼做的原因是因為我不會用新的防火牆 firewalld ,而舊的 iptables 又懶得重新設定的緣故,這只適合臨時要確認自己有沒有設定完的時候使用,如果要長久使用的話,還是得設定一下防火牆才好喔。
以上動作執行完以後,就可以在 /var/www/html 這個目錄中放上成品了,在瀏覽器中輸入http://[這部分替代成你的機器IP] 應該就可以看到了。
2015年5月2日 星期六
Fedora 21 設置 NFS
原本我是看鳥哥的書來設定,但好像有些不太一樣的地方,所以稍做筆記以便日後重新安裝時來回顧。
如果這篇文章真有讀者,那也請先參考鳥哥網站關於NFS的部分來進行設定。
這次根據的是這網站
https://fedoraproject.org/wiki/Administration_Guide_Draft/NFS
總之,先在作為 Master 的電腦中,安裝相關的軟體:
yum install -y nfs-utils system-config-nfs
接著,設置你想分享出來的目錄以及相關的權限(如網域、IP等)
vim /etc/exports /home/ 192.168.2.0/24(rw)
我這裡是設置成分享/home出來,而在192.168.2.0~255這區段的客戶端都可以有讀寫的權限。
接著,取動rpcbind和nfs-server
systemctl enable rpcbind systemctl enable nfs-server service rpcbind start service nfs-server start
在執行這動作後,可以確認一下
showmount –e Master
如果成功的話,會出現剛剛在exports中設置的訊息
接著,在Client端用同樣的指令察看,照理來說應該要出現同樣的訊息。如果沒有,那大概是iptables沒給通過,可以直接關掉防火牆看看
systemctl stop iptables
如果出現錯誤訊息,那可以先安裝
yum install iptables-services
之後直接mount上去就可以了
mount -t nfs Master:/home /home
Fedora 21 更改 hostname
hostname 就是 bash 預設 PS1 的那個「localhost」,或者筆電的名稱之類的,通常大家都會把它換掉,畢竟命令列每天都要看個千百回,總是想把電腦換個好看點的名。
以前要變更hostname的話,要修改/etc/hosts,以及/etc/sysconfig/network 這兩個檔案,而現在則是改成
hostnamectl set-hostname --static "YOUR-HOSTNAME-HERE"
如果和以前一樣去修改 hosts 及 network 兩個檔案的話,反而沒辦法生效(也許還是有別的方法,但我沒查到),相當的討厭。
明明原本那樣也沒多複雜阿……搞得我還得另外查,大家都用一樣的方法不好嗎?