看來終於可以在linux 64bit上使用flash player
(也有可能是小弟之前愚笨不知道怎麼使用)
目前在阿多比的官網並沒有提供64bit的下載
可是到阿多比的lab 可以找到flash player Square
flashplayer10_square
下載下來吧!for linux 64bit
#tar zxvf flashplayer10_2_p3_64bit_linux_111710.tar.gz
#mv libflashplayer.so /usr/lib64/iceweasel/plugins
#chmod 755 libflashplayer.so
#chown user:user libflashplayer.so
然後重新啟動iceweasel
上youtube看看吧!ok了
另外補充一下
如果要換新版本的square
要手動刪掉/usr/lib64/iceweasel/plugins裡的libflashplayer.so
再重覆上面的動作。
字型篇
打算開始寫這一系列的文章,原因是因為白底黑字的預設值,讓我看久了眼睛好酸...
還有那密密麻麻的字型.......會讓人家發瘋呀!!!!
參考文章: Emacs字体设置
第一篇先來說怎麼改字型吧....
1. #emacs /etc/X11/xorg.conf
Section "Module"
......
Load "freetype"
......
EndSection
Section "Files"
......
FontPath "/usr/share/fonts/truetype/"
......
EndSection
Section "Module"
......
Load "freetype"
......
EndSection
Section "Files"
......
FontPath "/usr/share/fonts/truetype/"
......
EndSection
2.restart Xwindow
3.xlsfonts |grep (想用的字型)
例如:
Landau:/home/zcli# xlsfonts |grep inconsolata
-unknown-inconsolata-medium-r-normal--0-0-0-0-c-0-iso10646-1
-unknown-inconsolata-medium-r-normal--0-0-0-0-c-0-iso8859-1
-unknown-inconsolata-medium-r-normal--0-0-0-0-c-0-iso8859-15
-unknown-inconsolata-medium-r-normal--0-0-0-0-m-0-iso10646-1
-unknown-inconsolata-medium-r-normal--0-0-0-0-m-0-iso8859-1
-unknown-inconsolata-medium-r-normal--0-0-0-0-m-0-iso8859-15
4.改成如下
-unknown-inconsolata-medium-r-normal--*-*-*-*-m-*-fontset-inconsolata
注意,用 xlsfonts 列出来的字体名称中,有些字段为 0,这些是可缩放的向量
字体,这些 0 不能保留,必须用数字或 `*' 号取代
不過建議是用fixed字體來編寫程式會比較合適
方法1:啟動時加入
1.#emacs ~/.emacs
(create-fontset-from-fontset-spec (concat "-unknown-inconsolata-medium-r-normal--*-*-*-*-m-*-fontset-inconsolata," "chinese-gb2312:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gb2312*-*," "mule-unicode-0100-24ff:-*-simsun-medium-r-*-*-14-*-*-*-c-*-iso10646*-*," "korean-ksc5601:-*-*-medium-r-*-*-14-*-*-*-*-*-ksc5601*-*," "chinese-cns11643-5:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*," "chinese-cns11643-6:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*," "chinese-cns11643-7:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*," "sjis:-*-medium-r-normal--14-*-jisx0208*-*"))
後面各段格式都是『字符集:字體』
第一段是指定ASCII英文字型
第二段則是中文也就是gb2312的字型
2.(set-default-font "fontset-inconsolata")
3.(setq default-frame-alist (append '((font . "fontset-inconsolata")) default-frame-alist))
方法2:寫入defaults
1.#emacs ~/.Xdefaults
Emacs.Fontset-0:-unknown-inconsolata-medium-r-normal--*-*-*-*-m-*-fontset-inconsolata,\ chinese-gb2312:-*-simsun-medium-r-*-*-14-*-*-*-c-*-*-*,\ mule-unicode-0100-24ff:-*-simsun-medium-r-*-*-14-*-*-*-c-*-iso10646*-*,\ korean-ksc5601:-*-*-medium-r-*-*-14-*-*-*-*-*-ksc5601*-*,\ chinese-cns11643-5:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\ chinese-cns11643-6:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\ chinese-cns11643-7:-*-simsun-medium-r-*-*-14-*-*-*-c-*-gbk*-*,\ sjis:-*-medium-r-normal--14-*-jisx0208*-*
Emacs.font: fontset-inconsolata
2.# xrdb -merge ~/.Xdefaults
PS.要解除defaults的話就
# xrdb -remove ~/.Xdefaults
Emacs 23 ( 我直接貼上來的...因為Debain目前只到22...留著參考)
Emacs23的字体设置与上述方法类似,但也有所不同。或许是因为emacs23的实现 比较独特,或许是emacs23的bug,按上述方法指定的中文字体无法起作用。因此, emacs23的字体设置采用下述方法:
仍然采用 create-fontset-from-fontset-spec 创建 fontset:
(create-fontset-from-fontset-spec "-*-courier-medium-r-normal-*-14-*-*-*-*-*-fontset-courier") (set-default-font "fontset-courier") (setq default-frame-alist (append '((font . "fontset-courier")) default-frame-alist)) 也可以在 ~/.Xdefaults 中这样设置:
Emacs.Fontset-0:-*-courier-medium-r-normal-*-14-*-*-*-*-*-fontset-courier Emacs.font:fontset-courier 两种方法取其一即可。
但是设置中文字体时,采用 set-fontset-font 分别指定各种 script 的字体:
(set-fontset-font "fontset-default" nil "-*-simsun-*-*-*-*-14-*-*-*-*-*-gb2312.1980-*" nil 'prepend) (set-fontset-font "fontset-courier" 'kana "-*-simsun-*-*-*-*-14-*-*-*-*-*-gbk-0" nil 'prepend) (set-fontset-font "fontset-courier" 'han "-*-simsun-*-*-*-*-14-*-*-*-*-*-gbk-0" nil 'prepend) (set-fontset-font "fontset-courier" 'cjk-misc "-*-simsun-*-*-*-*-14-*-*-*-*-*-gbk-0" nil 'prepend) Debian 字型
首先還是要把參考文章列出來:
Tsung's Blog
其實一開始是想把Debain的字型換成unbuntu的那種,也就是『Monaco Font』
首先就是下載字型吧 : Return of Monaco.ttf
# cp monaco.ttf /usr/share/fonts/truetype/
# fc-cache -f -v
然後就可以切換字型了
另外Tsung的文中還有提到其他好用的字型:
1.Debian 也新推出一個 Terminal 專用字型(apt-get install ttf-inconsolata)
2.Consolas
3.另外也記一下種Debain用的terminal字型(apt-get install xfonts-terminus)
Tsung言:
PS: 想挑字型太累, 可以: apt-get install gnome-specimen , 用 gnome-specimen 來挑喜歡的字型來用比較快唷
另外,一些中文字型的設定可以參考下面這篇文章!真的是寫的超好的
http://wiki.ubuntu-tw.org/index.php?title=UbuntuL10n
Debainfonts
fontconfig
有要看的文章:
如何裝ms字型
Tsung's Blog
其實一開始是想把Debain的字型換成unbuntu的那種,也就是『Monaco Font』
首先就是下載字型吧 : Return of Monaco.ttf
# cp monaco.ttf /usr/share/fonts/truetype/
# fc-cache -f -v
然後就可以切換字型了
另外Tsung的文中還有提到其他好用的字型:
1.Debian 也新推出一個 Terminal 專用字型(apt-get install ttf-inconsolata)
2.Consolas
3.另外也記一下種Debain用的terminal字型(apt-get install xfonts-terminus)
Tsung言:
PS: 想挑字型太累, 可以: apt-get install gnome-specimen , 用 gnome-specimen 來挑喜歡的字型來用比較快唷
另外,一些中文字型的設定可以參考下面這篇文章!真的是寫的超好的
http://wiki.ubuntu-tw.org/index.php?title=UbuntuL10n
Debainfonts
fontconfig
有要看的文章:
如何裝ms字型
掛載隨身硬碟的好工作!
就是你了!還看!
ntfs-3g
當debain不會自動掛載隨身碟的時候…
就要靠它啦!
#apt-get install ntfs-3g
commond:
mount
ntfs-3g /dev/sda1 /mnt/windows
unmonut
umount /mnt/windows
剩下其他指令可以查看
http://linux.die.net/man/8/mount.ntfs-3g
最後給自已一個tip
-o locale=zh_TW.utf8 (繁中)
-o locale=zh_CH.utf8 (簡中)
如此一來,沒辦法顯示中文的問題就解決了
ntfs-3g /dev/hda1 /windows/C/ -o silent,umask=0,locale=zh_TW.utf8
ntfs-3g
當debain不會自動掛載隨身碟的時候…
就要靠它啦!
#apt-get install ntfs-3g
commond:
mount
ntfs-3g /dev/sda1 /mnt/windows
unmonut
umount /mnt/windows
剩下其他指令可以查看
http://linux.die.net/man/8/mount.ntfs-3g
最後給自已一個tip
-o locale=zh_TW.utf8 (繁中)
-o locale=zh_CH.utf8 (簡中)
如此一來,沒辦法顯示中文的問題就解決了
ntfs-3g /dev/hda1 /windows/C/ -o silent,umask=0,locale=zh_TW.utf8
搞不懂的ubutnu
拿ubuntu的source.list安裝一些東西,結果debian不能上網了.......
好像root端被殺了..............
先不談拿ubuntu的apt來玩debian這件事
我了解到一件事
原來main之前的單字表示版本>"< 所以說要找不同版本的東西,就改source.list就可以了
10.4
deb http://tw.archive.ubuntu.com/ubuntu/ lucid main universe restricted multiverse deb http://tw.archive.ubuntu.com/ubuntu/ lucid-updates universe main multiverse restricted deb http://tw.archive.ubuntu.com/ubuntu/ lucid-proposed universe main multiverse restricted deb http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe main multiverse restricted deb http://tw.archive.ubuntu.com/ubuntu/ lucid-backports main multiverse restricted universe deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid main universe restricted multiverse deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe main multiverse restricted deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-updates universe main multiverse restricted deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-proposed universe main multiverse restricted deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-backports universe main multiverse restricted
9.10
# 國家高速網路與計算中心
deb ftp://os.nchc.org.tw/ubuntu karmic-updates main restricted universe multiverse
deb ftp://os.nchc.org.tw/ubuntu karmic main universe multiverse restricted
deb ftp://os.nchc.org.tw/ubuntu karmic-backports main universe multiverse restricted
deb ftp://os.nchc.org.tw/ubuntu karmic-proposed main universe multiverse restricted
deb ftp://os.nchc.org.tw/ubuntu karmic-security main restricted universe multiverse
deb ftp://os.nchc.org.tw/ubuntu karmic-proposed main universe multiverse restricted
deb ftp://os.nchc.org.tw/ubuntu karmic-security mai
9.04
deb http://gb.archive.ubuntu.com/ubuntu/ jaunty universe deb-src http://gb.archive.ubuntu.com/ubuntu/ jaunty universe deb http://gb.archive.ubuntu.com/ubuntu/ jaunty-updates universe deb-src http://gb.archive.ubuntu.com/ubuntu/ jaunty-updates universe
讓我的"大"A6耳機有聲音
看來許多華碩A系列產品都有這個問題,耳機沒有聲音。
目前測試 debain505 i386
#atp-get install alsa-utils
把以下文字
options snd-hda-intel model=z71v position_fix=1
貼到:
/etc/modprobe.d/alsa-base
看論壇ubuntu要貼到
/etc/modprobe.d/sound
重新開機,搞定!
debian 6
貼到
/etc/modprobe.d/alsa-base
/etc/modprobe.d/alsa-base.conf
/etc/modprobe.d/sound
reboot
目前測試 debain505 i386
#atp-get install alsa-utils
把以下文字
options snd-hda-intel model=z71v position_fix=1
貼到:
/etc/modprobe.d/alsa-base
看論壇ubuntu要貼到
/etc/modprobe.d/sound
重新開機,搞定!
debian 6
貼到
/etc/modprobe.d/alsa-base
/etc/modprobe.d/alsa-base.conf
/etc/modprobe.d/sound
reboot
linux 常用的播放器
兩個好用的linux音樂播放器
Amarok
Exaile
兩個都非常不錯,而且apt就有了,方便又好用的東西
另外下面留給.......影音播放器>"< 目前還找不到比較好又方便的播放器 不過目前用的Mplayer,debain原有的播放器 想看rmvb可以參考以下網頁
以下內容取自 How to play rmvb in mplayer
This tutorial will take you step by step through installing all of the software necessary to play rmvb (RealMedia Variable Bitrate) files in Ubuntu Linux.
Though the steps and screenshots are specific to Ubuntu, they will likely be similar for other versions of Linux. With that said, be sure to read the MPlayer README file if you’re not using Ubuntu. Similar to some of the other tutorials on Simplehelp, this is almost certainly not the only way to play .rmvb files in Ubuntu, but it’s the easiest way I could find. If you know of a easier method, by all means please feel free to leave a comment.
Amarok
Exaile
兩個都非常不錯,而且apt就有了,方便又好用的東西
另外下面留給.......影音播放器>"< 目前還找不到比較好又方便的播放器 不過目前用的Mplayer,debain原有的播放器 想看rmvb可以參考以下網頁
以下內容取自 How to play rmvb in mplayer
This tutorial will take you step by step through installing all of the software necessary to play rmvb (RealMedia Variable Bitrate) files in Ubuntu Linux.
Though the steps and screenshots are specific to Ubuntu, they will likely be similar for other versions of Linux. With that said, be sure to read the MPlayer README file if you’re not using Ubuntu. Similar to some of the other tutorials on Simplehelp, this is almost certainly not the only way to play .rmvb files in Ubuntu, but it’s the easiest way I could find. If you know of a easier method, by all means please feel free to leave a comment.
- The first step in playing .rmvb files in Ubuntu is to use the Synaptic Package Manager to install MPlayer. When you mark MPlayer for installation, you’ll be prompted to install additional software packages (if they’re not already installed). click to enlarge
- After MPlayer has been installed, exit out of the Synaptic Package Manager and visit the MPlayer binary codec download page. Download the codec package for your platform (for example, if you’re using a 32bit Intel or AMD processor, download the Linux x86 package). Save the file to your desktop (or home folder). Once the download has completed, double-click that file. Select the folder to uncompress, and click the Extract button.
click to enlarge
- Choose a location to extract the files (your desktop is ideal) and again click Extract. click to enlarge
- Make sure the files extracted correctly. They’ll be in a folder titled essential-date.
- Open up a Terminal by selecting Applications -> Accessories -> Terminal.
- Enter the following commands (and your password when prompted):
cd Desktop
cd essential-date
sudo mkdir /usr/lib/codecs
sudo cp * /usr/lib/codecs
click to enlarge
- NOTE: you may need to install libstdc++5 to get .rmvb files to play. Even though it might not be necessary for you, it can’t hurt to install (the package isn’t very big). Run the command: sudo apt-get install libstdc++5 in a Terminal, or use Synaptic and search for libstdc++5. Thanks to everyone who commented (see comments below) for the tip.
- Launch MPLayer by selecting Applications -> Sound & Video -> MPlayer Movie Player. Right-click in the Mplayer – Video window and select Preferences from the menu.
- Select the Video tab and change the Available drivers: to x11 X11 (XImage/Shm). click to enlarge
- Select the Codecs & demuxer tab and change the Video codec family: to RealVideo decoder and the Audio codec family: to FFmpeg/libavcodec audio decoders. When you’re done, click OK and close down MPlayer. click to enlarge
- Locate one of your .rmvb files, right-click it and select Properties.
- Select the Open With tab and change whatever the default is to MPlayer Movie Player. Click Close. click to enlarge
- Double-click any of your .rmvb files and they should open up in MPlayer and start playing.
linux 掛載光碟
#apt-get install fuseiso
#mkdir DVDISO //創造任意一個資料夾
#fuseiso DVD.iso DVDISO //掛載到DVDISO
#cd DVDISO
#fusermount -u DVDISO //卸載
#mkdir DVDISO //創造任意一個資料夾
#fuseiso DVD.iso DVDISO //掛載到DVDISO
#cd DVDISO
#fusermount -u DVDISO //卸載
c語言常用IO參數
%d %i 十進位整數
%u unsigned 十進位整數
%x unsigned 16進位整數,小寫表示(a-f)
%X unsigned 16進位整數,大寫表示(A-F)
%o unsigned 8進位整數
以上加-和數字表示左對齊最少幾位,如%-9d表示左切齊最少印9位
以上加+和數字表示右對齊最少幾位,如%+9d表示右切齊最少印9位,不足處補空白
以上加+和0開頭的數字表示右對齊最少幾位,不足補0,如%+09d表示右切齊最少印9位,不足處補0
%ld 以十進位印出long
%lld 以十進位印出long long
%f浮點數float
%e %E科學表示法浮點數double,%e小寫 %E大寫
%g %G依照double的數值自動選擇以%f或%e格式印出
以上加-和具有小數點的數字表示左對齊最少幾位,如%-9.2f表示左切齊最少印9位,其中小數點以下2位
以上加+和具有小數點的數字表示右對齊最少幾位,如%=9.2f表示右切齊最少印9位,其中小數點以下2位
%c unsigned char
%s string(array of char terminated by 0)
%p pointer to void
%% 印出%
%u unsigned 十進位整數
%x unsigned 16進位整數,小寫表示(a-f)
%X unsigned 16進位整數,大寫表示(A-F)
%o unsigned 8進位整數
以上加-和數字表示左對齊最少幾位,如%-9d表示左切齊最少印9位
以上加+和數字表示右對齊最少幾位,如%+9d表示右切齊最少印9位,不足處補空白
以上加+和0開頭的數字表示右對齊最少幾位,不足補0,如%+09d表示右切齊最少印9位,不足處補0
%ld 以十進位印出long
%lld 以十進位印出long long
%f浮點數float
%e %E科學表示法浮點數double,%e小寫 %E大寫
%g %G依照double的數值自動選擇以%f或%e格式印出
以上加-和具有小數點的數字表示左對齊最少幾位,如%-9.2f表示左切齊最少印9位,其中小數點以下2位
以上加+和具有小數點的數字表示右對齊最少幾位,如%=9.2f表示右切齊最少印9位,其中小數點以下2位
%c unsigned char
%s string(array of char terminated by 0)
%p pointer to void
%% 印出%
用C來寫複數
GNU C99以前通常是用結構(struct)來表示,簡單的例子如下
struct my_complex {
double real;
double imag;
};
int main(void){
struct my_complex z = {42.0, 42.0};
printf("z = %f + %fI\n",x.real, x.imag);
return 0;
}
#include < complex.h >
int main (void){
complex double z = 42.0 + 42.0*I;
printf("z = %f + %fI\n", creal(z), cimag(z));
return 0;
}
------------------------------------------------------#include < stdio.h >
struct my_complex {
double real;
double imag;
};
int main(void){
struct my_complex z = {42.0, 42.0};
printf("z = %f + %fI\n",x.real, x.imag);
return 0;
}
-----------------------------------------------------
C99提供了一個方便的表示方法,在complex.h裡面#include < stdio.h >
#include < complex.h >
int main (void){
complex double z = 42.0 + 42.0*I;
printf("z = %f + %fI\n", creal(z), cimag(z));
return 0;
}
-----------------------------------------------------
— Function: long double creall (complex long double z)These functions return the real part of the complex number z.
— Function: long double cimagl (complex long double z)These functions return the imaginary part of the complex number z.
詳細的內容可以參考:
http://www.gnu.org/s/libc/manual/html_node/Complex-Numbers.html#Complex-Numbers
apt 常用指令
本文取自:http://plog.longwin.com.tw/my_note-unix/2005/05/01/use_apt
伺服器列表
/etc/apt/source.list
系統升級相關:
aptitude
=======
1.aptitude install套件名稱
單純安裝指定套件
其他的可以參考apt-get
=======
apt-get
=======
1.apt-get update
更新套件資訊,要升級之前,最好都先執行一次本指令和 Server 端的資訊同步一下
2.apt-get check
檢查你系統上套件的相依性狀況
3.apt-get dist-upgrade 和 apt-get upgrade
執行整個升級動作,建議用 apt-get dist-upgrade 比較好
4.apt-get install 套件名稱
安裝某一個套件及其相關的套件
5.apt-get remove 套件名稱 (含設定檔等完整移除: apt-get --purge remove 套件名稱)
移除某套件,和 rpm -e 功能一樣,同時還會幫您把相關的套件一併移除
6.apt-get source 套件名稱
抓回 source rpm
例: apt-get source --compile zhcon
抓回 source rpm 並編譯成 binary rpm
--compile 參數就如同 rpm -ba 一般
7.apt-get clean
刪除下載回來的檔案
=========
apt-cache
=========
1.apt-cache showpkg
顯示套件資訊
例: apt-cache showpkg zhcon
2.apt-cache stats
顯示相關的統計資訊
3.apt-cache dump
顥示 cache 中每個套件的簡短資訊
4.apt-cache unmet
檢查所有未符合相依性的相關資訊
5.apt-cache show
顯示套件資訊,同 rpm -qi 一般
6.apt-cache search
尋找檔案 例: apt-cache search zhcon
7.apt-cache depends
顯示套件的相依性 例: apt-cache depends zhcon
8.apt-cache pkgnames
尋找符合的套件名稱 例: $ apt-cache pkgnames openss
openssh-askpass
openssl096
openssl-perl
openssl095a
openssl-python
openssh-clients
openssl-devel
openssh-askpass-gnome
openssh
openssl
openssh-serve
==========
apt-config
==========
1.apt-config dump
顯示目前的設定狀態
參考
http://www.linux.org.tw/~candyz/APT-HOWTO_CLE.txt
http://www.debian.org/doc/manuals/apt-howto/
其它備註
------------------------------------------------------------------
apt-get install package --reinstall 重新安裝套件
apt-get -f install 修復安裝 "-f = --fix-missing"
apt-cache rdepends package 是查看該套件被哪些套件依賴
apt-get build-dep package 安裝相關的編譯環境
apt-get source package 下載該套件的原始碼
apt-get clean && apt-get autoclean 清理沒用的套件
apt-get check 檢查是否有損壞的相依性
------------------------------------------------------------------
aptitude
套件管理程式,不喜歡打上述指令可以用這個。
伺服器列表
/etc/apt/source.list
系統升級相關:
- apt-get upgrade => 軟體升級
- apt-get dist-upgrade => 系統升級
- 更多詳細可見: SoftwareUpgrading
aptitude
=======
1.aptitude install套件名稱
單純安裝指定套件
其他的可以參考apt-get
=======
apt-get
=======
1.apt-get update
更新套件資訊,要升級之前,最好都先執行一次本指令和 Server 端的資訊同步一下
2.apt-get check
檢查你系統上套件的相依性狀況
3.apt-get dist-upgrade 和 apt-get upgrade
執行整個升級動作,建議用 apt-get dist-upgrade 比較好
4.apt-get install 套件名稱
安裝某一個套件及其相關的套件
5.apt-get remove 套件名稱 (含設定檔等完整移除: apt-get --purge remove 套件名稱)
移除某套件,和 rpm -e 功能一樣,同時還會幫您把相關的套件一併移除
6.apt-get source 套件名稱
抓回 source rpm
例: apt-get source --compile zhcon
抓回 source rpm 並編譯成 binary rpm
--compile 參數就如同 rpm -ba 一般
7.apt-get clean
刪除下載回來的檔案
=========
apt-cache
=========
1.apt-cache showpkg
顯示套件資訊
例: apt-cache showpkg zhcon
2.apt-cache stats
顯示相關的統計資訊
3.apt-cache dump
顥示 cache 中每個套件的簡短資訊
4.apt-cache unmet
檢查所有未符合相依性的相關資訊
5.apt-cache show
顯示套件資訊,同 rpm -qi 一般
6.apt-cache search
尋找檔案 例: apt-cache search zhcon
7.apt-cache depends
顯示套件的相依性 例: apt-cache depends zhcon
8.apt-cache pkgnames
尋找符合的套件名稱 例: $ apt-cache pkgnames openss
openssh-askpass
openssl096
openssl-perl
openssl095a
openssl-python
openssh-clients
openssl-devel
openssh-askpass-gnome
openssh
openssl
openssh-serve
==========
apt-config
==========
1.apt-config dump
顯示目前的設定狀態
參考
http://www.linux.org.tw/~candyz/APT-HOWTO_CLE.txt
http://www.debian.org/doc/manuals/apt-howto/
其它備註
- 移除多餘套件(Library): apt-get remove --purge `deborphan`
------------------------------------------------------------------
apt-get install package --reinstall 重新安裝套件
apt-get -f install 修復安裝 "-f = --fix-missing"
apt-cache rdepends package 是查看該套件被哪些套件依賴
apt-get build-dep package 安裝相關的編譯環境
apt-get source package 下載該套件的原始碼
apt-get clean && apt-get autoclean 清理沒用的套件
apt-get check 檢查是否有損壞的相依性
------------------------------------------------------------------
aptitude
套件管理程式,不喜歡打上述指令可以用這個。
解決 /usr/bin/ld: cannot find -lxxx 問題
問題:
在linux環境編譯應用程式或lib的source code時常常會出現如下的錯誤訊息:
其命名規則是:lib+庫名(即xxx)+.so。
會發生這樣的原因有以下三種情形:
gcc命令祥解
解決方法:
(1)先判斷在/usr/lib 下的相對應的函式庫文件(.so) 的 symbolic link 是否正確
若不正確改成正確的連結目標即可解決問題。
(2)若不是 symbolic link 的問題引起,而是系統缺少相對應的lib安裝lib即可解決。
(3)如何安裝缺少的lib:
以上面三個錯誤訊息為例:
先搜尋相對應的LIB再進行安裝的作業如:
在進行輸入法gcin的 Source Code的編譯時出現以下的錯誤訊息:
lib(.so檔)的symbolic link 不正確
解決方法如下:
解法如下:
apt-get install libxtst-dev
內容取自:波哥的IT私房菜
在linux環境編譯應用程式或lib的source code時常常會出現如下的錯誤訊息:
Example:
- /usr/bin/ld: cannot find -lxxx
其中xxx即表示函式庫文件名稱,如上例的:libc.so。
- /usr/bin/ld: cannot find -lc
其命名規則是:lib+庫名(即xxx)+.so。
會發生這樣的原因有以下三種情形:
1 系統沒有安裝相對應的lib對於上述三種原因有一篇文章寫的很棒可參考這一篇文章的第4點:
2 相對應的lib版本不對
3 lib(.so檔)的symbolic link 不正確,沒有連結到正確的函式庫文件(.so)
gcc命令祥解
解決方法:
(1)先判斷在/usr/lib 下的相對應的函式庫文件(.so) 的 symbolic link 是否正確
若不正確改成正確的連結目標即可解決問題。
(2)若不是 symbolic link 的問題引起,而是系統缺少相對應的lib安裝lib即可解決。
(3)如何安裝缺少的lib:
以上面三個錯誤訊息為例:
錯誤1缺少libc的LIB以Ubuntu為例:
先搜尋相對應的LIB再進行安裝的作業如:
apt-cache search libc-dev實例:
在進行輸入法gcin的 Source Code的編譯時出現以下的錯誤訊息:
/usr/bin/ld: cannot find -lXtst經檢查後發現是:
lib(.so檔)的symbolic link 不正確
解決方法如下:
cd /usr/lib如果在/usr/lib的目錄下找不到 libXtst.so 檔,那麼就表示系統沒有安裝libXtst的函式庫。
ln -s libXtst.so.6 libXtst.so
解法如下:
apt-get install libxtst-dev
內容取自:波哥的IT私房菜
常用的NVCC指令
1。-deviceemu
用cpu模擬模式。常用於debug,但是要小心threads數目。單純就是software contral
2。-use_fast_math
將可以用GPU硬體算數學涵數都用GPU計算
3。-maxrregcount N
限制每一個threads所用的register大小。if kernel超過了,就會存在local memory
4。--ptxas-options=-v
回報用的memory量。
5。-arch sm_xx xx是CUDA版本(滿多涵數都要指定版本)
指定compiler的版本
6。-l + lib名稱 ex:-lcublas
連結標頭檔
7。-l
指定尋找的lib路徑
8。-I
指定尋找的標頭檔路徑
2010/11/27 更新部分
nvcc -g -I/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/lib/linux cudaapi.cu -lrt /home/zcli/NVIDIA_GPU_Computing_SDK/C/lib/libcutil_x86_64.a
今天在試cutil.h一些計時的api時,一直undefine reference,一整個快發瘋,不是連結lib path跟header path就好了嗎?看了一個下午的網路,還是搞不懂為什麼...
大概知道就是我沒有連結到lib ,加了-lrt那段,意思好像是靜態連結資料庫的作法,實際作用完全搞不懂。再找機會來研究研究。
另外補充一下,可以直接打-lcutil_x86_64,就編過了....好像是因為cudatookit在3.0版的名稱改變了T_T
其他有用到再打上來>"<
用cpu模擬模式。常用於debug,但是要小心threads數目。單純就是software contral
2。-use_fast_math
將可以用GPU硬體算數學涵數都用GPU計算
3。-maxrregcount N
限制每一個threads所用的register大小。if kernel超過了,就會存在local memory
4。--ptxas-options=-v
回報用的memory量。
5。-arch sm_xx xx是CUDA版本(滿多涵數都要指定版本)
指定compiler的版本
6。-l + lib名稱 ex:-lcublas
連結標頭檔
7。-l
指定尋找的lib路徑
8。-I
指定尋找的標頭檔路徑
2010/11/27 更新部分
nvcc -g -I/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/lib/linux cudaapi.cu -lrt /home/zcli/NVIDIA_GPU_Computing_SDK/C/lib/libcutil_x86_64.a
今天在試cutil.h一些計時的api時,一直undefine reference,一整個快發瘋,不是連結lib path跟header path就好了嗎?看了一個下午的網路,還是搞不懂為什麼...
大概知道就是我沒有連結到lib ,加了-lrt那段,意思好像是靜態連結資料庫的作法,實際作用完全搞不懂。再找機會來研究研究。
另外補充一下,可以直接打-lcutil_x86_64,就編過了....好像是因為cudatookit在3.0版的名稱改變了T_T
其他有用到再打上來>"<
fflush( )
一般電腦在執行IO的時候都會先將資料存在buffer裡面
等到system有空的時候才會讓資料寫入硬碟裡。因此我們要確保資料已經寫入
這時候就可以用fflush這個function。
以下是在論壇找到別人回覆的資料:
flush(stdin)刷新標準輸入緩衝區,把輸入緩衝區裡的東西丟棄fflush(stdout)刷新標準輸出緩衝區,把輸出緩衝區裡的東西打印到標準輸出設備上。
Example:
取自:http://www.cplusplus.com/reference/clibrary/cstdio/fflush/
/* fflush example */
#include
char mybuffer[80];
int main()
{
FILE * pFile;
pFile = fopen ("example.txt","r+");
if (pFile == NULL) perror ("Error opening file");
else {
fputs ("test",pFile);
fflush (pFile); // flushing or repositioning required
fgets (mybuffer,80,pFile);
puts (mybuffer);
fclose (pFile);
return 0;
}
}
在linux上可以下sync這個指令。讓他將"記憶體"的內容寫入"硬碟"。
並不是IO的buffer..........。
0.0f ????????
0.0跟0.0f有什麼不一樣?
在C語言上印出來的結果都是一樣的?差在那邊?
0.00 is a double (64 bits)
0.0f is a float (32 bits)
嗯…就這麼簡單
在C語言上印出來的結果都是一樣的?差在那邊?
0.00 is a double (64 bits)
0.0f is a float (32 bits)
嗯…就這麼簡單
把i386.deb的套件安裝在amd64的PC上
本文取自:沙中's Blog
方法1:以Scratch1.4為例
方法2:以安裝realplayer 11為例
測試心得:無法成功在debian執行…
方法1:以Scratch1.4為例
- 下載scratch_1.4.0.debian.12_i386.deb 並複製到[家目錄]底下
- 到http://frozenfox.freehostia.com/cappy/ 下載getlibs-all.deb 後,快按2次安裝
- 將下載的檔案copy到家目錄下
- 貼上 sudo dpkg -i --force-all scratch_1.4.0.debian.12_i386.deb
方法2:以安裝realplayer 11為例
- 先安裝i386 lib
sudo apt-get install ia32-libs* 或套件庫裡輸入 "ia32-libs"
- 安裝deb
sudo dpkg --force-architecture -i 套件名
- ex: 安裝realplayer 11將檔案放到[家目錄]資料夾下
sudo dpkg --force-architecture -i RealPlayer11GOLD.deb
- sudo dpkg -P 套件名
- ex: 移除強制安裝的realplayer11
sudo dpkg -P realplay
測試心得:無法成功在debian執行…
debian dpkg 常用指令
常用 Dpkg 指令表:
注意:更多選項可通過 dpkg -h 查詢,有些指令需要超級用戶權限才能執行。
命令 | 作用 |
dpkg -i package.deb | 安裝包 |
dpkg -r package | 刪除包 |
dpkg -P package | 刪除包(包括配置文件) |
dpkg -L package | 列出與該包關聯的文件 |
dpkg -l package | 顯示該包的版本 |
dpkg –unpack package.deb | 解開 deb 包的內容 |
dpkg -S keyword | 搜索所屬的包內容 |
dpkg -l | 列出當前已安裝的包 |
dpkg -c package.deb | 列出 deb 包的內容 |
dpkg –configure package | 配置包 |
在 Debian 使用 alien 處理 RPM 套件:
alien 可處理 .deb、.rpm、.slp、.tgz 等檔案格式, 進行轉檔或安裝.
於 Debian 安裝非 Debian 套件時, 可使用 alien 進行安裝.
安裝 alien 套件: apt-get install alien
- 在 Debian 安裝 RPM 套件: alien -i quota-3.12-7.i386.rpm
- 製作成 deb 的套件格式: alien -d quota-3.12-7.i386.rpm
- 製作成 rpm 的套件格式: alien -r quota_3.12-6_i386.deb
備註:rpm vs dpkg
安裝
目的 rpm 用法 dpkg 用法 安裝指定套件 rpm -i pkgfile.rpm dpkg -i pkgfile.deb
查詢
目的 rpm 用法 dpkg 用法 顯示所有已安裝的套件名稱 rpm -qa dpkg -l (小寫 L) 顯示套件包含的所有檔案 rpm -ql pkgname (小寫 L) dpkg -L pkgname 顯示特定檔案所屬套件名稱 rpm -qf /path/to/file dpkg -S /path/to/file 查詢套件檔案資訊 rpm -qip pkgfile.rpm (顯示套件資訊)
rpm -qlp pkgfile.rpm (小寫 L, 顯示套件內所有檔案)dpkg -I pkgfile.deb (大寫 I )
dpkg -c pkgfile.deb顯示指定套件是否安裝 rpm -q pkgname (只顯示套件名稱)
rpm -qi pkgname (顯示套件資訊)dpkg -l pkgname (小寫 L, 只列出簡潔資訊)
dpkg -s pkgname (顯示詳細資訊)
dpkg -p pkgname (顯示詳細資訊)
移除
目的 rpm 用法 dpkg 用法 移除指定套件 rpm -e pkgname dpkg -r pkgname (會留下套件設定檔)
dpkg -P pkgname (完全移除)
關於#include引用方式
在 CUDA_NVIDIA_GPU_Computing_SDK 中,有部分API可以使用可以偵錯很方便
都在cutil.h 中,但是在nvcc的library path 與 include path中是沒有預設的。
(我猜是因為SDK可以用可以不用裝,而且每個人裝的路徑不同)
因此可以從nvcc_2.0.pdf中查到一些option,可以用,下例中紅色的部分。
詳細內容可以在~/NVIDIA_GPU_Computing_SDK/C/common/inc中找到
//include project file
#include
int main(){
int msize = 100;
//allocate memory
float *h_a;
h_a = (float*)malloc(msize*sizeof(float));
float *d_a;
cudaMalloc((void**)&d_a,msize*sizeof(float));
//test API....
CUDA_SAFE_CALL(cudaMemcpy(d_a,h_a,msize*sizeof(float),cudaMemcpyHostToDevice));
//free memory
free(h_a);
cudaFree(d_a);
return 0;
}
因為沒有library與headfile所以如下:
nvcc -g -I/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/lib/linux cudaapi.cu
都在cutil.h 中,但是在nvcc的library path 與 include path中是沒有預設的。
(我猜是因為SDK可以用可以不用裝,而且每個人裝的路徑不同)
因此可以從nvcc_2.0.pdf中查到一些option,可以用,下例中紅色的部分。
詳細內容可以在~/NVIDIA_GPU_Computing_SDK/C/common/inc中找到
//include project file
#include
int main(){
int msize = 100;
//allocate memory
float *h_a;
h_a = (float*)malloc(msize*sizeof(float));
float *d_a;
cudaMalloc((void**)&d_a,msize*sizeof(float));
//test API....
CUDA_SAFE_CALL(cudaMemcpy(d_a,h_a,msize*sizeof(float),cudaMemcpyHostToDevice));
//free memory
free(h_a);
cudaFree(d_a);
return 0;
}
因為沒有library與headfile所以如下:
nvcc -g -I/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/zcli/NVIDIA_GPU_Computing_SDK/C/common/lib/linux cudaapi.cu
CUDA "unspecified launch failure"
本文章取自:http://www.herikstad.net/2009/05/cuda-unspecified-launch-failure.html
The error "unspecified launch failure" usually means the same as "segment fault" for host code. Check that your code does not try to access any areas outside the arrays being used. A common mistake is using 'the whole idx' instead of just the thread id to access shared memory. Here's an example:
will give you an error and should look like this:
__global__ void kernel(float *in,float *out){
//declare share memory
//extern is use kernel set memory size
extern __shared__ float tempsa[];
//set global index
int globalIdx = blockIdx.x*blockDim.x+threadIdx.x;
tempsa[threadIdx.x]= in[globalIdx];
__syncthreads();
out[globalIdx] = tempsa[threadIdx.x];
__syncthreads();
return ;
}
The error "unspecified launch failure" usually means the same as "segment fault" for host code. Check that your code does not try to access any areas outside the arrays being used. A common mistake is using 'the whole idx' instead of just the thread id to access shared memory. Here's an example:
int idx = blockIdx.x * blockDim.x + threadIdx.x;
shared[idx] = input[idx];
will give you an error and should look like this:
int idx = blockIdx.x * blockDim.x + threadIdx.x;
int tid = threadIdx.x;
shared[tid] = input[idx];
注意:shared memory 的 index 只能用threadIdx。
因為shared memory load data 是以一個 half-warp load。
My kernel...
__global__ void kernel(float *in,float *out){
//declare share memory
//extern is use kernel set memory size
extern __shared__ float tempsa[];
//set global index
int globalIdx = blockIdx.x*blockDim.x+threadIdx.x;
tempsa[threadIdx.x]= in[globalIdx];
__syncthreads();
out[globalIdx] = tempsa[threadIdx.x];
__syncthreads();
return ;
}
CUDA 程式設計(2) -- SIMT概觀
文章取自PTT videcard版 作者:a5000ml
※ 第二章 SIMT 概觀 ※
所謂 SIMT (single instruction multi threads) 指的是單一指令對應多執行緒的計算機架構,利用硬體的 thread 來隱藏 I/O 的延遲 (效果有點類似之前 Intel 的hyper-threading,不過那不是 single instruction),nVidia 進一步地讓這些執行緒可由程式控制,用群組的方式讓一堆執行緒執行相同的指令,並利用超多核心來強化它(例如 8800 GTX 有 128 顆、GTX280 有 240 顆)。
簡而言之,它是把超級電腦的平行架構,濃縮到單晶片中,所以產生這樣的效能(例如我實驗室裡的 kernel,在 GTX280上跑的效能是 Intel Q9300 的 30 多倍,這測量的時間是實際跑完的時間,用 CPU 的高精度 timer 測量出來的,對照的是用intel 自家的 compiler 進行 SSE3 最佳化過的)。
不過剛開始進入這多執行緒的模型,還真的有點不太習慣哩。
◆ CUDA 的平行化程式設計模型
名詞定義
網格(Grid) :包含數個區塊的執行單元
區塊(Block) :包含數個執行緒的執行單元
執行緒(Thread):最小的處理單元 (實際寫程式的環境)
CUDA 的平行化模型是將核心交由一組網格執行,再將網格切成數個區塊,然後每個區塊
再分成數個執行緒,依次分發進行平行運算。
◆ 內建變數
我們可以透過內建變數來辨識每個執行緒
基本的內建變數如下,它們只可以使用在 kernel 的程式碼中:
uint3 gridDim :網格大小 (網格包含的區塊數目)
uint3 blockIdx :區塊索引 (區塊的ID)
uint3 blockDim :區塊大小 (每個區塊包含的執行緒數目)
uint3 threadIdx:執行緒索引 (執行緒的ID)
其中 uint3 為 3D 的正整數型態
struct uint3{
unsigned int x;
unsigned int y;
unsigned int z;
};
另外還有
struct dim3{
int x;
int y;
int z;
};
可以運用它來實做更高層次的平行運算結構,不過現階段,先不要管這種複雜的結構,
把它當成單一正整數即可,也就是 y 和 z 都當成是 1,只用 uint3 的 x。
◆ 網格 & 區塊大小 (gridDim, blockDim)
CUDA 透過指定網格和區塊的大小形成平行化的程式陣列,總執行緒數目為網格大小和區塊大小的乘積,而 gridDim, blockDim 這兩個變數在 kernel 函式中為內建的唯讀變數,可直接讀取
總執行緒數目 = 網格大小(gridDim) x 區塊大小(blockDim)
例如下圖為 (網格大小=3, 區塊大小=4) 所形成的核心,它具有 12 個獨立的執行緒
+------------+-----------+-----------------------+
| | | thread 0 (id 0) |
| | +----------------------+
| | | thread 1 (id 1) |
| | block 0 +----------------------+
| | | thread 2 (id 2) |
| | +----------------------+
| | | thread 3 (id 3) |
| +-----------+----------------------+
| | | thread 0 (id 4) |
| | +---------------------+
| | | thread 1 (id 5) |
| grid | block 1 +---------------------+
| (kernel) | | thread 2 (id 6) |
| | +---------------------+
| | | thread 3 (id 7) |
| +-----------+----------------------+
| | | thread 0 (id 8) |
| | +---------------------+
| | | thread 1 (id 9) |
| | block 2 +----------------------+
| | | thread 2 (id 10) |
| | +----------------------+
| | | thread 3 (id 11) |
+-----------+-----------+-----------------------+
(圖二)
◆ 呼叫 kernel 的語法
在 CUDA 中呼叫 kernel 函式的語法和呼叫一般 C 函式並沒什麼太大的差異,
只是多了延伸的語法來指定網格和區塊大小而已:
kernel_name <<>> (arg1, arg2, ...);
^^^^^^^^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^
核心函式名 網格大小 區塊大小 函式要傳的引數(和C相同)
所以只是多了 <<>> 指定大小而已 ^^y
其中 gridDim 和 blockDim 可以是固定數字或動態變數,例如
(1) 固定數字
ooxx_kernel<<<123,32>>>(result, in1, in2);
(2) 動態變數
int grid = some_function_g(); //計算網格大小
int block = some_function_b(); //計算區塊大小
ooxx_kernel<<>>(result, in1, in2);
◆ 區塊 & 執行緒索引 (blockIdx, threadIdx)
我們可以用區塊和執行緒索引來定出正在執行的程式位置,以決定該載入什麼樣的資料,而 blockIdx, threadIdx 這兩個變數和 gridDim, blockDim 一樣,在 kernel 中也是內建的唯讀變數,可直接讀取
例如在(圖二)中,我們要定出每一個小兵的唯一的 ID,可用下面這段程式碼
int id = blockIdx.x*blockDim.x + threadIdx.x;
要產生(圖二)配置的 kernel 呼叫為
kernel<<<3,4>>>(arguments);
其行為如下
(1) 傳入的網格和區塊大小為 1D 正整數,所以 uint3 中只有 x 有用到,其它 y=z=1
(2) 網格大小 gridDim.x = 3 (每個網格包含 3 個區塊)
(3) 區塊大小 blockDim.x = 4 (每個區塊包含 4 個執行緒)
(4) 區塊索引 blockIdx.x = 0,1,2 (每個 thread 看到的不一樣)
(5) 執行緒索引 threadIdx.x = 0,1,2,3 (每個 thread 看到的不一樣)
(6) 區塊基底 blockIdx.x*blockDim.x = 0,4,8
(7) 區塊基底加上執行緒索引 id = blockIdx.x*blockDim.x + threadIdx.x
= 0,1,2,3, 4,5,6,7, 8,9,10,11
所以我們便可得到一個全域的索引,即每一個小兵的唯一的 ID (圖二中的 id 欄)。
◆ kernel 函式的語法
用 CUDA 寫 kernel 函式寫一般 C 函式也是沒什麼太大的差異,只是多了延伸語法來
加入一些特殊功能,並且標明這個函式是 kernel 而已:
__global__ void kernel_name(type1 arg1, type2 arg2, ...){
...函式內容...
};
其中
(1) __global__ : 標明這是 kernel 的延伸語法
(2) void : kernel 傳回值只能是 void (要傳東西出來請透過引數)
(3) kernel_name : 函式名稱
(4) type1 arg1, type2 arg2, ... : 函式引數 (和 C 完全相同)
(5) 函式內容 : 跟寫 C 或 C++ 一樣 (但不能夠呼叫主機函式)
(6) global 函式只能在 host 函式中呼叫,不能在其它 global 中呼叫。
◆ 小結
以上是 CUDA 平行化程式設計的概觀,和傳統 C/C++ 的差異便是它這種的 SIMT 結構,
也許你會覺得奇怪,為什麼要分成兩層的 grid/block 結構,直接一層就配多個 thread
不是更簡單,這牽涉到它硬體上的細節以及成本問題(後面章節會解釋),再者單層結構
不見得有效率,會增加同步化時執行緒等待的問題,使用兩層結構,可以使 block 單元
彈性的選擇同時或者循序執行,增加往後硬體發展和軟體重用的彈性。
※ 第二章 SIMT 概觀 ※
所謂 SIMT (single instruction multi threads) 指的是單一指令對應多執行緒的計算機架構,利用硬體的 thread 來隱藏 I/O 的延遲 (效果有點類似之前 Intel 的hyper-threading,不過那不是 single instruction),nVidia 進一步地讓這些執行緒可由程式控制,用群組的方式讓一堆執行緒執行相同的指令,並利用超多核心來強化它(例如 8800 GTX 有 128 顆、GTX280 有 240 顆)。
簡而言之,它是把超級電腦的平行架構,濃縮到單晶片中,所以產生這樣的效能(例如我實驗室裡的 kernel,在 GTX280上跑的效能是 Intel Q9300 的 30 多倍,這測量的時間是實際跑完的時間,用 CPU 的高精度 timer 測量出來的,對照的是用intel 自家的 compiler 進行 SSE3 最佳化過的)。
不過剛開始進入這多執行緒的模型,還真的有點不太習慣哩。
◆ CUDA 的平行化程式設計模型
名詞定義
網格(Grid) :包含數個區塊的執行單元
區塊(Block) :包含數個執行緒的執行單元
執行緒(Thread):最小的處理單元 (實際寫程式的環境)
CUDA 的平行化模型是將核心交由一組網格執行,再將網格切成數個區塊,然後每個區塊
再分成數個執行緒,依次分發進行平行運算。
◆ 內建變數
我們可以透過內建變數來辨識每個執行緒
基本的內建變數如下,它們只可以使用在 kernel 的程式碼中:
uint3 gridDim :網格大小 (網格包含的區塊數目)
uint3 blockIdx :區塊索引 (區塊的ID)
uint3 blockDim :區塊大小 (每個區塊包含的執行緒數目)
uint3 threadIdx:執行緒索引 (執行緒的ID)
其中 uint3 為 3D 的正整數型態
struct uint3{
unsigned int x;
unsigned int y;
unsigned int z;
};
另外還有
struct dim3{
int x;
int y;
int z;
};
可以運用它來實做更高層次的平行運算結構,不過現階段,先不要管這種複雜的結構,
把它當成單一正整數即可,也就是 y 和 z 都當成是 1,只用 uint3 的 x。
◆ 網格 & 區塊大小 (gridDim, blockDim)
CUDA 透過指定網格和區塊的大小形成平行化的程式陣列,總執行緒數目為網格大小和區塊大小的乘積,而 gridDim, blockDim 這兩個變數在 kernel 函式中為內建的唯讀變數,可直接讀取
總執行緒數目 = 網格大小(gridDim) x 區塊大小(blockDim)
例如下圖為 (網格大小=3, 區塊大小=4) 所形成的核心,它具有 12 個獨立的執行緒
+------------+-----------+-----------------------+
| | | thread 0 (id 0) |
| | +----------------------+
| | | thread 1 (id 1) |
| | block 0 +----------------------+
| | | thread 2 (id 2) |
| | +----------------------+
| | | thread 3 (id 3) |
| +-----------+----------------------+
| | | thread 0 (id 4) |
| | +---------------------+
| | | thread 1 (id 5) |
| grid | block 1 +---------------------+
| (kernel) | | thread 2 (id 6) |
| | +---------------------+
| | | thread 3 (id 7) |
| +-----------+----------------------+
| | | thread 0 (id 8) |
| | +---------------------+
| | | thread 1 (id 9) |
| | block 2 +----------------------+
| | | thread 2 (id 10) |
| | +----------------------+
| | | thread 3 (id 11) |
+-----------+-----------+-----------------------+
(圖二)
◆ 呼叫 kernel 的語法
在 CUDA 中呼叫 kernel 函式的語法和呼叫一般 C 函式並沒什麼太大的差異,
只是多了延伸的語法來指定網格和區塊大小而已:
kernel_name <<
^^^^^^^^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^
核心函式名 網格大小 區塊大小 函式要傳的引數(和C相同)
所以只是多了 <<
其中 gridDim 和 blockDim 可以是固定數字或動態變數,例如
(1) 固定數字
ooxx_kernel<<<123,32>>>(result, in1, in2);
(2) 動態變數
int grid = some_function_g(); //計算網格大小
int block = some_function_b(); //計算區塊大小
ooxx_kernel<<
◆ 區塊 & 執行緒索引 (blockIdx, threadIdx)
我們可以用區塊和執行緒索引來定出正在執行的程式位置,以決定該載入什麼樣的資料,而 blockIdx, threadIdx 這兩個變數和 gridDim, blockDim 一樣,在 kernel 中也是內建的唯讀變數,可直接讀取
例如在(圖二)中,我們要定出每一個小兵的唯一的 ID,可用下面這段程式碼
int id = blockIdx.x*blockDim.x + threadIdx.x;
要產生(圖二)配置的 kernel 呼叫為
kernel<<<3,4>>>(arguments);
其行為如下
(1) 傳入的網格和區塊大小為 1D 正整數,所以 uint3 中只有 x 有用到,其它 y=z=1
(2) 網格大小 gridDim.x = 3 (每個網格包含 3 個區塊)
(3) 區塊大小 blockDim.x = 4 (每個區塊包含 4 個執行緒)
(4) 區塊索引 blockIdx.x = 0,1,2 (每個 thread 看到的不一樣)
(5) 執行緒索引 threadIdx.x = 0,1,2,3 (每個 thread 看到的不一樣)
(6) 區塊基底 blockIdx.x*blockDim.x = 0,4,8
(7) 區塊基底加上執行緒索引 id = blockIdx.x*blockDim.x + threadIdx.x
= 0,1,2,3, 4,5,6,7, 8,9,10,11
所以我們便可得到一個全域的索引,即每一個小兵的唯一的 ID (圖二中的 id 欄)。
◆ kernel 函式的語法
用 CUDA 寫 kernel 函式寫一般 C 函式也是沒什麼太大的差異,只是多了延伸語法來
加入一些特殊功能,並且標明這個函式是 kernel 而已:
__global__ void kernel_name(type1 arg1, type2 arg2, ...){
...函式內容...
};
其中
(1) __global__ : 標明這是 kernel 的延伸語法
(2) void : kernel 傳回值只能是 void (要傳東西出來請透過引數)
(3) kernel_name : 函式名稱
(4) type1 arg1, type2 arg2, ... : 函式引數 (和 C 完全相同)
(5) 函式內容 : 跟寫 C 或 C++ 一樣 (但不能夠呼叫主機函式)
(6) global 函式只能在 host 函式中呼叫,不能在其它 global 中呼叫。
◆ 小結
以上是 CUDA 平行化程式設計的概觀,和傳統 C/C++ 的差異便是它這種的 SIMT 結構,
也許你會覺得奇怪,為什麼要分成兩層的 grid/block 結構,直接一層就配多個 thread
不是更簡單,這牽涉到它硬體上的細節以及成本問題(後面章節會解釋),再者單層結構
不見得有效率,會增加同步化時執行緒等待的問題,使用兩層結構,可以使 block 單元
彈性的選擇同時或者循序執行,增加往後硬體發展和軟體重用的彈性。
CUDA 程式設計(1) -- 簡介
文章取自PTT videcard版 作者:a5000ml
※ 引言 ※
從軟體設計角度來看,CUDA 寫作並不困難,困難之處在於如何最佳化,它需要了解不少硬體的細節。一般而言未最佳化的程式在 GPGPU 上面執行,可以比傳統的 CPU 快上 5~10 倍,而最佳化過的程式,往往還能再增速 5~10 倍,達到 25~100 倍的效能。
CUDA 和傳統 C++ 最大的差異在於「平行化的程式設計」vs.「序列化的程式設計」,例如傳統上透過迴圈執行數千次的程式碼,在 CUDA 上就可以將它拆解成數百個同時執行的執行緒,每個執行緒只執行十幾次而己,因此產生數十到數百倍的效能。
CUDA 是在傳統 C++ 的基礎上,加入一些延伸語法,以及輔助的函式庫,而形成的一種程式語言,一般而言只要熟悉 C 或 C++,就很容易上手 (可能比 Java 容易上手,因為傳統 C/C++ 的函式庫都可以用),編譯好的程式碼,也可以跟其它語言做不錯的聯結。
在接下來幾篇文章中,我們從簡單的軟體設計角度開始,介紹 CUDA 如何寫作,逐漸
帶出硬體細節,然後介紹最佳化的一些技術。
※ 第一章CUDA程式如何執行 ※
◆ 名詞 ◆
主機 (host) :插顯示卡那台PC。
裝置 (device):顯示卡。
核心 (kernel):在顯示卡上執行的程式碼區段。
◆ 執行流程 ◆
因為 GPGPU 屬於外部裝置(device),其機器指令有別於傳統 CPU,所以程式核心(kernel) 必須經過特殊編譯後,在執行時期和所需資料由主機(host)送到裝置中,並在執行完成後,將結果資料傳回主機,流程如下。
主機(host) PC 裝置(device) 顯示卡
傳送資料到顯示卡記憶體中
(1) 主機記憶體 ------------------------------------------>> 顯示卡記憶體
傳送程式碼(kernel)到顯示卡
(2) 主機記憶體 ----------------------------------------->> 顯示卡記憶體
(3) 主機做其它的事 or 閒置 執行顯示卡中的程式(kernel)
傳回執行結果
(4) 主機記憶體 <<---------------------------------------- 顯示卡記憶體
實際上,CUDA 提供了很多 API 簡化這些流程,包括記憶體在兩者間的搬移,顯示卡記憶\
體的配置與釋放,kernel 設定、啟動與同步等,所以上面的每一個步驟其實就是去叫用CUDA的函式而已。
◆ 編譯流程 ◆
簡易的編譯流程如下,只要先準備好副檔名為 .cu 的 CUDA 程式碼檔案,然後使用CUDA
的編譯器 (nvcc) 來編譯即可,進階的編譯流程以後再介紹。
nvcc
.cu 檔案 ----------> 可執行檔 or 目的檔
其中 .cu 檔案可以同時包含在 host 中執行的傳統 C++ 程式碼,以及在 GPGPU 中執行的 kernel 程式碼。
##補充:nvcc可以把.cu的檔案編譯分成是兩個部分,一個是利用gcc來編譯C語言的部分
另外cuda部分編成是PTX的組合寫言。
※ 引言 ※
從軟體設計角度來看,CUDA 寫作並不困難,困難之處在於如何最佳化,它需要了解不少硬體的細節。一般而言未最佳化的程式在 GPGPU 上面執行,可以比傳統的 CPU 快上 5~10 倍,而最佳化過的程式,往往還能再增速 5~10 倍,達到 25~100 倍的效能。
CUDA 和傳統 C++ 最大的差異在於「平行化的程式設計」vs.「序列化的程式設計」,例如傳統上透過迴圈執行數千次的程式碼,在 CUDA 上就可以將它拆解成數百個同時執行的執行緒,每個執行緒只執行十幾次而己,因此產生數十到數百倍的效能。
CUDA 是在傳統 C++ 的基礎上,加入一些延伸語法,以及輔助的函式庫,而形成的一種程式語言,一般而言只要熟悉 C 或 C++,就很容易上手 (可能比 Java 容易上手,因為傳統 C/C++ 的函式庫都可以用),編譯好的程式碼,也可以跟其它語言做不錯的聯結。
在接下來幾篇文章中,我們從簡單的軟體設計角度開始,介紹 CUDA 如何寫作,逐漸
帶出硬體細節,然後介紹最佳化的一些技術。
※ 第一章CUDA程式如何執行 ※
◆ 名詞 ◆
主機 (host) :插顯示卡那台PC。
裝置 (device):顯示卡。
核心 (kernel):在顯示卡上執行的程式碼區段。
◆ 執行流程 ◆
因為 GPGPU 屬於外部裝置(device),其機器指令有別於傳統 CPU,所以程式核心(kernel) 必須經過特殊編譯後,在執行時期和所需資料由主機(host)送到裝置中,並在執行完成後,將結果資料傳回主機,流程如下。
主機(host) PC 裝置(device) 顯示卡
傳送資料到顯示卡記憶體中
(1) 主機記憶體 ------------------------------------------>> 顯示卡記憶體
傳送程式碼(kernel)到顯示卡
(2) 主機記憶體 ----------------------------------------->> 顯示卡記憶體
(3) 主機做其它的事 or 閒置 執行顯示卡中的程式(kernel)
傳回執行結果
(4) 主機記憶體 <<---------------------------------------- 顯示卡記憶體
實際上,CUDA 提供了很多 API 簡化這些流程,包括記憶體在兩者間的搬移,顯示卡記憶\
體的配置與釋放,kernel 設定、啟動與同步等,所以上面的每一個步驟其實就是去叫用CUDA的函式而已。
◆ 編譯流程 ◆
簡易的編譯流程如下,只要先準備好副檔名為 .cu 的 CUDA 程式碼檔案,然後使用CUDA
的編譯器 (nvcc) 來編譯即可,進階的編譯流程以後再介紹。
nvcc
.cu 檔案 ----------> 可執行檔 or 目的檔
其中 .cu 檔案可以同時包含在 host 中執行的傳統 C++ 程式碼,以及在 GPGPU 中執行的 kernel 程式碼。
##補充:nvcc可以把.cu的檔案編譯分成是兩個部分,一個是利用gcc來編譯C語言的部分
另外cuda部分編成是PTX的組合寫言。
C語言- clock() 運用
Example1:開始計時與結束
#include
#include
double ms_time();
int main(void)
{
float a[100000],b[100000],c[100000];
int i,j;
//宣告clock function
clock_t start, end;
//開始計時
start = clock();
//以下亂寫,單純讓電腦跑久一點
for(j=0;j<1000;j++){
for(i=0;i<100000;i++){
a[i] = drand48()*5;
b[i] = drand48()*5;
c[i] = a[i]*b[i];
}
}
//計時結束
end = clock();
printf("The time was: %f\n", (double)(end - start));
return 0;
}
備註:這樣發現跑出來的時間是以小時為單位,如下改成是以毫秒為單位。
Example2:以毫秒為單位
#include
#include
double ms_time();
int main(void)
{
float a[100000],b[100000],c[100000];
int i,j;
double start, end;
start = ms_time();
for(j=0;j<1000;j++){
for(i=0;i<100000;i++){
a[i] = drand48()*5;
b[i] = drand48()*5;
c[i] = a[i]*b[i];
}
}
end = ms_time();
printf("The time was: %f\n", (double)(end - start));
return 0;
}
double ms_time(){
return (double)clock()/CLOCKS_PER_SEC*1000;
}
備註:clock()/CLOCKS_PER_SEC 在這邊就是以秒為單位
#include
#include
double ms_time();
int main(void)
{
float a[100000],b[100000],c[100000];
int i,j;
//宣告clock function
clock_t start, end;
//開始計時
start = clock();
//以下亂寫,單純讓電腦跑久一點
for(j=0;j<1000;j++){
for(i=0;i<100000;i++){
a[i] = drand48()*5;
b[i] = drand48()*5;
c[i] = a[i]*b[i];
}
}
//計時結束
end = clock();
printf("The time was: %f\n", (double)(end - start));
return 0;
}
備註:這樣發現跑出來的時間是以小時為單位,如下改成是以毫秒為單位。
Example2:以毫秒為單位
#include
#include
double ms_time();
int main(void)
{
float a[100000],b[100000],c[100000];
int i,j;
double start, end;
start = ms_time();
for(j=0;j<1000;j++){
for(i=0;i<100000;i++){
a[i] = drand48()*5;
b[i] = drand48()*5;
c[i] = a[i]*b[i];
}
}
end = ms_time();
printf("The time was: %f\n", (double)(end - start));
return 0;
}
double ms_time(){
return (double)clock()/CLOCKS_PER_SEC*1000;
}
備註:clock()/CLOCKS_PER_SEC 在這邊就是以秒為單位
安裝win32 codecs編碼器
文章取自:楊錦昌老師 - 圖解 Fedora Core 3 桌面調校
1.到「http://www.mplayerhq.hu/MPlayer/releases/codecs/」網站,
下載「all-20050412.tar.bz2」----有新版可以下載新版。
1.到「http://www.mplayerhq.hu/MPlayer/releases/codecs/」網站,
下載「all-20050412.tar.bz2」----有新版可以下載新版。
2.su -
#變成 root 身份
cd /home/帳號
#進到下載的資料夾
tar jxvf all-20050412.tar.bz2
#解壓縮
3.mv all-20050412 /usr/local/lib/codecs
#將解開的資料夾移到「/usr/local/lib」,且更名為「codecs」
ln -s /usr/local/lib/codecs /usr/lib/win32
#建立連結
Install Liu in Linux
*移除Scim(Debian/Linux預設安裝Scim)
#apt-get remove scim
*安裝Gcin (已經裝好可省略此步驟)
1. #apt-get install gcin im-switch
(安裝gcin和im-switch←可簡單地切換輸入法)
2. #im-switch -s gcin
(將gcin更改成預設輸入法)
3.重新登入
*安裝 嘸蝦米 輸入法
1. wget http://edt1023.sayya.org/misc/noseeing-6.tar.gz #下載嘸蝦米的 table
(自已Xuite也有上傳....)
2. mkdir tmp; cd tmp
3. tar zxvf noseeing-6.tar.gz
4. mv noseeing.gtab /usr/share/gcin/table/
5. Gcin圖示按右鍵設定內定輸入法, 即可使用(也可以順便將不會用到輸入法刪除)
*移除Scim(Debian/Linux預設安裝Scim)
#apt-get remove scim
*安裝Gcin (已經裝好可省略此步驟)
1. #apt-get install gcin im-switch
(安裝gcin和im-switch←可簡單地切換輸入法)
2. #im-switch -s gcin
(將gcin更改成預設輸入法)
3.重新登入
*安裝 嘸蝦米 輸入法
1. wget http://edt1023.sayya.org/misc/noseeing-6.tar.gz #下載嘸蝦米的 table
(自已Xuite也有上傳....)
2. mkdir tmp; cd tmp
3. tar zxvf noseeing-6.tar.gz
4. mv noseeing.gtab /usr/share/gcin/table/
5. Gcin圖示按右鍵設定內定輸入法, 即可使用(也可以順便將不會用到輸入法刪除)
psftp常用指令
bye | 結束 psftp 。 |
cd | 改變遠端工作目錄。 |
chmod | 改變遠端檔案的權限以及屬性。 |
del | 刪除遠端檔案。 |
dir | 列出遠端目錄內的所有檔案。 |
exit | 結束 psftp 。 |
get | 從遠端下載指定檔案。 |
help | 列出本使用說明。 |
lcd | 改變近端電腦的工作目錄。 |
lpwd | 顯示目前近端電腦的工作目錄。 |
ls | 列出遠端目錄內的所有檔案。 |
mkdir | 在遠端建立一個新的指定目錄。 |
mv | 搬移遠端檔案或更改檔案名稱。 |
open | 連接指定遠端伺服器。 |
put | 從近端電腦上傳指定檔案至遠端。 |
pwd | 顯示遠端電腦的工作目錄。 |
quit | 結束 psftp 。 |
reget | 延續下載未完的指定檔案。 |
ren | 搬移遠端檔案或更改檔案名稱。 |
reput | 延續上傳未完的指定檔案。 |
rm | 刪除遠端檔案。 |
rmdir | 刪除遠端整個目錄。 |
Install CUDAtoolkit and SDK
1. Install g++ and some dev stuff
#apt-get install g++ (I needed it for compiling the SDK examples)
#apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev libxi-dev libxmu-dev glutg3-dev libglut-dev (for SDK)
(完全不知道第二個安裝的是什麼,nvidia cuda 安裝說明也沒有寫,但是debian的光碟有這些)
2. Install the cudatoolkit(default install paht [/usr/src],auto make dir cuda)
#sh cudatoolkit_3.0_linux_64_ubuntu9.04.run
3.add path for cudatookit
#export PATH=/usr/local/cuda/bin:$PATH
#export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH (for 64-bit: export
LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH)
or add in user .brashrc file
#source ~/.brashrc
4.check
#nvcc --version
install cudatookit END
5.intsall SDK
#sh gpucomputingsdk3.0_linux.run(default [/home/USER/NVIDIA_GPU_Computing_SDK])
6. Go to /home/USER/NVIDIA_GPU_Computing_SDK/C and run 'make'
#cd USER/NVIDIA_GPU_Computing_SDK/C
#make
(some warnings will be shown, but the examples will run
After the compilation you find the binarys in [/home/USER/NVIDIA_GPU_Computing_SDK/C/bin])
7.source code in /home/USER/NVIDIA_GPU_Computing_SDK/C/src
END
備註:
此文章參考 NVIDIA forums
作者為:Lucas
版塊:CUDA in linux
#apt-get install g++ (I needed it for compiling the SDK examples)
#apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev libxi-dev libxmu-dev glutg3-dev libglut-dev (for SDK)
(完全不知道第二個安裝的是什麼,nvidia cuda 安裝說明也沒有寫,但是debian的光碟有這些)
2. Install the cudatoolkit(default install paht [/usr/src],auto make dir cuda)
#sh cudatoolkit_3.0_linux_64_ubuntu9.04.run
3.add path for cudatookit
#export PATH=/usr/local/cuda/bin:$PATH
#export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH (for 64-bit: export
LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH)
or add in user .brashrc file
#source ~/.brashrc
4.check
#nvcc --version
install cudatookit END
5.intsall SDK
#sh gpucomputingsdk3.0_linux.run(default [/home/USER/NVIDIA_GPU_Computing_SDK])
6. Go to /home/USER/NVIDIA_GPU_Computing_SDK/C and run 'make'
#cd USER/NVIDIA_GPU_Computing_SDK/C
#make
(some warnings will be shown, but the examples will run
After the compilation you find the binarys in [/home/USER/NVIDIA_GPU_Computing_SDK/C/bin])
7.source code in /home/USER/NVIDIA_GPU_Computing_SDK/C/src
END
備註:
此文章參考 NVIDIA forums
作者為:Lucas
版塊:CUDA in linux
NVIDIA Display driver install for Debian
Prepare intsall some softwares:
apt-get install gcc-4.1
apt-get install emacs
1.check the linux version ( In my case )
#cat /proc/version
Linux versoin 2.6.26-2-amd64 (Debian 2.6.26-24)(dannf@debian.org)(gcc
version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25) #1 SMP Sun Jun 20
20:16:30 UTC 2010
2.Download the NVIDIA_Driver for my case,and place /root
3.install the source files for my kernel
#apt-cache search linux-source*
#apt-get install install linux-source-2.6.26
#apt-cache search linux-headers*
#apt-get install install linux-headers-2.6.26-2-amd64
4.untar and make link (if don't link step,when install driver will specify
the kernel path)
#tar xjvf /usr/src/linux-source-2.6.26.tar.bz2
#ln -s /usr/src/linux-source-2.6.26 /usr/src/linux
#ln -s /usr/src/linux-headers-2.6.26-2-amd64 /usr/src/headers
5.Set the environment variable CC to the gcc version of that one used to
compile the kernel
#export CC="gcc-4.1"
6.install NVIDIA driver
#/etc/init.d/gdm stop
#sh devdriver_3.0_linux_64_195.36.15.run
in some web , i see a article , choose update NO,other choose YES.I don't
why
#shutdown -r now(reboot)
END....
7.but my xwindow appear error....
#emacs /etc/X11/xorg.conf
in Screen section part
add
Option "NoPowerConnectorCheck"
save and leave
8.restart X
#/etc/init.d/gdm restart
9.if see Mark "NVIDAI",when start Xwindow
success!
TURE END.........
破英文,用力笑吧= =
備註:
此文章參考 NVIDIA forums
作者為:Lucas
版塊:CUDA in linux
apt-get install gcc-4.1
apt-get install emacs
1.check the linux version ( In my case )
#cat /proc/version
Linux versoin 2.6.26-2-amd64 (Debian 2.6.26-24)(dannf@debian.org)(gcc
version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25) #1 SMP Sun Jun 20
20:16:30 UTC 2010
2.Download the NVIDIA_Driver for my case,and place /root
3.install the source files for my kernel
#apt-cache search linux-source*
#apt-get install install linux-source-2.6.26
#apt-cache search linux-headers*
#apt-get install install linux-headers-2.6.26-2-amd64
4.untar and make link (if don't link step,when install driver will specify
the kernel path)
#tar xjvf /usr/src/linux-source-2.6.26.tar.bz2
#ln -s /usr/src/linux-source-2.6.26 /usr/src/linux
#ln -s /usr/src/linux-headers-2.6.26-2-amd64 /usr/src/headers
5.Set the environment variable CC to the gcc version of that one used to
compile the kernel
#export CC="gcc-4.1"
6.install NVIDIA driver
#/etc/init.d/gdm stop
#sh devdriver_3.0_linux_64_195.36.15.run
in some web , i see a article , choose update NO,other choose YES.I don't
why
#shutdown -r now(reboot)
END....
7.but my xwindow appear error....
#emacs /etc/X11/xorg.conf
in Screen section part
add
Option "NoPowerConnectorCheck"
save and leave
8.restart X
#/etc/init.d/gdm restart
9.if see Mark "NVIDAI",when start Xwindow
success!
TURE END.........
破英文,用力笑吧= =
備註:
此文章參考 NVIDIA forums
作者為:Lucas
版塊:CUDA in linux
訂閱:
文章 (Atom)