我已经创建了许多函数,我想在我当前的.cpp脚本中调用这些函数。通常,我通过调用头文件来实现(例如:问题是当我想使用OpenMP时,我的R会话会崩溃。
#include <Rcpp.h>
#include "my_function.h"
using namespace Rcpp;
#ifdef _OPENMP
#include <omp.h>
#endif
NumericMatrix m_shortwave_extra(NumericMatrix latitude,
NumericMatrix longitude,
double time_zone,
double year,
double month,
double day,
double time,
NumericMatrix slope,
NumericMatrix orientation,
double S = 1364.0,
int threads = 1){
int n_it = latitude.ncol();
int n_row = latitude.nrow();
NumericMatrix shortwave_out(n_row, n_it);
#ifdef _OPENMP
if ( threads > 0 )
omp_set_num_threads( threads );
#endif
#pragma omp parallel for
for(int i = 0; i < n_it; i++){
shortwave_out(_, i) =
my_function (latitude(_, i),
longitude(_, i),
time_zone,
year,
month,
day,
time,
slope(_, i),
orientation(_, i),
S);
}
return shortwave_out;
}
我想知道我在使用OpenMP时做错了什么(当我没有并行化时,例程工作正常)。
1条答案
按热度按时间nx7onnlm1#
下面是我在我的一个包中所做的。首先,下面是***Makevars***文件的内容:
要设置线程数(在我的代码中为
unsigned int nthreads
),我需要:然后,该指令之后跟随有
for
循环。这就是我在代码中与openmp相关的全部内容,并且这是有效的。
我认为您不需要检查
threads > 0
,使用threads = 1
即可。