从头文件调用函数时如何在Rcpp中使用OpenMP?

6tdlim6h  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(127)

我已经创建了许多函数,我想在我当前的.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时做错了什么(当我没有并行化时,例程工作正常)。

nx7onnlm

nx7onnlm1#

下面是我在我的一个包中所做的。首先,下面是***Makevars***文件的内容:

PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
CXX_STD = CXX11
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS)

要设置线程数(在我的代码中为unsigned int nthreads),我需要:

#ifdef _OPENMP
#pragma omp parallel for num_threads(nthreads)
#endif

然后,该指令之后跟随有for循环。
这就是我在代码中与openmp相关的全部内容,并且这是有效的。
我认为您不需要检查threads > 0,使用threads = 1即可。

相关问题