为什么在Rcpp中使用并行omp会导致分段错误?

问题描述 投票:0回答:1

我想创建一个更快的x == x1 & y %in% Table版本,可能与其他逻辑表达式混合使用。但是,当我运行以下命令时,我可以可靠地产生段错误

#include <omp.h>
#include <Rcpp.h>
using namespace Rcpp;


bool do_is_in(int x, IntegerVector Table, int tn) {
  for (int i = 0; i < tn; ++i) {
    if (x == Table[i]) {
      return true;
    }
  }
  return false;
}

// [[Rcpp::export]]
LogicalVector in_and_eq(IntegerVector x, int x1,
                        IntegerVector y, IntegerVector Table) {
  R_xlen_t n = x.length();

  LogicalVector out = no_init(n);
  const int tn = Table.length();

#pragma omp parallel for
  for (R_xlen_t i = 0; i < n; ++i) {
    out[i] =
      x[i] == x1 &&
      do_is_in(y[i], Table, tn);
  }

  return out;
}
i <- rep_len(1:17, 100e3)
j <- rep_len(1:19, 100e3)

in_and_eq(i, 15L, j, 15:18)  # may require a few repetitions

我怀疑这与const int tn有关,但我不确定这是否是红色鲱鱼。我将其包括在内是为了避免每个Table.length()调用都调用do_is_in的开销(可能很小)。

我想创建一个更快的x == x1&y%in%Table版本,可能与其他逻辑表达式混合在一起。但是,当我运行以下#include&...

r openmp rcpp
1个回答
0
投票

R绝对是100%不是多线程安全的。例如,您对do_is_in的调用按值接受IntegerVector类型的对象。这将调用一个复制构造函数,该复制构造函数(我假设)将通过非线程0的线程与R进行交互,从而导致崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.