我有一个使用基本OpenMP功能的C程序。例如,
// foo.c
#include <omp.h>
#include <stdio.h>
double foo(int n){
int i;
double s = 0.0;
omp_set_num_threads(4);
#pragma omp parallel for reduction(+:s)
for (i = 0; i < n; ++i){
printf("Thread %d\n", omp_get_thread_num());
s += i;
}
return s;
}
如果我将foo.c
直接包含在main_1.c
中,那么它就可以了,这是
//main_1.c
#include "foo.c"
int main(){
double s = foo(10);
printf("Sum = %g\n", s);
return 0;
}
然后gcc -fopenmp main_1.c && ./a.out
产生
Thread 0
Thread 3
Thread 1
Thread 2
Thread 0
Thread 3
Thread 1
Thread 2
Thread 0
Thread 1
Sum = 45
我的问题是,如果我想首先将foo.c
编译到共享库中,然后再使用它,我该如何使OpenMP工作?我尝试了以下步骤,但未能使用多线程。我先将foo.c
编译成共享库
gcc -c -fpic foo.c -fopenmp
然后
gcc -shared -fopenmp foo.o -o libfoo.so
获取libfoo.so
。然后我写了一个头文件foo.h
,
//foo.h
#ifndef foo_h__
#define foo_h__
double foo(int);
#endif // foo_h__
将其包含在main_2.c
//main_2.c
#include "foo.h"
#include "stdio.h"
int main(){
double s = foo(10);
printf("Sum = %g\n", s);
return 0;
}
然后按
编译gcc -L/path/to/foo_h main_2.c -lfoo && ./a.out
输出变为
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Thread 0
Sum = 45
显然有些事情是错的,但我无法理解。
更新:我发现当我将foo.c
编译到共享库中时,我没有像我在原始问题中所描述的那样完全正确。我做的是
gcc -c -fPIC foo.c
而不是
gcc -c -fPIC -fopenmp foo.c
现在它有效。另外,我添加了标记-Wall
以查看发生了什么:
gcc -c -fPIC -Wall foo.c
产量
foo.c: In function ‘foo’:
foo.c:8:0: warning: ignoring #pragma omp parallel [-Wunknown-pragmas]
#pragma omp parallel for reduction(+:s)
^
这解释了所有!对此感到抱歉,感谢所有发表评论的人!