问题标签 [spmd]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1839 浏览

matlab - Sending data to workers

I am trying to create a piece of parallel code to speed up the processing of a very large (couple of hundred million rows) array. In order to parallelise this, I chopped my data into 8 (my number of cores) pieces and tried sending each worker 1 piece. Looking at my RAM usage however, it seems each piece is send to each worker, effectively multiplying my RAM usage by 8. A minimum working example:

Now, when I send this data to workers using parfor it seems to send the full cell instead of just the desired piece:

I actually use some function within the parfor loop, but this illustrates the case. Does MATLAB actually send the full cell data to each worker, and if so, how to make it send only the desired piece?

0 投票
1 回答
112 浏览

matlab - 在matlab中的spmd内生成随机数

由于模拟运行需要大量时间,我正在使用并行化在 Matlab 中运行蒙特卡罗模拟。

主要目标是创建一个非常大的面板数据集并使用它来估计一些回归。

问题是,当我在没有并行化的情况下运行模拟时,它们需要很长时间才能运行,所以我决定使用 spmd 选项。但是,运行并行代码的结果与正常代码相比有很大不同。

代码的密集部分是与 spmd 并行的代码,它创建了一个非常大的面板数据集,其中列是独立的个体,行是相关的时间段。

我的主要问题是,当我使用并行运行代码时,结果与我不使用它时的结果不同,而且如果我使用 8 个工人或 16 个工人,结果也不同。然而,在没有并行化的情况下运行代码在一段时间内是不可行的。

我相信问题来自随机数生成,但我无法修复 spmd 内的种子,因为这意味着在 Monte Carlo 循环内修复种子,因此所有重复都将具有相同的数字。

我想知道如何修复随机数生成器,这样无论我使用多少个工人都会给我相同的结果。

PS。另一种解决方案是在最外层循环(蒙特卡洛循环)中执行 spmd,但是当我以这种方式使用并行化时,我看不到性能提升。

非常感谢您的帮助。

0 投票
2 回答
75 浏览

matlab - 根据可用功能/工具箱跳过代码行

语境

在工作中,我构建了一个 GUI 来对几个显微图像执行图像配准。在我正在使用(即在工作中)的计算机上安装了并行处理工具箱,因此我可以利用spmd块将工作分配到计算机的核心上。

首先,我创建了一个codistributed数组来将我的数组拆分为更小的块:

一切都很好,直到我在我自己的笔记本电脑上运行代码,在这台笔记本电脑上没有安装并行处理工具箱。显然我不能使用spmd块和共同分布的数组,所以我编写了非并行代码来注册图像,这同样有效,但执行时间更长。

问题

我遇到的问题是,spmd当我使用家用笔记本电脑时,需要注释块中的代码,否则 Matlab 会抱怨:

因此,即使我检查是否安装了 PP 工具箱(或未安装)并根据是否安装使用条件执行不同的命令,如下所示:

Matlab 不会评估if语句的条件,会抛出我上面提到的错误。这很麻烦,因为每次我在笔记本电脑上使用代码时,我都需要注释所有产生错误的行(其中有很多行),反之亦然。

问题

是否可以避免手动注释代码并使 Matlab 在未安装 PP 工具箱的计算机上运行时不必担心协同分布式数组?

也许我错过了调试世界中一些明显的东西,但我无法绕过它。

如果有用的话,我会在 Mac 上运行(R2015a 在工作中,R2013a 在家里)。

编辑

澄清情况:

在执行任何代码行之前都会弹出错误。我猜 Matlab 在执行任何代码之前都会解析整个代码,所以我可以避免它的唯一方法是注释它。其他函数不会发生这种情况(在这种情况下出现经典),但我可以通过语句undefined function [...]避免它。if/else这确实是codistributedMatlab 不喜欢的术语。

0 投票
1 回答
72 浏览

matlab - 在matlab(并行)中使用spmd将函数应用于向量的一部分

我正在使用并行计算工具箱在 MatLab 中工作。

任务

我有一个向量 v。我有 4 个核心。我想在每个核心上拆分矢量(因此每个核心处理矢量的 1/4,假设 length(v) 可被 4 整除)并在每个部分上应用函数 f()。

所以对于核心 1: f1 = f(v 属于第 1 部分)

对于核心 2: f2 = f(v 属于第 2 部分)

等等。

然后我想收集结果,以便在此之后我有:f =“一个包含 f1 的所有元素和 f2 的所有元素的向量,等等。” 在主核心上(如果你愿意的话,也许 MatLab 称之为“客户端”,但我不确定)。

试图

和?

这不能按预期工作。我确实得到了正确的 f 大小,但不知何故,似乎发生的是“lpv”只是赋予每个核心的同一块。但我不确定这是否是问题所在。

帮助?

我没有做过很多 MatLab 并行编程。我将如何完成我的任务?

0 投票
1 回答
187 浏览

matlab - 使用并行处理的 MATLAB 数组结构向量化

我正在尝试在 Matlab 中对以下数据结构进行矢量化,但我找不到/编码一种有效的方法。
A = 1x2 结构数组,字段: [a , b , c]
A(1) = a: 1 , b: 2 , c: [1x1 struct]
A(1).c = key: 5
A(2) = a : 1 , b: [] , c: [1x3 struct]
A(2).c = 1x3 结构数组,字段为:[key , key2]
A(2).c(1).key = 3
A(2)。 c(2).key = 4
A(2).c(3).key = 7
A(2).c(1).key2 = 10
A(2).c(2).key2 = []
A( 2).c(3).key2 = 17

