最近在學習OpenMP,基本上使用方法大概都可以由前一篇的文章連結學習到
不過小弟我在把我的code改成OpenMP的時候。速度卻比原本的慢了快100倍......
因此來把問題寫下...避免之後遇到不知道怎麼處理
1.rand()
rand()涵數是一個在global memory上執行的涵數,因此如果要在多個threads上同時執行。
rand()會有threads-safe的問題,所以在執行上會只淮許一個threads進去。
目前有兩個解決的方法
i。rand() → rand_r()
drand48() → drand48_r()
Example: rand_r()
#pragma omp parallel firstprivate(a) num_threads(4)
{
unsigned int seed; //threads_number_n(or other parameters)
seed = omp_get_thread_num();
for(int i = 0;i< 100;i++){
a = rand_r(&seed);
printf("threadnum = %d a = %f\n",omp_get_thread_num(),a);
}
}
Example drand48_r()
#pragma omp parallel firstprivate(a) num_threads(4)
{
struct drand48_data drand_buf;
unsigned short int x=0,y=0,z=0;
long int see = 0;
unsigned short int seed16v[3]={x,y,z};
seed48_r(seed16v,&drand_buf);
srand48_r(see,&drand_buf);
//如此一來,四個threads都會是一樣的結果,記得seed48_r與srand48_r都要ini
//否則結果會讓你很意外?
do{
for(int i = 0;i< 100;i++){
drand48_r(&drand_buf,&a);
printf("threadnum = %d a = %f\n",omp_get_thread_num(),a);
}
#pragma omp barrier
#pragma omp single
{
txt++;
}
}while(txt < 10);
}
參考文章
參考文章2
ii。另外尋找其他parallel random number generators
→ SPRNG (還不會使用)
→ CUDA (請查閱user guide)
2.malloc & free allocate (突然覺得我很雖...剛好都遇到了。_。)
其理由也是跟rand很像,他是直接把memory開在global memory上,因些無法直接分配給各個threads (不是很確定我這樣子解理對不對,畢竟對多執行緒還不是很了解)
以下是引述Jim Dempsey部落格裡的範例:
When you want each thread to have their own array
double* array = 0; // *** bad, pointer in wrong scope
// ok to do this when shared(array) on pragma
#pragma omp parallel
{
array = new double[count]; // *** bad all threads sharing same pointer
// *** 2nd and later threads overwrite pointer
...
delete [] array; // *** 2nd and later threads returning same memory
}
------------------------------------
#pragma omp parallel
{
double* array = 0;
array = new double[count]; // *** good when you want each thread to have seperate copy
...
delete [] array; // *** good each thread returning seperate copy
}
--------------------
double* array = 0; // OK because of private(array) on pragma
#pragma omp parallel private(array)
{
array = new double[count]; // *** good when you want each thread to have seperate copy
...
delete [] array; // *** good each thread returning seperate copy
}
--------------------
double* array = 0;
#pragma omp parallel private(array)
{
array = new double[count]; // *** good when you want each thread to have seperate copy
...
}
delete [] array; // *** bad main thread returning one copy
There is nothing wrong with new/delete inside parallel regions, in fact it may be required when you want each thread to have seperate data (e.g. for temporary arrays).
原文連結
Example OpenMP
因為研究上的需要,因此開始學習OpenMP的語法,接下來的所有的文章皆是測試的文章心得
第一篇就用最簡單的教學吧
首先就是在GUN上要怎麼把OpenMP編譯進去
$ g++ filenamie.cpp -fopenmp
如果不加上-fopenmp的話,編譯器會自動把openmp的語法都忽略掉。
以下開始進行測試
#include
#include
#include
int main()
{
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果是:
thread [0]: print number 0
thread [0]: print number 1
thread [0]: print number 2
thread [0]: print number 3
thread [0]: print number 4
thread [0]: print number 5
thread [0]: print number 6
thread [0]: print number 7
omp_get_thread_num()語法是告知現在是那個執行緒,最簡單的想法就是他安排那一個CPU在跑這段語法
明顯看到,就是我們一般單執行緒的寫法。
接著加上openmp平行的寫法
#include
#include
#include
int main()
{
#pragma omp parallel for
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果是:
thread [1]: print number 2
thread [1]: print number 3
thread [0]: print number 0
thread [0]: print number 1
thread [2]: print number 4
thread [2]: print number 5
thread [3]: print number 6
thread [3]: print number 7
可以看到,這個for變的不是單一執行緒在執行,而是不同的CPU在上面跑
所以出來的結果就不是如第一段相同。
最後再來看看
#include
#include
#include
int main()
{
#pragma omp parallel
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果會是:
thread [2]: print number 0
thread [2]: print number 1
thread [2]: print number 2
thread [2]: print number 3
thread [2]: print number 4
thread [2]: print number 5
thread [2]: print number 6
thread [2]: print number 7
thread [1]: print number 0
thread [1]: print number 1
thread [1]: print number 2
thread [1]: print number 3
thread [1]: print number 4
thread [1]: print number 5
thread [1]: print number 6
thread [1]: print number 7
thread [3]: print number 0
thread [3]: print number 1
thread [3]: print number 2
thread [3]: print number 3
thread [3]: print number 4
thread [3]: print number 5
thread [3]: print number 6
thread [3]: print number 7
thread [0]: print number 0
thread [0]: print number 1
thread [0]: print number 2
thread [0]: print number 3
thread [0]: print number 4
thread [0]: print number 5
thread [0]: print number 6
thread [0]: print number 7
目前就先寫到這,因為還有很多不懂的地方
學習參考文章:
VIML
OpenMP并行程序设计(二)
任務的劃分
變數環境
第一篇就用最簡單的教學吧
首先就是在GUN上要怎麼把OpenMP編譯進去
$ g++ filenamie.cpp -fopenmp
如果不加上-fopenmp的話,編譯器會自動把openmp的語法都忽略掉。
以下開始進行測試
#include
#include
#include
int main()
{
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果是:
thread [0]: print number 0
thread [0]: print number 1
thread [0]: print number 2
thread [0]: print number 3
thread [0]: print number 4
thread [0]: print number 5
thread [0]: print number 6
thread [0]: print number 7
omp_get_thread_num()語法是告知現在是那個執行緒,最簡單的想法就是他安排那一個CPU在跑這段語法
明顯看到,就是我們一般單執行緒的寫法。
接著加上openmp平行的寫法
#include
#include
#include
int main()
{
#pragma omp parallel for
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果是:
thread [1]: print number 2
thread [1]: print number 3
thread [0]: print number 0
thread [0]: print number 1
thread [2]: print number 4
thread [2]: print number 5
thread [3]: print number 6
thread [3]: print number 7
可以看到,這個for變的不是單一執行緒在執行,而是不同的CPU在上面跑
所以出來的結果就不是如第一段相同。
最後再來看看
#include
#include
#include
int main()
{
#pragma omp parallel
for (int i = 0; i < 8; i++) {
printf("thread [%d]: print number %d\n", omp_get_thread_num(), i);
}
return 0;
}
結果會是:
thread [2]: print number 0
thread [2]: print number 1
thread [2]: print number 2
thread [2]: print number 3
thread [2]: print number 4
thread [2]: print number 5
thread [2]: print number 6
thread [2]: print number 7
thread [1]: print number 0
thread [1]: print number 1
thread [1]: print number 2
thread [1]: print number 3
thread [1]: print number 4
thread [1]: print number 5
thread [1]: print number 6
thread [1]: print number 7
thread [3]: print number 0
thread [3]: print number 1
thread [3]: print number 2
thread [3]: print number 3
thread [3]: print number 4
thread [3]: print number 5
thread [3]: print number 6
thread [3]: print number 7
thread [0]: print number 0
thread [0]: print number 1
thread [0]: print number 2
thread [0]: print number 3
thread [0]: print number 4
thread [0]: print number 5
thread [0]: print number 6
thread [0]: print number 7
目前就先寫到這,因為還有很多不懂的地方
visual profiler V3.2 on debian
本來想用visual profiler看一下程式上還有那邊可以修改的
沒想到v3.2的cuda toolkit竟然開不了!出現缺少
GLIBCXX_3.4.11 not found (required by computeprof)
突然就傻了,之前記得是可以用的
然後跑去NVIDIA的論壇看看,找到解答了
解決辦法
不過我還是自已寫一遍下來吧,以後要用可以翻比較快
1.
$/usr/local/cuda/computeprof/bin/computeprof &
$computeprof: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by computeprof)
如果出現上面的訊息
先到debain的網站下載libstdc++.so.6
debian官方網站
2.
#dpkg -x libstdc++6_4.4.4-8_amd64.deb /tmp
#cp /tmp/usr/lib/libstdc++.so.* /usr/local/cuda/computeprof/bin/
這樣一來就應該可以使用了
沒想到v3.2的cuda toolkit竟然開不了!出現缺少
GLIBCXX_3.4.11 not found (required by computeprof)
突然就傻了,之前記得是可以用的
然後跑去NVIDIA的論壇看看,找到解答了
解決辦法
不過我還是自已寫一遍下來吧,以後要用可以翻比較快
1.
$/usr/local/cuda/computeprof/bin/computeprof &
$computeprof: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by computeprof)
如果出現上面的訊息
先到debain的網站下載libstdc++.so.6
debian官方網站
2.
#dpkg -x libstdc++6_4.4.4-8_amd64.deb /tmp
#cp /tmp/usr/lib/libstdc++.so.* /usr/local/cuda/computeprof/bin/
這樣一來就應該可以使用了
flash player for 64bit linux
看來終於可以在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
再重覆上面的動作。
(也有可能是小弟之前愚笨不知道怎麼使用)
目前在阿多比的官網並沒有提供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-154.改成如下
-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:寫入defaults1.#emacs ~/.XdefaultsEmacs.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 ~/.XdefaultsPS.要解除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
訂閱:
文章 (Atom)