使用GSL和OpenMP进行编译

时间:2012-05-09 15:58:14

标签: gcc openmp gsl

在编译/编写makefile时,我不是最好的。

我正在尝试编写一个同时使用GSL和OpenMP的程序。

我单独使用GSL和OpenMP没有问题,但我在使用两者时都遇到了问题。例如,我可以编译GSL程序 http://www.gnu.org/software/gsl/manual/html_node/An-Example-Program.html 输入

$gcc -c Bessel.c
$gcc Bessel.o -lgsl -lgslcblas -lm
$./a.out

它有效。

我还能够编译我在这里找到的使用OpenMP的程序: Starting a thread for each inner loop in OpenMP

在这种情况下,我输入了

$gcc -fopenmp test_omp.c
$./a.out

我得到了我想要的东西(我使用了所有4个线程)。

然而,当我只编写一个结合了两个代码的程序时

#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
#include <omp.h> 

 int
 main (void)
 {
   double x = 5.0;
   double y = gsl_sf_bessel_J0 (x);
   printf ("J0(%g) = %.18e\n", x, y);


int dimension = 4;
int i = 0;
int j = 0;
#pragma omp parallel private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

return 0;

 }

然后我尝试编译到输入

$gcc -c Bessel_omp_test.c
$gcc Bessel_omp_test.o -fopenmp -lgsl -lgslcblas -lm
$./a.out

GSL部分有效(计算贝塞尔函数),但OpenMP部分只使用一个线程。我不确定这里有什么问题......

2 个答案:

答案 0 :(得分:3)

您错过了OpenMP部分中的工作共享指令for。它应该是:

// Just in case GSL modifies the number of threads
omp_set_num_threads(omp_get_max_threads());
omp_set_dynamic(0);

#pragma omp parallel for private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

编辑:为了总结下面评论中的讨论,OP在编译阶段未能提供-fopenmp。这阻止了GCC识别OpenMP指令,因此没有生成并行代码。

答案 1 :(得分:0)

恕我直言,将变量ij声明为共享是不正确的。尝试将它们声明为私有。否则,每个线程将获得相同的jj++将在线程之间生成竞争条件。