我知道。这是一种非常低效的数据结构。这就是我尝试使用索引对其进行矢量化的原因,因此最终结构看起来像
A = 1x1 结构,其中包含字段 [a , b , c , b_index , c_index]
Aa = [1 1]
Ab = [2]
A.b_index = [1]
Ac = 1x1 结构与字段 [key key2 key2_index]
A.c_index = [1 2 2 2]
Ackey = [5 3 4 7]
Ackey2 = [10 17]
Ackey2_index = [2 4]

我的尝试1: 我首先在每个级别尝试了parfor(对于这个例子,具体来说:A,c,关键3个级别)首先进行调查,看看它是否为空,它包含什么数据,我需要索引这个场地。然后 vertcat(x.(fieldname)) 如果它不是结构叶。但如果是,我将其打包为一个单元格并递归地将其向下推以进行矢量化。

这行得通,但不幸的是,它需要的时间太长。当我对其进行配置文件时,它显示了一直占用的 mex 分布函数。我猜那是因为我在每个级别都在做 parfor,因此 MATLAB 必须在每个级别非常频繁地索引并分发给每个工作人员。

我的尝试2: 我已经尝试先对结构进行完全的 parfor 调查。为每个字段使用 uint8 值。然后在组合阶段,我先用vertcat查看调查结果,看是否需要索引,是否需要对数据字段做cat(3,...)。但这在调查阶段内存效率低且速度慢。并且在组合阶段并没有加速太多。尽管索引变得容易得多。

我想我的问题是
1. 如何以 parfor 仅索引和分发整个数组一次的方式对其进行编码,以便我的第一次尝试可以更有效,或者我的第二次尝试是一个更好的主意?
2. 解决问题的一般方法是什么?

0 投票
1 回答
225 浏览

matlab - 使用 Matlab 并行读取两份签证文书

我尝试使用 Matlab (2015a) 从两个 Keysight 示波器中读取数据。为此,我使用带有 spmd 命令的并行计算工具箱。我有一个函数来读取接受签证对象作为参数并返回原始数据的数据。这在 spmd 命令之外可以正常工作(范围 1 和范围 2 是开放签证对象):

我从两个示波器中获取数据。

如果我做:

我收到以下错误:

任何想法出了什么问题?

干杯尼尔斯

0 投票
0 回答
54 浏览

matlab - MATLAB spmd 动态字段名调用

如何访问 spmd 块中的数据字段?

我有以下代码 -

但是,我收到以下错误 -
使用 codistributed/subsref 时出错(第 27 行)
分布式 SUBSPEF 目前仅支持 () 索引。

那么,这是否意味着在这种情况下我必须执行struct2cell并执行我自己的字段名索引保持?

0 投票
1 回答
2556 浏览

opencl - 如何在 OpenCL 中充分利用 SIMD?

Beignet 的优化指南中,针对英特尔 GPU 的 OpenCL 开源实现

工作组大小应大于 16 并且是 16 的倍数。

由于 Gen 上两个可能的 SIMD 通道是 8 或 16。为了不浪费 SIMD 通道,我们需要遵循此规则。

在Intel Processor Graphics Gen7.5的计算架构中也提到:

对于基于 Gen7.5 的产品,每个 EU 有 7 个线程,总共 28 KB 的通用寄存器文件 (GRF)。

...

在 Gen7.5 计算架构上,大多数 SPMD 编程模型采用这种风格的代码生成和 EU 处理器执行。实际上,每个SPMD 内核实例似乎都在其自己的 SIMD 通道内连续且独立地执行

实际上,每个线程同时执行一个 SIMD-Width 数量的内核实例。因此,对于计算 内核的 SIMD-16 编译,SIMD-16 x 7 线程 = 112 个内核实例 可以在单个 EU 上同时执行。同样,对于 SIMD-32 x 7 线程 = 224 个内核实例在单个 EU 上同时执行。

如果我理解正确,SIMD-16 x 7 threads = 112 kernel instances以 为例,为了在一个 EU 上运行 224 个线程,工作组大小需要为 16。然后 OpenCL 编译器会将 16 个内核实例折叠成一个 16 通道 SIMD 线程,并执行此操作在 7 个工作组上运行 7 次,然后在一个 EU 上运行它们?

问题1:直到这里我是正确的吗?

然而OpenCL 规范也提供向量数据类型。因此,通过传统的 SIMD 编程(如在 NEON 和 SSE 中)充分利用欧盟的 SIMD-16 计算资源是可行的。

问题 2:如果是这种情况,使用 vector-16 数据类型已经明确使用 SIMD-16 资源,因此消除了 at-least-16-item-per-work-group 限制。是这样吗?

问题3:如果以上都成立,那么这两种方法如何相互比较:1) OpenCL编译器将112个线程折叠成7个SIMD-16线程;2) 7 个本机线程被编码为明确使用向量 16 数据类型和 SIMD-16 操作?

0 投票
1 回答
198 浏览

matlab - 在 Matlab 中使用 spmd(并行计算)时等待

spmd用来将两个不同的任务分配到计算机的两个处理器中。代码类似于:

每个任务打开一个文件并处理它,存储结果。当仍有文件要处理时,循环继续。我的问题是TASK_ONE要处理的文件较少,当它完成时,代码停止(它退出spmd块)。因此,TASK_TWO并未完成对所有文件的处理。有没有办法让它spmd一直运行直到TASK_TWO完成,即使TASK_ONE已经完成?

0 投票
1 回答
28 浏览

matlab - Proceacmiento 使用 matlab 分发图像

我在集群中进行图像处理,但未能达到最佳性能,我有一个复制边缘的函数和另一个应用过滤器或掩码的函数,但是当使用 MATLAB SPMD 的执行时间时,程序并没有满足每个时间随着时间的增加工人的增加。

这是涂抹睫毛膏的功能