gpt4 book ai didi

r - R 中的矢量化与并行化

转载 作者:行者123 更新时间:2023-12-04 12:20:40 25 4
gpt4 key购买 nike

作为一个玩具示例,假设我们有一个名为“my_func”的函数(代码如下),它接受两个参数“n”和“p”。我们的函数“my_func”将生成一个带有“n”行和“p”列的随机矩阵“x”,并在运行时和内存使用方面做一些昂贵的事情,例如计算“x”的奇异值的总和。 (当然,该函数是单行的,但我在这里是为了可读性。)

my_func <- function(n, p) {
x <- replicate(p, rnorm(n))
sum(svd(x)$d)
}

如果我们希望为 'n' 的多个值计算 'my_func',并且对于 'n' 的每个值,我们有几个 'p' 值,那么向量化该函数并将其应用到 'my_func' 的组合很简单:
n <- 10 * seq_len(5)
p <- 100 * seq_len(10)
grid <- expand.grid(n = n, p = p)
my_func <- Vectorize(my_func)
set.seed(42)
do.call(my_func, grid)
[1] 98.61785 195.50822 292.21575 376.79186 468.13570 145.18359
[7] 280.67456 421.03196 557.87138 687.75040 168.42994 340.42452
[13] 509.65528 683.69883 851.29063 199.08474 400.25584 595.18311
[19] 784.21508 982.34591 220.73215 448.23698 669.02622 895.34184
[25] 1105.48817 242.52422 487.56694 735.67588 976.93840 1203.25949

请注意,对于大的 'n' 和 'p'(尝试 n = 1000 和 p = 2000 对于初学者),每次调用 'my_func' 可能会非常缓慢。

现在,在我使用类似构造函数的实际应用程序中,'grid' 中的行数比这里给出的要多得多。因此,我试图更好地理解 R 中的矢量化。

第一个问题:在上面的示例中,对“my_func”的调用是否按顺序执行,以便在下一次调用之前对一次调用中的内存使用情况进行垃圾回收?我经常使用矢量化,但从未停下来问这个问题。

第二个问题:(这个问题可能取决于第一个问题)假设调用次数足够大并且'my_func'足够慢,这里是否需要并行化?我假设是的。我的 真正的 问题是:如果 'my_func' 每次调用都传递给它相同的大矩阵,这里是否保证并行化?为了便于论证,假设矩阵称为“y”,有 1000 行和 5000 列,并且是即时计算的。当然,将矩阵 'y' 传递给每个并行节点会导致一些滞后。

我知道第二个问题的答案可能是“这取决于……”如果是这样,请告诉我,我会尽量提供更多细节。

此外,我感谢任何建议、反馈或 OMFG WTF N00B 您还没有看到其他模糊的相关讨论??!!!111oneone1

最佳答案

第一个问题的答案很明显是肯定的:R 中的几乎所有内容默认都是串行的。 (很少有东西在内部开始使用 OpenMP,但 R 作为引擎可能会保持单线程)。

所以对于第二个问题:是的,请尝试一下。我不使用 Vectorize()很多,但我确实喜欢 *apply()家庭。用 lapply() 解决它,然后加载 multicore打包使用 mclapply()让它运行在你拥有的尽可能多的核心上。下面是一个例子:

R> system.time(res <- lapply(1:nrow(grid), 
+ function(i) my_func(grid[i,1],grid[i,2])))
user system elapsed
0.470 0.000 0.459
R> system.time(res <- mclapply(1:nrow(grid),
+ function(i) my_func(grid[i,1], grid[i,2])))
user system elapsed
0.610 0.140 0.135
R>

请注意,现在耗时大约是原始时间的 29% (= 0.135/0.459)。

从这里,您可以通过跨多台机器的并行执行进一步概括—— High-Performane Computing with R 上的任务 View |有进一步的指示。 10 月 31 日到期的 R 2.14.0 将有一个新的“并行”包,它结合了 multicore 的部分内容。和 snow .

关于r - R 中的矢量化与并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com