问题标签 [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.
fortran - 在fortran中使用MPI_PUT,不同等级使用c_loc有不同的位移
我将 MPI 等级分开以计算数组的不同部分,然后我想将这些切片放置/发送到不参与计算的不同等级上。该等级是新通信器的主人,该通信器设置为对数组执行其他操作(平均、IO 等)。我让它与 MPI_isend 和 MPI_irecv 一起工作,现在我想尝试 MPI_Put。
我已经! if (.not.allocated(diag_comm)) then
注释掉了,因为我尝试对所有计算 r 的排名进行此操作,但我得到了相同的结果。我在我的 Makefile 中编译mpiifort -O0 -fpe0 -init=snan,arrays -no-wrap-margin -traceback -stand f18
和运行。mpirun -n 12 ./$@.x : -n 6 ./$@.x
我正在使用的 mpiifort 版本是
输出 ( write (6,*) loc_base, grk
) 很奇怪。
排名 12-17 是不参与“计算 r”的排名,但我不确定为什么c_loc(r(1,1))
这些排名不同。此外,等级 0 也不同。
我的实际问题是
1)如何计算displacement
变量?我做得对吗?等级之间是否应该有所不同,因为在这种情况下会有所不同?
2) 为什么c_loc(r(1,1))
12-17 的排名不同?这与这是一个 SPMD 程序有关吗?为什么等级 0 不同?
3)我可以与所有队伍进行单向沟通而不是只与一个队伍沟通吗?我让每个等级调用 mpi_isend,然后当我以另一种方式执行此操作时,我只是在所有等级发送中循环调用 mpi_irecv。我可以用 MPI_Put 做类似的事情吗?我应该使用 MPI_Get 吗?还有什么?
4)我如何让它工作?这只是我自己的一个教育例子,而我真正需要做的事情要复杂得多。
matlab - Matlab:关闭并行池 - 仅适用于 parfeval() 但不适用于 spmd
我想通过在 Matlab GUI 中按下按钮来关闭我的并行池,以停止执行在这些池工作者上运行的函数。
不幸的是,这仅在使用“parfeval()”启动函数时才有效。在这种情况下,只要我按下按钮,我的并行池就会关闭,因此使用 parfeval() 调用的函数会停止运行。
由于我更喜欢使用“spmd”而不是“parfeval”来建立工作人员之间的通信,因此我尝试了相同的方法,但失败了。
按下按钮时什么都没有发生,并且只有在我使用 ctrl+c 取消整个脚本时,并行池才会关闭。
希望有人可以帮助我解决这个问题。
在职的:
不工作:
目标:
我的最终目标是使用启动按钮并行启动不同的功能。
这些函数应该从 SPS、OPC UA 服务器和不同的传感器收集数据,并将收集到的数据连续写入 SQL 数据库。
为了将数据写入数据库,我考虑使用另一个并行函数——我们称之为“writeDB”——它从数据收集函数接收数据块并上传。
停止按钮应该通过中断所有功能来结束数据收集 - 目前我正在通过删除 parpool 来完成此操作。
提前致谢!
c - 任务是使用 p 线程并行化矩阵乘法并使用英特尔 ISPC 编译器进行矢量化
在 .ispc 文件中使用 pthread 生成错误如下: (1) t.ispc:2:13: Error: Illegal to return a "variating" or vector type from export function "matrix_mult_pl" export void * matrix_mult_pl( void *arg )
(2) t.ispc:2:36: Error: Varying pointer type parameter "arg" 在导出函数中是非法的。导出 void * matrix_mult_pl( void *arg )
(3) t.ispc:6:11: 错误:语法错误,意外'int'。tid = *(int *)(arg); // 获取顺序分配的线程 ID。^^^
以及更多错误。编码器附在下面。请查看在 ISPC 中使用 pthreads 的问题。
线程.c 文件线程.ispc 文件
为什么 ISPC 文件没有通过 pthread 并行化执行向量化?
matlab - MATLAB中的异步并行计算?
我希望在 MATLAB 中使用带有 spmd 的 labSend、labReceive 功能来执行以下操作:
- Lab1,运行全局优化例程并将中间结果传递给 Lab2
- Lab2,等待来自 Lab1 的中间结果(使用 labProbe),一旦收到使用此结果并开始新的优化程序。
- Lab3,4,..., n 等待来自 Lab_n-1 的先前结果,一旦收到使用此结果并开始新的优化程序。
问题:
来自实验室发送的数据:
这是为了 0.4907 是通过 labSend 发送的第一条消息。
从 labReceive 收到的最后一个值:
这意味着来自 labSend 的最后 5 条消息被忽略。
现在,spmd 例程是异步的,因为它 1) 必须等待上一个实验的中间结果,并且 2) 优化例程随着它的进行而加速(搜索更小的域)
因此,之前的实验室可能会在 lab_n 有机会处理它们之前发送多条消息(执行其他操作)。
问题:
如果我正在查看 Lab2 并将其存储在某个地方,有没有办法立即处理(接收)来自 Lab1 的数据?或者有没有办法只处理最近的消息?并忽略任何排队的消息?
谢谢你的帮助!
matlab - MatLab 并行计算工具箱:为同一任务使用更多内核
我有一台有 4 个物理内核的笔记本电脑和 MatLab 并行计算工具箱。我需要执行两个独立的任务(真的很昂贵,比如说计算一个密集的大矩阵的最大特征值)。
所以,我想通过以下方式将任务分配给我的核心:
- 第一个任务有 2 个核心
- 第二个任务有 2 个核心
但我真的无法理解/找到如何在 MatLab 代码中设置它。
经过大量搜索,我发现我应该使用spmd
,但我在文档中找不到一个合适的示例,它允许我使用2 个核心来完成相同的任务。
MatLab 中的任何最小工作示例将不胜感激!
在丹尼尔的评论后编辑: 在创建一个由 4 个工人组成的并行池之后,我可以这样做:
编辑(2)
我可以设置NumThreads=2
,所以每个工人都会做两个任务(对吧?)。现在的问题是:我是否必须创建一个有4 个工作人员的 parpool,所以每个工作人员执行 2 个线程?更明确地说:
parpool(4);
%set NumThreads = 2 via Parallel computing toolbox
%define matrix A1, A2 of size 1000x1000
parfor i=1:2
x(i) = max(abs(eigs(A(i))));
end
我现在希望前两个核心在 上工作x(1)
,而另外两个在x(2)
最后编辑:
使用parfor
评论中写的 a ,我会这样做:
matlab - 如何在 matlab 中正确使用带有句柄类的 spmd 并在工作人员之间同步数据
我的问题如下:
我有一个包含许多对象的句柄类,我想将它们相互链接。所以我的类顶点中的顶点(1)需要链接到顶点(2)和顶点(3),以便我的顶点(1)具有属性顶点(1).neighboor_vertex=顶点(2)(和顶点( 3))。
这只是必须要做的一件事(实际上我需要将不同的类相互链接和重新链接,因为它有数百万个对象并希望并行执行,并且链接不能并行工作的事实阻止了我关注脚步)。
因此,虽然工人 1 将顶点(1)链接到顶点(2),但没有其他工人应该能够更改两者的属性,他们可以说链接 5 到 7 左右,并且当链接完成时,顶点的新链接(1) 到 vertex(2) 和 vertex(2) 到 vertex(1),需要对所有其他 worker 进行更新,这样当另一个 worker 想要将 vertex(3) 链接到 vertex(1) 时,它必须知道它已经链接到顶点(1),否则会有两个不同版本的顶点(1),一个链接到顶点(2),一个链接到顶点(3)。
因此,对于多个工作人员无法更改顶点的阻塞,我需要在 spmd 中使用诸如互斥锁之类的东西,否则它不会受到威胁......
在 Matlab 中执行此操作的最佳方法是什么?
非常感谢提前致以最诚挚的问候
matlab - 使用 matlab 的 spmd 计算简单的三重积分给了我不正确的解决方案,对我做错了什么有什么想法吗?
使用 matlab 的 spmd 计算简单的三重积分给了我不正确的解决方案,对我做错了什么有什么想法吗?
q 是正确的解决方案。
matlab - 与串行实现相比,parfeval 的时间开销背后的原因是什么?
我正在尝试并行化 Gauss-Seidel 算法中使用的一些代码,以近似线性方程组的解。
简而言之,对于一个NxN
矩阵,在一次迭代期间,我正在sqrt(N)
一个接一个地进行并行计算。在并行计算的一个会话中,我将计算sqrt(N)
向量值的任务分配给可用的工作人员。
并行计算会话中涉及的代码是这样的:
调用的函数parfeval
是这样的:
完整的代码可以在这里找到:https ://pastebin.com/hRQ5Ugqz
1000x1000
矩阵的 matlab 分析器。并行代码比串行代码慢 20 到 135 倍,具体取决于所选的系数矩阵(并且仍然比 快得多spmd
)。
parfeval 计算可能会懒惰地在第 50 行和第 57 行之间拆分?尽管如此,我还是无法向自己解释为什么会有这么大的开销。这似乎与调用 parfeval 的次数有关:我确实通过降低 parfeval 调用来降低执行时间。
有什么可以进一步优化的吗?我必须求助于用 C++ 编写代码吗?
请帮忙。非常感谢!