如何使用R CMD SHLIB编译C代码以使用OpenMP?

时间:2017-06-29 19:49:52

标签: c r openmp

我正在尝试在我从R调用的一些C代码中实现openMP。现在我正在使用测试程序来查看我有多少线程可用,但我似乎无法获得多个线。如何在程序运行时获得多个线程?

以下是test_omp.c的内容:

#ifdef _OPENMP
  #include <omp.h>
#endif
#include <stdio.h>
#include <R.h>

void test_omp(){
  int num_threads=-1;
  #ifdef _OPENMP
    printf("We have Open MP!\n");
    omp_set_num_threads(2);
    num_threads = omp_get_num_threads();
  #else
    printf(":(\n");
  #endif
  printf("Number of OpenMP threads: %d\n",num_threads);
}

然后我使用shell脚本编译它:

#!/bin/bash
export OMP_NUM_THREADS=2
export PKG_CFLAGS="-fopenmp"
export PKG_LIBS="-lgomp"
R CMD SHLIB test_omp.c

然后我在R

中运行以下代码
dyn.load("test_omp.so")
.C("test_omp")

我得到以下输出:

We have Open MP!
Number of OpenMP threads: 1

我希望得到2个帖子,但我只得到一个。我如何获得多个线程?

1 个答案:

答案 0 :(得分:1)

感谢@llya Bursov的评论,我找到了解决方案。之所以只发现一个线程,是因为我在omp_get_num_threads()块之外调用了#pragma omp parallel。如果我修改代码并将omp_get_num_threads()放在#pragma omp parallel块内,我会得到我期望的两个线程:

#ifdef _OPENMP
  #include <omp.h>
#endif
#include <stdio.h>
#include <R.h>

void test_omp(){
  int num_threads=-1;
  #ifdef _OPENMP
    printf("We have Open MP!\n");
    omp_set_num_threads(2);
    #pragma omp parallel
      #pragma omp master
        {
          // num_threads = omp_get_num_threads();
          printf("Number of OpenMP threads: %d\n",omp_get_num_threads());
        }
  #else
    printf(":(\n");
  #endif
  printf("Number of OpenMP threads: %d\n",num_threads);
}

我从R得到以下输出(在编译之后):

We have Open MP!
Number of OpenMP threads: 2
Number of OpenMP threads: -1