如何在 spmd 块中索引共分布式数组

2024-01-26

我正在做一个非常大的计算(大气吸收),其中有很多单独的窄峰,最后全部加起来。对于每个峰,我预先计算了峰形函数值高于我选择的阈值的范围,然后我逐行将峰添加到我的光谱中。下面给出了一个最小示例:

X = 1:1e7;
K = numel(a); % count the number of peaks I have.
spectrum = zeros(size(X));
for k = 1:K
    grid = X >= rng(1,k) & X <= rng(2,k);
    spectrum(grid) = spectrum(grid) + peakfn(X(grid),a(k),b(k),c(k)]);
end

在这里,每个峰都有一些定义位置和形状的参数(a,b,c),以及进行计算的范围(rng)。这效果很好,在我的机器上,它的基准测试时间约为 220 秒即可完成完整的数据集。然而,我有一台 4 核机器,我最终想在集群上运行它,所以我想对其进行并行化并使其可扩展。

因为每个循环都依赖于上一次迭代的结果,所以我不能使用parfor,所以我正在迈出学习如何使用的第一步spmd块。我的第一次尝试是这样的:

X = 1:1e7;
cores = matlabpool('size');
K = numel(a);
spectrum = zeros(size(X),cores);
spmd
    n = labindex:cores:K
    N = numel(n);
    for k = 1:N
        grid = X >= rng(1,n(k)) & X <= rng(2,n(k));
        spectrum(grid,labindex) = spectrum(grid,labindex) + peakfn(X(grid),a(n(k)),b(n(k)),c(n(k))]);
    end
end
finalSpectrum = sum(spectrum,2);

这几乎有效。程序在最后一行崩溃,因为spectrum属于类型Composite,以及文档2013a转弯的方法参差不齐Composite数据转化为矩阵(cell2mat不起作用)。这也不能很好地扩展,因为我拥有的核心越多,矩阵就越大,并且必须将大矩阵复制到每个工作人员,然后工作人员会忽略大部分数据。问题一:如何将复合数据类型转换为可用的数组?

我尝试的第二件事是使用codistributed array.

spmd
    spectrum = codistributed.zeros(K,cores);
    disp(size(getLocalPart(spectrum)))
end

这告诉我每个工人都有一个大小为 [K 1] 的向量,我相信这就是我想要的,但是当我尝试融合上述方法时

spmd
    spectrum = codistributed.zeros(K,cores);
    n = labindex:cores:K
    N = numel(n);
    for k = 1:N
        grid = X >= rng(1,n(k)) & X <= rng(2,n(k));
        spectrum(grid) = spectrum(grid) + peakfn(X(grid),a(n(k)),b(n(k)),c(n(k))]);        end
    finalSpectrum = gather(spectrum);
end
finalSpectrum = sum(finalSpectrum,2);

I get Matrix dimensions must agree错误。由于它位于并行块中,因此我无法使用正常的调试拐杖来逐步执行循环并查看每个块在每个点的大小,以了解发生了什么情况。问题2:在 codistributed array 中索引进出的正确方法是什么spmd block?


关于问题#1,Composite客户端中的变量基本上指的是非分布式的变体数组存储在工人身上。您可以通过以下方式从每个工作人员访问该数组{}- 使用相应的 labindex 进行索引(例如:spectrum{1}, spectrum{2}, ..).

对于您的代码将是:finalSpectrum = sum(cat(2,spectrum{:}), 2);


现在我自己使用随机数据尝试了这个问题。下面是要比较的三种实现(请参阅此处以了解之间的区别分布式和非分布式数组 http://www.mathworks.com/help/distcomp/nondistributed-versus-distributed-arrays.html)。首先我们从常用数据开始:

len = 100;    % spectrum length
K = 10;       % number of peaks
X = 1:len;

% random position and shape parameters
a = rand(1,K); b = rand(1,K); c = rand(1,K);

% random peak ranges (lower/upper thresholds)
ranges = sort(randi([1 len], [2 K]));

% dummy peakfn() function
fcn = @(x,a,b,c) x+a+b+c;

% prepare a pool of MATLAB workers
matlabpool open

1)串行for循环:

spectrum = zeros(size(X));
for i=1:size(ranges,2)
    r = ranges(:,i);
    idx = (r(1) <= X & X <= r(2));
    spectrum(idx) = spectrum(idx) + fcn(X(idx), a(i), b(i), c(i));
