gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:56:16 25 4
gpt4 key购买 nike

我正在尝试在从 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 个线程,但我只得到一个。我怎样才能获得多个线程?

最佳答案

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

#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

关于c - 如何使用 R CMD SHLIB 编译 C 代码以使用 OpenMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com