2015年5月27日 星期三

c++ stream 使用科學記號

[stream]<<std::scientific;

可以是cout或是任何fstream物件

這方法可以把輸出的數字全部用科學記號來輸出

雖然沒有什麼實質效用,但可以讓數據看起來美觀一點

還有其他的格式化方式可以到參考以下網站

http://en.cppreference.com/w/cpp/io/manip/fixed

https://www.bnw.com.tw/conference/viewtopic.php?f=76&t=5290

learn for awk

http://lalakiwe.myweb.hinet.net/Documents/awk/awk_4.html
從這網站上可以學習到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

We can convert C-style array to Eigen Matrix :

double C_arr[N*N]
MatrixXd EigenMatrix
EigenMatrix=Map<MatrixXd>(C_arr,N,N)

And there is the same way to covert Eigen Matrix to C-style:

Map<MatrixXd>(C_arr,N,N)=EigenMatrix

2015年5月20日 星期三

定時執行某段程式

這回被指派的工作是每八小時印出程式中的某個vector,我上網查了一些文章,學到了使用多執行緒來計時的方法,剛好現在又有重新碰了openmp,用起來還算方便。

過去我沒有分執行緒的習慣,通常都是直接在迴圈內做「if delte_time > T dosomething」這種檢查,但這會佔到主執行緒的時間,所以處理的速度總是會被拖慢,如果有一千萬個迴圈,那這個檢查就會執行一千萬次,雖然和矩陣運算相比微不足道,但總不是個好方法。

現在學習到的方法是多切一個執行緒出來,專門進行計時的工作,程式碼我放在這裡了,其中要注意的地方是「計時」的函式,不能用 ctime 的 clock() ,要使用 omp_get_wtime() 才可以,如果使用 clock() ,在主執行緒好像不會有問題,但在切割出來的副執行緒似乎就會跑太快。

vim 半透明模組 seiya.vim


我是參考這篇部落格找到這個模組的,它成功的解決了我長久以來的小問題,成功的把 vim 給半透明化了,效果相當的不錯。

seiya作者的github在此,我是透過 vundle 來安裝下來的,過程沒有出現任何問題,相當的順利,真是相當的不錯阿。

2015年5月19日 星期二

解決 vim 在 tmux 下底色問題




這件事情之前也困擾著我,今天上網查到了還算滿意的解答
根據第二篇回答,只要在 .vimrc 中加入 set t_ut= 這段即可解決
不過照理來說應該還是有辦法去修改 tmux 的設定來解決,畢竟出問題的不是vim,有種找錯仇家的感覺阿......

2015年5月18日 星期一

use vundle to install youcompleteme in vim

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

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 是相當古早且好用的東西,全名是Basic Linear Algebra Subprograms,一如其名,它是作為線性代數而生的東西。
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日 星期五

float 與 double 之比較

aaaaa
如圖,快很多呢,但 float 似乎派不太上用場,因為我平常都用double
據說是 nvidia 把 double 的功能給閹割掉了,連 gtx980 都不太行
如果需要這功能,就得去買 tesla 或 titan 這兩個系列的了,這對我來說是不太可能,總之關於這件事我會再三考慮的。

CUBLAS 和 Eigen 之比較

aaa

稍微進行了BLAS 3 的運算

測試的內容是兩個矩陣相乘,而測試的矩陣是 M(i,j)=i*N+j

橫軸為N,縱軸為所花費的時間,紅色線為Eigen而藍線為CUBLAS

使用的平台分別是i52410M 以及 GT 540M,Eigen並沒有使用平行運算的功能

這測試並不是很嚴謹,可以多少看到對於大的矩陣來說兩者有了將近兩倍的差距,沒有想像中差那麼多,但也算堪用了。

另外,同樣的Eigen程式在node33上面跑,結果似乎是比起用筆電跑慢了許多,這點雖然不是很意外,畢竟機房的電腦主要是拿來丟一大堆工作或做平行運算用的,但還是多少有點小失望。

下星期一會把同樣的CUDA程式丟到圖書館的電腦跑看看,希望GT640可以有著更顯著的進步。如果有很明顯的進步的話,我會考慮去買買看GTX980來玩玩看的,做運算是其一,跑一些遊戲應該也能用到。

2015年5月14日 星期四

[梗記事] 屋頂上的

DSCN0442

「那屋頂上的東西是什麼?」

「欸,哪個阿?」

「就是那黃黃的點狀物體阿」

「喔,那個是我爸的ㄒ……好痛!你幹嘛打我?」

「你一定又要說些怪東西了」

「沒有阿,我要說的是ㄒ……別再打了!」

「叫你別說你還說?!」

「我想他要說的是西哩控啦……」

「對啊,就是西哩控啦」

「西哩控?」

「是矽膠啦,拿來抓漏之類的東西,不過其實我也不是很懂」

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 兩個檔案的話,反而沒辦法生效(也許還是有別的方法,但我沒查到),相當的討厭。
明明原本那樣也沒多複雜阿……搞得我還得另外查,大家都用一樣的方法不好嗎?