我正在研究一个将数组与矩阵相乘的小应用程序.它没有任何问题.我正在努力衡量应用程序的执行时间.我可以找到每个进程的执行时间(开始和结束),但我需要全局时间.
这是我的代码:
int main(int argc, char **argv){
int rang, procesus;
MPI_Status statut;
double start, end, max_end = 0, min_start = 10000;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rang);
MPI_Comm_size(MPI_COMM_WORLD, &procesus);
MPI_Barrier(MPI_COMM_WORLD);
start = MPI_Wtime();
printf("Starting time of process n. %d %f\n",rang, start);
if(rang==0){
//Master work
}else{
//slaves work
}
MPI_Barrier(MPI_COMM_WORLD);
end = MPI_Wtime();
printf("Ending time of process n.%d %f\n\n\n",rang, end);
MPI_Finalize();
//Out of the Parallelized task
if(min_start > start){
min_start = start;
printf("New minumum starting time %f\n", min_start);
}
if(max_end < end){
max_end …
Run Code Online (Sandbox Code Playgroud) 我知道MPI_Send()
是一个阻塞调用,它等待修改应用程序缓冲区以便重用是安全的.为了使发送调用同步(应该与接收器握手),我们需要使用MPI_Ssend()
.我想知道两者之间的区别.假设我需要在进程中发送固定数量的字节,哪一个应该花费更长的时间?
对我来说,代码适用于MPI_Send()调用,但无限期地等待MPI_Ssend().可能的原因是什么?
最重要的是,我非常确定在使用时接收过程中正在接收数据MPI_Send()
,因此这种推断无助于在使用时等待握手MPI_Ssend()
.
或者我可以得出结论:MPI_Send()
您可以将数据发送到自我过程但不能使用MPI_Ssend()
?
最近在R2.14中增加了对并行计算的直接支持,这引发了一个问题.在R中创建集群有很多选项.我snow
定期使用SOCK集群,但我知道还有其他方法,如MPI.我使用SOCK snow
集群因为我不需要安装任何其他软件(我使用Fedora 13).
那么,我的具体问题:
我正在使用MPI调用使用c ++在多个进程上运行一个过程.我的Main函数中的前几行看起来像:
int main(int argc, char *argv[]){
int comm_sz;
int my_rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
x = atoi(argv[4]);
y = atoi(argv[5]);
Run Code Online (Sandbox Code Playgroud)
现在当我执行并运行我的程序时
mpiexec -n 1 program 10 10
Run Code Online (Sandbox Code Playgroud)
我希望x和y被赋值为10和10,因为它们是传递的第4和第5个参数.但这不会发生,它会相应地将这些变量分配给0和0.并且我的程序没有按预期运行.
当我更改这些数字时,我的串行代码正在运行.它只是我是MPI的新手.
你能说明我哪里出错吗?
当我使用%dopar%
调用自定义函数的foreach循环(使用)时,我遇到了问题.使用Linux时没有真正的问题,但是当我使用Windows时,无法找到自定义的功能.很难用文字解释这个问题,所以我写了一个小例子来展示它.假设我有三个简单函数的集合,其中FUN2
(using %do%
)和FUN3
(using %dopar%
)调用第一个函数(FUN
):
FUN <- function(x,y,z) { x + y + z }
FUN2 <- function(a, b) {
foreach(i=1:3) %do% FUN(i, a, b)
}
FUN3 <- function(a, b) {
foreach(i=1:3) %dopar% FUN(i, a, b)
}
Run Code Online (Sandbox Code Playgroud)
这些函数存储在一个名为的脚本中foreach_testfunctions.R
.在另一个脚本(foreach.test
)中我发布了这些函数,使用library(doParallel)
并尝试使用这些函数.首先我用Linux做,一切正常:
source("foreach_testfunctions.R")
a <- 2
b <- 3
library(doParallel)
registerDoParallel()
foreach(i=1:3) %do% FUN(i, a, b) ## works fine
FUN2(a, b) ## works fine
foreach(i=1:3) %dopar% FUN(i, a, b) ## …
Run Code Online (Sandbox Code Playgroud) I am new to parallel computing and just starting to try out MPI and Hadoop+MapReduce on Amazon AWS. But I am confused about when to use one over the other.
For example, one common rule of thumb advice I see can be summarized as...
But then, I also see implementation of MapReduce on MPI (MR-MPI) which does not provide fault tolerance but seems …
我不确定何时必须在MPI发送,接收呼叫中使用不同的数字作为标记字段.我读过这篇文章,但我无法理解.
有时候,A可能需要向B发送许多不同类型的消息.而不是B必须通过额外的措施来区分所有这些消息,MPI允许发送者和接收者也用消息指定消息ID(称为标记) ).当进程B仅请求具有特定标签号的消息时,具有不同标签的消息将由网络缓冲,直到B为它们做好准备.
我是否必须使用标签,例如,当我在进程A中有多个调用"isend"(带有不同的标签)并且在进程B中只有1个调用"ireceive"时?
我想在我的Kubernetes集群上运行MPI作业.上下文是我实际上运行的是一个现代的,包装良好的容器化应用程序,但部分工作量是一个传统的MPI工作,不会很快重写,我想把它变成一个kubernetes"世界观"尽可能地.
最初的一个问题:是否有人在kube集群上运行MPI作业有任何成功?我见过Christian Kniep的工作是让MPI工作在Docker容器中运行,但是他正在沿着docker swarm路径(使用每个容器中运行的consul发现同行)并且我想坚持kubernetes(已经知道了所有同行)并从外部将此信息注入容器中.我完全可以控制应用程序的所有部分,例如,我可以选择使用哪个MPI实现.
关于如何继续,我有几个想法:
包含slurm和应用程序代码的胖容器 - >在容器启动时使用适当的信息填充slurm.conf - >使用srun作为容器入口点来启动作业
仅使用OpenMPI(无淤泥)的更轻薄的容器 - >使用外部信息(由kubernetes提供)在容器中填充rankfile - >使用mpirun作为容器入口点
更简洁的方法,我基本上通过设置一些环境变量(例如OpenMPI ORTE)来"伪造"MPI运行时 - >直接运行mpicc'd二进制文件(通过env vars可以找到它的同行) )
一些其他选择
绝望地放弃
我知道尝试将"已建立"的工作流程(如MPI)与kubernetes和容器的"新热点"混合起来有点阻抗不匹配,但我只是在寻找指针/陷阱之前我走得太远了.如果什么都不存在,我很乐意破解一些东西并将其推回上游.
我已经阅读了这些术语的定义,我的解释是团体和沟通者之间存在一对一的关系.组是希望彼此通信的一组进程,并且通信器是组的实现.
它是否正确?如果是这样,为什么有两个不同的术语?
(假设所有矩阵都按行主顺序存储.)说明问题的一个例子是在3x3网格上分布10x10矩阵,以便每个节点中子矩阵的大小看起来像
|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 4x3 | 4x3 | 4x4 |
|-----+-----+-----|
Run Code Online (Sandbox Code Playgroud)
我在Stackoverflow上看过很多帖子(例如使用MPI和MPI分区矩阵将C块中的2D数组块发送到块中).但它们只处理相同大小的块(在这种情况下,我们可以简单地使用 MPI_Type_vector
或MPI_Type_create_subarray
只有一个MPI_Scatterv
调用).
所以,我想知道在MPI中将矩阵分散到处理器网格中的最有效方法是什么,其中每个处理器都有一个具有指定大小的块.
PS我也看了MPI_Type_create_darray
,但似乎没有让你为每个处理器指定块大小.
c parallel-processing message-passing distributed-computing mpi