2014-01-23 2 views
0

R로 멀티 스레딩을하고 싶습니다. 저는 C pthread 기능에 익숙합니다. 내가하고 싶은 것입니다 :r pthread-like functions

#initialisation 
n=10 
A <- numeric(n) 

i=c(1:n/2) 

# compute some indexes using the one function fun1 
# equivalent in C with correct initialisation of t1 and attr: 
## pthread_create(&t1, &attr, fun1, i) 
A[i] <- fun1(length(i)) 

# compute other indexes using another function fun2 
# equivalent in C with correct initialisation of t2 and attr: 
## pthread_create(&t2, &attr, fun2, i) 
A[-i] <- fun2(n-length(i)) 

# wait for the thread to finish 
# equivalment in C: 
## pthread_join(t1); pthread_join(t2) 

# do something with the result 
A 

두 함수 fun1 및 Fun2에 내가 다음 단계를 수행하기 전에 완료해야하는 모든 스레드를 기다려야 원하는대로 사용 fork()이 적절하다고 생각하지 않는 완전히 독립적이다. 2 개의 함수 fun1fun2의 결과와 함께.

+1

가 [크랑 작업보기]에서보세요 (http://cran.r-project.org/web/views/HighPerformanceComputing.html). 그러나 먼저'fun1'과'fun2'의 효율성을 시도하고 최적화해야합니다. 잠재적 인 속도 향상은 엄청난 규모입니다 (Rcpp를 사용할 수도 있습니다). – Roland

+0

내가 생각했던 것만 큼 명확하지 않을 수도 있습니다. 그런 것들을 다시하는 법을 이해하기위한 일반적인 코드를 원한다. 필자의 경우,'fun1'과'fun2'는'apply' 함수를 사용합니다. 이것은 최적화하기가 어렵습니다. 게다가'fun1'과'fun2'에서 할 일이 많아서 더 많은 함수 ('fun1','fun2'와'fun3')로 쉽게 확장 할 수있는 코드를 원합니다. –

+0

최적화에 필요한'apply'를 사용하십시오. 결국,'apply'는 R 루프 일뿐입니다. 벡터 대수 또는 특수 함수 (예 :'colSums')를 사용할 수 없다면 Rcpp로 구현해야합니다. 그러나 R에서 병렬화에 대한 여러 가지 가능성이 있습니다. 몇 가지 조사를 수행하고 구체적인 질문을하십시오. – Roland

답변

0
  • i을 반복합니까? 그렇다면 각 i에 대해 fun1fun2을 이상적으로 평가할 수 있습니까? 이 경우 패키지와 함께 병렬 백엔드 doMC과 함께 i을 통해 루프를 구성하십시오.

    그렇지 않으면
    require(foreach) 
    require(doMC) 
    A <- foreach(i = 1:(n/2), .combine=rbind) %dopar% {c(fun1(i),fun2(i))} 
    
  • 처럼 fun1fun2

    switchingFun <- function(.., selFun=1){ 
        if(selFun == 1){ fun1(...)} else {fun2(...) 
    } 
    

    는 또한 fun1 및 Fun2에있는 arguemnts와 목록을 구축 실행하는 그것을 말하고, 당신이 스위치를 통과하는 pseudofunction를 구축합니다. 그리고 이것을 루프 foreach(selFun in 1:2) %dopar% {switchingFun(arguments[[selFun]], selFun)}에 넣으십시오. (...은 매우 유용합니다. 그냥 시도해 보았습니다.)

    호출하는 함수를 살펴보아야 할 수도 있습니다. 전달하기 전에 인수 목록에 무엇인가를해야 할 수도 있습니다. 유형, disentangle 그것 ...) switchingFun 기능.

  • A[-i]은 원하는대로 작동하지 않습니다. R에서 A[-i] 말을하는 것은 모든 요소를 ​​선택 하지 i에 의해 색인 ... 당신은 R.에서 병렬화에 대한 연구를 한 것은 보이지 않는다
+0

감사합니다. 나는'i'를 반복하지 않는다.'mclapply()'또는'parallel' 패키지의 다른 함수를 사용했을 것이다. 나는 의사적인 기능을 생각하지 않았다. 나는 그것이 내 사건에 적절하다고 생각한다. –

+0

@Manu 그래, 코드를 다시 읽은 후에 그것은 분명해 보인다;) 나는 또한 의사 함수를 생각하고, 나는 또한 매일 새로운 것을 배운다. '...'변수를 사용했을 때도 처음이었습니다. 좋은 것들! 또한 : fun1 및 fun2에서 apply를 사용하면 foreach 항목을 처리하는 것이 정말 쉽습니다! –