使用OpenMP将C程序编译到共享库中?

时间:2014-09-23 14:22:14

标签: c shared-libraries openmp

我有一个使用基本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)
 ^

这解释了所有!对此感到抱歉,感谢所有发表评论的人!

0 个答案:

没有答案