end
s1 = spectrum;

clear spectrum i r idx

2) SPMD 复合阵列

spmd
    spectrum = zeros(1,len);
    ind = labindex:numlabs:K;
    for i=1:numel(ind)
        r = ranges(:,ind(i));
        idx = (r(1) <= X & X <= r(2));
        spectrum(idx) = spectrum(idx) + ...
            feval(fcn, X(idx), a(ind(i)), b(ind(i)), c(ind(i)));
    end
end
s2 = sum(vertcat(spectrum{:}));

clear spectrum i r idx ind

3)具有共分布阵列的SPMD

spmd
    spectrum = zeros(numlabs, len, codistributor('1d',1));
    ind = labindex:numlabs:K;
    for i=1:numel(ind)
        r = ranges(:,ind(i));
        idx = (r(1) <= X & X <= r(2));
        spectrum(labindex,idx) = spectrum(labindex,idx) + ...
            feval(fcn, X(idx), a(ind(i)), b(ind(i)), c(ind(i)));
    end
end
s3 = sum(gather(spectrum));

clear spectrum i r idx ind

所有三个结果应该相等(在可接受的小误差范围内)

>> max([max(s1-s2), max(s1-s3), max(s2-s3)])
ans =
   2.8422e-14
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 spmd 块中索引共分布式数组 的相关文章

  • Hive - 线程安全的自动递增序列号生成

    我遇到一种情况 需要将记录插入到特定的 Hive 表中 其中一列需要是自动递增的序列号 即在任何时间点都必须严格遵循 max value 1 规则 记录从许多并行的 Hive 作业插入到这个特定的表中 这些作业每天 每周 每月批量运行 现在
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • Node.JS async.parallel 不会等到所有任务完成

    我在用异步并行 https github com caolan async并行运行两个函数 这些函数请求 RSS 源 然后 RSS 提要被解析并添加到我的网页中 但由于某种原因async parallel运行回调方法而不等待两个函数完成 文
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • Java 套接字 - 如何模拟多个客户端

    我有一个用Java编写的套接字程序 服务器使用 DatagramSocket 创建具有特定端口号的套接字 我有一个客户端java程序 它连接到该服务器并发送一些消息 目前我有 3 台笔记本电脑 因此我使用 1 台运行服务器 其余 2 台作为
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • 通过颜色渐变修补圆

    我正在尝试绘制一个颜色渐变 我希望它沿轴均匀 在下图由角度定义的情况下 pi 7 当我使用patch命令 绘图与所需的梯度方向匹配 但沿其方向并不均匀 沿圆的点之间形成各种三角形 这是代码 N 120 theta linspace pi p
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • 考虑预分配速度[重复]

    这个问题在这里已经有答案了 我正在做以下事情 for i 1 m index 0 for j 1 n index index values i j 2 j 1 if j 1 symbol chip chip values index 1 e
  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp

