Multithreading ptr类线程函数

Multithreading ptr类线程函数,multithreading,r,Multithreading,R,我想用R做一些多线程处理。我习惯于C pthread功能。我想做的是: #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)

我想用R做一些多线程处理。我习惯于C pthread功能。我想做的是:

#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
#初始化
n=10
A
  • 您是否在
    i
    上循环?如果是,那么您是否也可以独立评估每个
    i
    fun1
    fun2
    ?在这种情况下,使用
    foreach
    包和类似
    doMC
    的并行后端在
    i
    上构建一个循环。像

    require(foreach)
    require(doMC)
    A <- foreach( i = 1:(n/2), .combine=rbind) %dopar% {c(fun1(i),fun2(i))}
    
    还可以用参数fun1和fun2构建一个列表。并将其放入
    foreach(selFun in 1:2)%dopar%{switchingFun(arguments[[selFun]],selFun)}
    循环中。(这个
    非常有用,我刚刚试过!)

    您将/可能/应该查看您调用的函数,在
    switchingFun
    函数中传递参数列表之前,您可能需要对参数列表做些什么(获取正确的类型,解开它…)

  • A[-i]
    将(很可能)无法按您想要的方式工作。在R中,说
    A[-i]
    会选择所有未被
    i
    索引的元素

您似乎没有对R中的并行化做过任何研究。请看一看。但是,首先您应该尝试优化
fun1
fun2
的效率。潜在的速度提升有几个数量级(你甚至可以使用Rcpp)。我可能没有像我想的那样明确。我想要一些通用代码来理解如何重做这些事情。在我的例子中,
fun1
fun2
都使用
apply
函数,这很难优化。此外,我在
fun1
fun2
中有很多事情要做,我想要一些可以轻松扩展到更多功能的代码(比如
fun1
fun2
fun3
),如果它们使用
apply
,这就是您需要优化的。毕竟,
apply
只是一个R循环。如果你能
t使用向量代数或专用函数(如
colSums`),那么你应该考虑用Rcpp实现它们。然而,在R中有许多并行化的可能性。做一些研究,然后问一些具体的问题。谢谢。我不会在
I
上循环,否则我会使用
mclappy()
parallel
包中的其他函数。我没有想到伪函数。我认为它适合我的情况。@Manu是的,在再次阅读您的代码后,它似乎很明显;)我也只是想到了伪函数,我也每天学习新的东西。这也是我第一次使用
变量,好东西!另外:如果你在fun1和fun2中使用apply,那么在那里做foreach工作真的很容易!
switchingFun <- function( .., selFun=1){
  if(selFun == 1){ fun1( ...)} else {fun2(... )
}