我正在尝试在我从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个帖子,但我只得到一个。我如何获得多个线程?
答案 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