随机推荐

  • 等待异步读取所有文件(FileReader),然后运行代码

    我有一个页面 用户可以在其中选择一个文件夹来上传文件 在发送文件之前 我需要阅读它们并检查数据 我的代码组织如下 folder select on change getValidFileList var fileList var getVa
  • 如何安排 Callable 在特定时间运行?

    我需要在一天中的特定时间运行可调用的 一种方法是计算现在与所需时间之间的时间差 并使用 executor scheduleAtFixedRate 有更好的主意吗 executor scheduleAtFixedRate command TI
  • 选择计数 = 1 的位置

    Table LESSON有字段LessonDate MemberId 除其他外 但只有这两个是相关的 英语 给我一份只上过一门课的学生上这门课的日期列表 我已经尝试了很多事情 这是我的最新尝试 SELECT LessonDate FROM
  • 如何在 Azure 搜索 REST API 上使用“id”删除特定文档?

    我想知道如何删除Azure搜索索引中的特定文档 我想通过 REST API 使用 id 来删除文档 我曾寻找过 但找不到路 odata context https xxxx metadata docs value search score
  • 为什么 rake asset:precompile 在开发中会出现问题,但在我的生产环境中不会出现问题

    我已将 heroku 上的应用程序升级为 cedar stack 以便资产管道正常工作 我已按照中给出的说明进行操作Heroku 的文档 https devcenter heroku com articles rails3x asset p
  • git clone 后跟状态显示未跟踪的文件

    抱歉 我是 git 新手 尽管我非常熟悉旧的源代码控制系统 如 cvs 和 svn 我的最终目标是通过在本地克隆远程存储库 将文件添加到本地存储库 提交更改 然后将本地存储库推回远程 将文件添加到远程存储库 不在我的计算机上 我试过这个 g
  • 访问 WCF UsernamePasswordValidator 中的当前 InstanceContext

    我有一个使用自定义 UsernamePasswordValidator 的 WCF 服务 验证器需要访问我的实体框架上下文 我想为整个服务调用创建一个 ObjectContext 然后在调用结束时销毁 处置它 因此 我创建了一个提供此功能的
  • 从 C# 的 zip 文件中读取二进制文件而不解压它

    我想从 zip 文件中读取二进制文件而不解压缩它 zip 文件结构 zipFolderName subFolder BinFile 在 BinFile 中 我有 Id1 id2 value1 id1 id2 are string value
  • 从子列表中检索升序整数的所有可能组合

    我有包含子列表的列表 我想从这些列表中检索按升序排列的所有整数组合 子列表的顺序也很重要 请参阅预期输出 当函数也返回整数本身时 这并不是一件坏事 请参阅预期输出中的可选子列表 另外 当子列表具有多个值时 我也想将这些值视为单独的组合 这些
  • 在 Linux 上使用 boost::serialization 序列化 unique_ptr 的 std::vector 失败

    我在使用 std unique ptr 的 std vector 的 boost 序列化时遇到问题 unique ptr 的类型并不重要 在下面的示例中 使用整数 include
  • !!处理请求时出现意外错误:无法分配内存

    请帮助我解决这个错误 使用 ruby 脚本将记录从文本文件加载到数据库时出现此错误 如果我使用少量记录加载到数据库中 它就可以正常工作 但如果有大量记录 则失败 CSV foreach fileName do line completePa
  • Microsoft Graph API:访问控制允许来源

    我正在尝试集成 Microsoft Graph 身份验证和访问共享点以及用户的图形配置文件和图片 我遵循了他们的文件https developer microsoft com en us graph docs authorization a
  • Qt3D默认制服和属性

    我开始学习通过 QML 使用着色器 但找不到任何讨论传递给着色器的默认统一和属性值的参考资料 在某些示例中 我们可以看到其中的几个 例如顶点位置 or 模型视图投影 这也被传递为mvp 但是没有包含我们可以使用的所有变量的清晰列表 在调查
  • 跨区域小数/双精度解析

    事实上 我有多个可以生成数字数据的系统 它们以文本文件的形式存储在某些网络服务器上 有些系统使用小数点作为分数分隔符 有些系统也使用小数点逗号 应用程序 胖客户端 net 2 0 也可以在任一类型的系统上运行 因此 经过一番绊倒后 我这样做
  • Count 总是返回 1...但是它存在吗?

    我试图在创建文件名之前检查特定类别的 评论 列中是否已存在文件名 如果它已经存在 我想将今天的日期添加到名称中以使其成为唯一的文件名 我似乎无法使用计数来查找它是否存在 当我 echo checkfile 时 无论文件存在与否 它总是返回
  • 三角矩阵系数索引号的算法

    我认为这一定很简单 但我无法正确理解 我有一个 MxM 三角矩阵 其系数逐行存储在向量中 例如 M m00 m01 m02 m03 m11 m12 m13 m22 m23 m33 存储为 coef m00 m01 m02 m03 m11 m
  • 为什么 Mathematica 会打破模块中正常的作用域规则?

    正如最近的一篇文章中指出的post https stackoverflow com questions 2733239 lexical and dynamic scoping in mathematica local variables w
  • 在 Angular 4 模板中显示地图内容

    我正在尝试在我的模板中显示地图 myMap Map
  • Azure 上的静态类和多个实例

    我正在构建一个将部署在 Azure 上的应用程序 如果我使用静态类 所有实例是否都可以访问相同的静态对象 或者每个实例在生成每个实例时都会实例化自己的静态对象 static每个 AppDomain 字段都有一个值 它们显然不会在计算机之间共
  • 如何在 spmd 块中索引共分布式数组

    我正在做一个非常大的计算 大气吸收 其中有很多单独的窄峰 最后全部加起来 对于每个峰 我预先计算了峰形函数值高于我选择的阈值的范围 然后我逐行将峰添加到我的光谱中 下面给出了一个最小示例 X 1 1e7 K numel a count th