b*****l 发帖数: 9499 | 1 在学 OpenMP,第一步就不通:设多线程失败。。。
TestOMP.cpp 的 code 很简单:开 5 个线程,每个介绍一下自己,就完事了.
#include
#include
using namespace std;
main () {
omp_set_num_threads(5);
cout << "Fork! " << endl;
#pragma omp parallel
{
// Obtain and print thread id
cout<< "Hello World from thread = " << omp_get_thread_num()
<< " of " << omp_get_num_threads() << endl;
// Only master thread does this
if (omp_get_thread_num() == 0)
cout << "Master thread: number of threads = " <<
omp_get_num_threads() << endl;
} // All threads join master thread and terminate
cout << "Joint! " << endl;
}
结果咋整都是一个线程:
$ make
g++ -c -o TestOMP.o TestOMP.cpp
g++ -o TestOMP TestOMP.o -I. -g -O -fopenmp -lm
$ ./TestOMP
Fork!
Hello World from thread = 0 of 1
Master thread: number of threads = 1
Joint!
num_threads(5) 也试过了,不成。觉得俺哪里理解错了。。。 |
x******n 发帖数: 9057 | 2 晕死,头一回听说openmp
【在 b*****l 的大作中提到】 : 在学 OpenMP,第一步就不通:设多线程失败。。。 : TestOMP.cpp 的 code 很简单:开 5 个线程,每个介绍一下自己,就完事了. : #include : #include : using namespace std; : main () { : omp_set_num_threads(5); : cout << "Fork! " << endl; : #pragma omp parallel : {
|
r*********g 发帖数: 5450 | 3 open马屁?
【在 x******n 的大作中提到】 : 晕死,头一回听说openmp
|
x******n 发帖数: 9057 | 4 nod,马屁这么高深的学问,不open source怎么行
【在 r*********g 的大作中提到】 : open马屁?
|
b*****l 发帖数: 9499 | 5 唉,唉,帮看看吧。。。
【在 x******n 的大作中提到】 : nod,马屁这么高深的学问,不open source怎么行
|
g*******1 发帖数: 8758 | 6 Lol, 所见略同
【在 r*********g 的大作中提到】 : open马屁?
|
x******n 发帖数: 9057 | 7 我完全不懂啊这玩意。。。
【在 b*****l 的大作中提到】 : 唉,唉,帮看看吧。。。
|
g*******1 发帖数: 8758 | 8 haha,搜索了一下,还有OpenMPI
linux版不是给了方案吗,我试了试,
~/temp :] g++ -fopenmp -c -o mp.o mp.cpp
~/temp :] g++ -o mp mp.o -I. -g -O -fopenmp -lm
~/temp :] ./mp
Fork!
Hello World from thread = Hello World from thread = Hello World from thread
= 1 of 35 of 5
2 of 5
Hello World from thread = 4 of 5
Hello World from thread = 0 of 5
Master thread: number of threads = 5
Joint!
【在 b*****l 的大作中提到】 : 唉,唉,帮看看吧。。。
|
b*****l 发帖数: 9499 | 9 眼泪哗哗的。。。为啥我试就不行啊?。。。
thread
【在 g*******1 的大作中提到】 : haha,搜索了一下,还有OpenMPI : linux版不是给了方案吗,我试了试, : ~/temp :] g++ -fopenmp -c -o mp.o mp.cpp : ~/temp :] g++ -o mp mp.o -I. -g -O -fopenmp -lm : ~/temp :] ./mp : Fork! : Hello World from thread = Hello World from thread = Hello World from thread : = 1 of 35 of 5 : 2 of 5 : Hello World from thread = 4 of 5
|
b*****l 发帖数: 9499 | 10 在两台机器上试过了,都不 work,也不报错。。。最烦这种玩暧昧的 bug 了,就像遇
到久历情场的 mm。。。
thread
【在 g*******1 的大作中提到】 : haha,搜索了一下,还有OpenMPI : linux版不是给了方案吗,我试了试, : ~/temp :] g++ -fopenmp -c -o mp.o mp.cpp : ~/temp :] g++ -o mp mp.o -I. -g -O -fopenmp -lm : ~/temp :] ./mp : Fork! : Hello World from thread = Hello World from thread = Hello World from thread : = 1 of 35 of 5 : 2 of 5 : Hello World from thread = 4 of 5
|
|
|
x******n 发帖数: 9057 | 11 hahaha,cong,好好享受暧昧吧
【在 b*****l 的大作中提到】 : 在两台机器上试过了,都不 work,也不报错。。。最烦这种玩暧昧的 bug 了,就像遇 : 到久历情场的 mm。。。 : : thread
|
b*****l 发帖数: 9499 | 12 有木有!!!!!!!!!!!!!!!!!
还是不能设 thread 数目。去掉相应行,work 了,但每次跑起来,threads 数目不等
,看系统的心情。跑了三次,分别是 15,17,16 个 threads.
#include
#include
int main () {
omp_set_dynamic(1);
printf("omp_get_dynamic: %d.\n",omp_get_dynamic());
printf("omp_get_max_threads: %d.\n", omp_get_max_threads());
/* omp_set_num_threads(10); */
/* Fork a team of threads with each thread having a private tid variable */
printf("Fork! \n");
#pragma omp parallel
{
// Obtain and print thread id
printf("Hello World from thread = %d of %d.\n",
omp_get_thread_num(), omp_get_num_threads());
// Only master thread does this
if (omp_get_thread_num() == 0)
printf("Master thread: number of threads = %d.\n", omp_get_num_threads
());
} // All threads join master thread and terminate
printf("Joint! \n");
return 0;
}
$ ./CTestOMP
omp_get_dynamic: 1.
omp_get_max_threads: 48.
Fork!
Hello World from thread = 0 of 17.
Hello World from thread = 5 of 17.
Hello World from thread = 8 of 17.
Hello World from thread = 1 of 17.
Hello World from thread = 13 of 17.
Hello World from thread = 9 of 17.
Hello World from thread = 2 of 17.
Hello World from thread = 7 of 17.
Hello World from thread = 3 of 17.
Hello World from thread = 6 of 17.
Hello World from thread = 11 of 17.
Hello World from thread = 12 of 17.
Hello World from thread = 4 of 17.
Hello World from thread = 14 of 17.
Hello World from thread = 16 of 17.
Hello World from thread = 15 of 17.
Hello World from thread = 10 of 17.
Master thread: number of threads = 17.
Joint!
另外,cpp 的输出和谷一的那个一样地乱。看来多线程输出还是 printf 比较靠谱。
【在 x******n 的大作中提到】 : hahaha,cong,好好享受暧昧吧
|
g*******1 发帖数: 8758 | 13 这个mm很傲娇嘛
【在 b*****l 的大作中提到】 : 有木有!!!!!!!!!!!!!!!!! : 还是不能设 thread 数目。去掉相应行,work 了,但每次跑起来,threads 数目不等 : ,看系统的心情。跑了三次,分别是 15,17,16 个 threads. : #include : #include : int main () { : omp_set_dynamic(1); : printf("omp_get_dynamic: %d.\n",omp_get_dynamic()); : printf("omp_get_max_threads: %d.\n", omp_get_max_threads()); : /* omp_set_num_threads(10); */
|
g*******1 发帖数: 8758 | 14 怎么这么倒霉,我系统只装了普通的编译环境,也一试就成功了
【在 b*****l 的大作中提到】 : 在两台机器上试过了,都不 work,也不报错。。。最烦这种玩暧昧的 bug 了,就像遇 : 到久历情场的 mm。。。 : : thread
|
b*****l 发帖数: 9499 | 15 阶段性胜利了:在 .c 下面,makefile 和 omp_set_num_threads 管用,num_threads
不管用。在 .cpp 下面,omp_set_num_threads 和 num_threads 管用,makefile 不管
用(所以只好写了个 bash script)。。。
大家帮我看看我的 makefile 哪里出错了吧。一个叫做 CMakefile,一个叫做
Makefile,code 一样(除了指向的文件名),结果不一样,后者的 g++ 后面多了些空
格,最后少了一堆参数。。。
$ make -f CMakefile
gcc -c -o CTestOMP.o CTestOMP.c -I. -g -O -fopenmp
gcc -o CTestOMP CTestOMP.o -I. -g -O -fopenmp -lm
$ make -f Makefile
g++ -c -o TestOMP.o TestOMP.cpp
g++ -o TestOMP TestOMP.o -I. -g -O -fopenmp -Wall -lm
#########################################
CMakefile:
IDIR = .
CC = gcc
CFLAGS = -I$(IDIR) -g -O -fopenmp
ODIR = .
LDIR = .
LIBS = -lm
_DEPS =
DEPS =$(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = CTestOMP.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
CTestOMP: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
#########################################
Makefile:
IDIR = .
CC = g++
CFLAGS = -I$(IDIR) -g -O -fopenmp -Wall
ODIR = .
LDIR = .
LIBS = -lm
_DEPS =
DEPS =$(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = TestOMP.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
TestOMP: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
【在 b*****l 的大作中提到】 : 有木有!!!!!!!!!!!!!!!!! : 还是不能设 thread 数目。去掉相应行,work 了,但每次跑起来,threads 数目不等 : ,看系统的心情。跑了三次,分别是 15,17,16 个 threads. : #include : #include : int main () { : omp_set_dynamic(1); : printf("omp_get_dynamic: %d.\n",omp_get_dynamic()); : printf("omp_get_max_threads: %d.\n", omp_get_max_threads()); : /* omp_set_num_threads(10); */
|
b*****l 发帖数: 9499 | 16 那啥,俺上 debian sid 了。。。前些天因为 DISPLAY 的问题吐血了好几天,才发现
貌似是 debian default interfaces 的问题。
对于 c++ 新手,啥都是可能发生的。。。
【在 g*******1 的大作中提到】 : 怎么这么倒霉,我系统只装了普通的编译环境,也一试就成功了
|
x******n 发帖数: 9057 | 17 这么前卫?我用到ubuntu也就到头了。
【在 b*****l 的大作中提到】 : 那啥,俺上 debian sid 了。。。前些天因为 DISPLAY 的问题吐血了好几天,才发现 : 貌似是 debian default interfaces 的问题。 : 对于 c++ 新手,啥都是可能发生的。。。
|
b*****l 发帖数: 9499 | 18 没办法啊,做 research 就是这个样子。大部分的专门的软件还是得自己编译。基本上
别人的 source codes 一更新,我们就得更新。否则 reviewer 就会说,你们
benchmark 得不是业界最新的技术。
【在 x******n 的大作中提到】 : 这么前卫?我用到ubuntu也就到头了。
|
g*******1 发帖数: 8758 | 19 这么惨,我一般都老实的用stable,也就前一次用的是testing,unstable从来不敢用
。当前的squeeze安装也搞的够呛,镜像有时连的上有时连不上,装完后网络都没了,
找了好久才发现是跟ATT的猫八字不合,域名解析有问题,真暧昧。不像以前有兴趣自
己编译了,除了dropbox傻瓜型编译,其它我都用现成的,没有拉倒。
【在 b*****l 的大作中提到】 : 没办法啊,做 research 就是这个样子。大部分的专门的软件还是得自己编译。基本上 : 别人的 source codes 一更新,我们就得更新。否则 reviewer 就会说,你们 : benchmark 得不是业界最新的技术。
|
x******n 发帖数: 9057 | 20 你们的行业太正规了,我们谁也没有source code,大家瞎吹就好了
【在 b*****l 的大作中提到】 : 没办法啊,做 research 就是这个样子。大部分的专门的软件还是得自己编译。基本上 : 别人的 source codes 一更新,我们就得更新。否则 reviewer 就会说,你们 : benchmark 得不是业界最新的技术。
|
|
|
x******n 发帖数: 9057 | 21 linux还是用虚拟机好,啥硬件问题都没有
【在 g*******1 的大作中提到】 : 这么惨,我一般都老实的用stable,也就前一次用的是testing,unstable从来不敢用 : 。当前的squeeze安装也搞的够呛,镜像有时连的上有时连不上,装完后网络都没了, : 找了好久才发现是跟ATT的猫八字不合,域名解析有问题,真暧昧。不像以前有兴趣自 : 己编译了,除了dropbox傻瓜型编译,其它我都用现成的,没有拉倒。
|
g*******1 发帖数: 8758 | 22 硬件问题才是linux的精髓阿。。。:D
成linux轮就没办法回头了
【在 x******n 的大作中提到】 : linux还是用虚拟机好,啥硬件问题都没有
|
b*****l 发帖数: 9499 | 23 我不做算法,但组里有一个项目是做算法的,需要 beat peers 才成。每次投文章,
reviewers 都给一大堆的别人的算法要我们 compare。
对于不 release source codes 的软件,我们一律忽视,很开心地直接回复说没有源程
序,不知道对方编译环境,所以无法比较。所以么,学术界不公开 source codes 就是
自掘坟墓啊。
【在 x******n 的大作中提到】 : 你们的行业太正规了,我们谁也没有source code,大家瞎吹就好了
|
x******n 发帖数: 9057 | 24 哦,你们做算法的。
我们release程序也没用,因为结果还依赖数据。
数据有privacy的问题,有规定的,不能随便公开。
【在 b*****l 的大作中提到】 : 我不做算法,但组里有一个项目是做算法的,需要 beat peers 才成。每次投文章, : reviewers 都给一大堆的别人的算法要我们 compare。 : 对于不 release source codes 的软件,我们一律忽视,很开心地直接回复说没有源程 : 序,不知道对方编译环境,所以无法比较。所以么,学术界不公开 source codes 就是 : 自掘坟墓啊。
|
b*****l 发帖数: 9499 | 25 我们组在做,我不做。我要么用最可靠的算法,要么自己写很烂的算法。只要能 proof
of concept 就够了。
【在 x******n 的大作中提到】 : 哦,你们做算法的。 : 我们release程序也没用,因为结果还依赖数据。 : 数据有privacy的问题,有规定的,不能随便公开。
|