第1章 R语言中的并行处理入门

devtools/2024/12/27 20:08:18/

标准:时间,开发,运行,工具,R机器,多核。
rdsm,openmp,conda。
相互网页外链。

第一章

1.1 反复出现的主题: 良好并行所具有的标准

R(解释性语言)的核心操作都在语言内部进行了高效的实现,因而只要正确使用,R语言一般能够提供较好的性能

1.1.1 足够快(良好并行的标准?)

良好并行的标准
在这里插入图片描述

1.1.2 “R+X”

在这里插入图片描述

1.2 关于机器

多核系统,集群(几十个结点),GPU

1.3 反复出现的主题: 不要把鸡蛋放在一个篮子里(跨平台)

可以使用多种硬件、也能被多种编程语言调用的软件包对用户有着巨大的吸引力。
第7章和一些后面小节将要讨论的Thrust,就是这
种现象的缩影。同样的Thrust代码,既能在多核平台上运行,也能在GPU
平台上运行
,并且由于它是基于C++的,它能被R和其他大部分语言调用。
长话短说,Thrust 使得我们在开发并行代码的时候能够“两面下注”
消息传递软件系统,比如R的snow、Rmpi和pbdR扩展包,也有基
本相同的优势,因为它们既能在多核机器上运行,也能在集群上运行。

1.4 扩展示例: 相互网页外链

1.4.1 串行代码

mutoutser<- function(links) {nr <- nrow(links)nc <- ncol(links)tot = 0for (i in 1:(nr-1)) {for (j in (i+1):nr) {for (k in 1:nc) tot <- tot + links[i,k] * links[j,k]}}tot / (nr*(nr-1)/2)
}
# 生成一个指定大小(nr 行,nc 列)的二进制矩阵 lnk,然后调用 mutoutser 函数计算
sim <- function(nr,nc) {lnk <- matrix(sample(0:1,(nr*nc),replace=TRUE),nrow=nr)print(system.time(mutoutser(lnk)))
}sim(500,500)

在这里插入图片描述
在这里插入图片描述

mutoutser1<- function(links) {nr <- nrow(links)nc <- ncol(links)tot <- 0for (i in 1:(nr-1)) {tmp <- links[(i+1):nr,] %*% links[i,]tot <- tot + sum(tmp)}tot / (nr*(nr-1)/2)
}
sim1<- function(nr,nc) {lnk <- matrix(sample(0:1,(nr*nc),replace=TRUE),nrow=nr)print(system.time(mutoutser1(lnk)))
}sim1(500,500)sim1(2000,2000)

在这里插入图片描述

1.4.2 并行工具的选择snow 包

在这里插入图片描述

1.4.4 snow包的简介

先来总结一下 snow 包的操作:
使用了 scatter/gather范式:我们同时有多个R的实例在运行,它们可
能在集群中的好几个机器上,也有可能在一个多核机器上,我们把其中的一个实例称为manáger,其他的称为worker。并行计算将如下进行:
在这里插入图片描述

1.4.5 并行代码

library(parallel)#该函数接收一个索引块(ichunk),使用参数lnks(全局变量,后面定义),计算矩阵的乘积并累加结果。
# 主要负责在并行计算中处理一部分数据的计算。
doichunk <- function(ichunk) {tot <- 0nr <- nrow(lnks)for (i in ichunk) {tmp <- lnks[(i+1):nr,] %*% lnks[i,]tot <- tot + sum(tmp)}return(tot)
}# 1.该函数接收一个集群对象cls,将全局变量lnks导出到集群中。
# 2.将数据划分成多个块,给每个工作节点分配任务,并使用doichunk处理。
# 3.最后,计算所有工作节点的结果总和并取平均。
# ichunks[] cls[]
mutoutpar <- function(cls) {nr <- nrow(lnks)  # lnks globalclusterExport(cls,"lnks") # 将links导出到cluster中ichunks <- clusterSplit(cls,1:(nr-1)) # ichunks是索引块的列表tots <- clusterApply(cls,ichunks,doichunk) # tots是每个工作节点的结果列表Reduce(sum,tots) / nr # 收集worker的结果并求平均
}# 该函数用于生成一个大小为nr * nc的随机二进制矩阵lnks。
# 调用mutoutpar进行并行计算,并记录计算时间。
snowsim <- function(nr,nc,cls) {lnks <<- matrix(sample(0:1,(nr*nc),replace=TRUE),nrow=nr)print(system.time(mutoutpar(cls)))
}# init本地多核机器集群
initmc <- function(nworkers) {makeCluster(nworkers) # return cluster object
}#1.首先创建一个具有2个工作节点的集群并执行snowsim进行矩阵操作
#2.再次创建一个具有4个工作节点的集群并执行同样操作。
cluser=initmc(2)
snowsim(2000,2000,cluser)
system.time(mutoutser1(lnks)) # 之前的计算函数cluser <-initmc(4)
snowsim(2000,2000,cluser)
system.time(mutoutser1(lnks))

http://www.ppmy.cn/devtools/145907.html

相关文章

2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码

引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法&#xff0c;称为加权平均优化算法Weighted average algorithm&#xff0c;WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中&#xff0c;加权平均位置代表当…

【Leetcode】3218. 切蛋糕的最小总开销 I

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一个 m ∗ n m * n m∗n 大小的矩形蛋糕&#xff0c;需要切成 1 ∗ 1 1 * 1 1∗1 的小块。 给你整数 m m m &#xff0c; n n n 和两个数组&#xff1a; h o r i z o n t a l…

java中list和map区别

在Java中&#xff0c;List和Map是两种不同类型的集合接口&#xff0c;它们用于不同的场景并且具有不同的特性和用途。以下是List和Map的主要区别&#xff1a; 1. 数据结构 List&#xff1a;是一个有序的集合&#xff0c;允许重复元素。它实现了Collection接口&#xff0c;并且…

Java中处理if-else的几种高级方法

前言 在我看来多写几个if-else没啥大不了的&#xff0c;但是就是看起来没啥逼格&#xff0c;领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章&#xff0c;可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…

springboot使用自定义的线程池 完成 多线程执行网络请求,返回数据后,统一返回给前段

定义自定义线程池配置类 创建一个ThreadPoolConfig类&#xff0c;用于配置自定义线程池的参数。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.ExecutorService; import…

如何在openwrt中使用docker(命令行版)

1. 前提条件 在 OpenWRT 上运行 Docker&#xff0c;您需要确保以下条件满足&#xff1a; 支持 Docker 的设备&#xff1a;您的路由器或设备需要有足够的存储空间&#xff08;建议至少 16GB&#xff09;和 RAM&#xff08;建议至少 512MB&#xff09;。已安装 OpenWRT&#xf…

面试场景题系列:设计限流器

首先看看使用API限流器的好处。 •预防由拒绝服务攻击(Denial of Service&#xff0c;DoS)引起的资源耗尽问题。大型科技公司发布的所有API几乎都强制执行某种形式的限流操作。例如&#xff0c;推特限制每个用户每3小时最多发300条推文。谷歌文档API的默认限制是每个用户每60秒…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务&#xff0c;要求用户在60天内迁移账号&#xff0c;否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息&#xff1a; 1. 背景介绍&#xff1a;GitLab是一家全球知名的软件开发平台&#xff0c;提供代码托…