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

news/2024/12/28 8:00:24/

标准:时间,开发,运行,工具,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/news/1558737.html

相关文章

自动驾驶AVM环视算法--python版本的车轮投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--超广角模式/转向模式/3D碗型投影模式/窄边模式/车轮模式等的实现》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https:…

1-Linux 基础入门指南

Linux 基础入门指南:历史、发行版与基础操作 一、Linux 简介 Linux 是一个开源且免费的操作系统内核,由芬兰计算机科学家林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。这个操作系统基于Unix设计哲学,但与商业Unix版本不同的是,Linux是完全开放源代码的,这意味着任何…

PyPika:Python SQL 查询构建器

什么是 PyPika&#xff1f; Pypika 是一个 Python 库&#xff0c;用于构建 SQL 查询。它提供了一种简洁、直观的方式来生成 SQL 语句&#xff0c;而无需手动编写复杂的 SQL 代码。Pypika 的设计哲学是尽可能地接近 SQL 的自然语法&#xff0c;同时利用 Python 的强大功能来简化…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…

移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ OLLVM、LLVM 与 Android NDK 在 Android NDK 中&#xff0c;LLVM/Clang 是默认的编译器。自 Android NDK r18 开始&#xff0c;Google 弃用了 GCC&#xff0c…

UE5 把场景转成HDR图

目录 使用影片渲染队列 使用影片渲染队列 以下方法实测 UE5.4 有效 1.打开影片渲染队列窗口。依次打开&#xff1a;窗口—过场动画—影片渲染队列 2.添加Sequence动画。点击“渲染”按钮&#xff0c;选择要渲染的Sequence。 3.设置输出配置。 点击“Unsaved Config”打开配置…

HTML5 Web IndexedDB 数据库

IndexedDB 是一种基于浏览器的 NoSQL 数据库&#xff0c;用于在客户端持久化存储大量结构化数据。 IndexedDB 允许通过键值对存储复杂的数据对象&#xff08;如对象、数组、文件等&#xff09;&#xff0c;并支持事务、索引、版本控制和复杂查询操作。 IndexedDB 是异步的&am…

VIVO Android面试题及参考答案

请重写算法题:求数组的全排列。 思路: 要获取一个数组的全排列,我们可以利用回溯算法。具体来说,回溯算法通过递归的方式逐步生成排列,在每一步都将一个元素加入排列中,然后在下一步递归中排除已选元素,回溯的时候撤销选择,尝试其他可能。 步骤: 递归生成排列: 使…