더 효율적으로 만들기 위해 일련의 단계에서 파생 된 값으로 희소 행렬을 채우려 고합니다. OpenMP는 해당 프로세스의 속도를 높이는 데 사용됩니다. 1 스레드를 사용할 때 제대로 작동하지만 다중 스레드의 경우 segfault를 잡았습니다. 나는 오류를 재현하기 위해 간단한 데모 코드를 준비했고, 누군가가 나에게 호의를 베풀 수 있기를 진심으로 바랍니다.
#include <RcppArmadillo.h>
#include <omp.h>
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(bigmemory, BH)]]
using namespace std;
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
arma::sp_mat test(arma::vec x, int n, int threads = 1){
omp_set_num_threads(threads);
arma::sp_mat m(n, n);
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
m(i, j) = x[i * n + j];
}
}
return m;
}
# run
a<-test(sample(c(0,1,2),100*100,rep=T), n=100, threads=1)
a<-test(sample(c(0,1,2),100*100,rep=T), n=100, threads=10)
tl; dr : 할 수 없습니다.
더 긴 이야기 : (Rcpp) Armadillo의 주요 이점 중 하나는 혼란스럽고 사용하기 어려운 기본 작업 위에있는 매우 훌륭하고 일관된 API입니다. 단점 중 하나는 기본 데이터 구조를 쉽게 볼 수 없다는 것입니다.
고밀도 행렬은 (본질적으로 항상) 고정 된 메모리 청크입니다. 본질적으로 크기가 행 x 열인 벡터입니다. 이것이 우리에게 R과 (Rcpp) Armadillo 간의 효율적인 '제로 복사'전송을 가능하게합니다. 또한 겹치지 않는 청크에서 동시에 작업 할 수 있습니다. 그것은 큰 문제이며, 예를 들어 RcppParallel은 그것을 최대한 활용합니다. OpenMP는 여기서 작동합니다.
희소 행렬은 상호 의존성이있는 동적 목록 / 벡터 유형입니다. 따라서 동시 작업은 단순히 작동 할 수 없습니다. 슬퍼. 그러나 그것이 바로 그것입니다. 희소 행렬에 대한 일반적인 데이터 구조를 더 자세히 살펴보면 명확 해집니다 ( 예 : R의 Matrix 패키지가 그렇듯이). 예를 들어, 이 위키피디아 는 꽤 괜찮고 철저한 소개입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다