Tag: 分布式计算

MPI_Gather()将中心元素转换为全局矩阵

这是来自MPI_Gather 2Darrays的后续问题。 情况如下: id = 0 has this submatrix |16.000000| |11.000000| |12.000000| |15.000000| |6.000000| |1.000000| |2.000000| |5.000000| |8.000000| |3.000000| |4.000000| |7.000000| |14.000000| |9.000000| |10.000000| |13.000000| ———————– id = 1 has this submatrix |12.000000| |15.000000| |16.000000| |11.000000| |2.000000| |5.000000| |6.000000| |1.000000| |4.000000| |7.000000| |8.000000| |3.000000| |10.000000| |13.000000| |14.000000| |9.000000| ———————– id = 2 has this submatrix […]

可以在ZeroMQ中回复吗?

我正在ZeroMQ中实现Lamport的分布式MUTEX算法 。 算法: 请求流程 1)将其请求推送到自己的队列中(按时间戳排序) 2)向每个节点发送请求。 3)等待来自所有其他节点的回复。 4)如果自己的请求位于其队列的头部并且已收到所有回复,请输入关键部分。 5)退出临界区时,从队列中删除其请求并向每个进程发送一条释放消息。 其他流程 1)收到请求后,将请求推送到自己的请求队列中(按时间戳排序)并回复时间戳。 2)收到释放消息后,从自己的请求队列中删除相应的请求。 我正在考虑用C或Java编写解决方案,但问题的核心似乎是语言中立的。 在我的问题中,我有三种消息类型,让我们称它们为Request , Reply和Release 。 Request / Reply消息很好地适合REQ / REP模式,但Release消息是单向信号,不需要回复。 我可以添加一个额外的PUB / SUB对,但是,根据我的理解,我将无法保证系统中的FIFO传送顺序,因为我最终会有两个并发的TCP连接(这个假设是正确的吗?)。 我可以使用一个基本的非约束fullduplex通道。 另一个答案建议使用DEALER / ROUTER对,但对于这样一个简单的问题来说似乎有些过分。 在文档中,在高级请求 – 回复模式章节中描述了DEALER / ROUTER,我的问题似乎不需要极端的解决方案。 我的问题怎么解决?

为什么Google的TrueTime API很难复制?

我不确定为什么媒体普遍认为谷歌的TrueTime API难以复制(有线,Slashdot等)。 我可以理解获得谷歌实现的低错误间隔是多么困难,但我不知道API本身将如何变得非常困难。 例如,我掀起了一个黑客攻击版本。 这是间隔。 typedef struct TT_interval { struct timeval earliest; struct timeval latest; } TT_interval; 这是现在的function。 int TT_now(TT_interval* interval) { struct ntptimeval tv; struct timeval delta; struct timeval* earliest_p = &(interval->earliest); struct timeval* latest_p = &(interval->latest); struct timeval* now_p = &(tv.time); struct timeval* delta_p = δ timerclear(&delta); timerclear(&interval->earliest); timerclear(&interval->latest); if(ntp_gettime(&tv) == 0) { […]

MPI_Gather 2D数组

N是4, N_glob 。 它恰好是相同的大小。 p是4。 这是代码的一小部分: float **global_grid; float **gridPtr; lengthSubN = N/pSqrt; subN = lengthSubN + 2; grid = allocate2D(grid, subN, subN); .. MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType); MPI_Type_commit(&rowType); .. gridPtr = grid; .. MPI_Barrier(MPI_COMM_WORLD); if(id == 0) { global_grid = allocate2D(global_grid, N_glob, N_glob); } MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&(gridPtr[0][0]), 1, rowType, &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if(id […]

MPI_IN_PLACE如何与MPI_Scatter一起使用?

当作为MPI_Scatter的参数给出时MPI_IN_PLACE做了什么以及如何使用它? 我无法理解man MPI_Scatter : 当通信器是一个内部通信器时,您可以就地执行收集操作(输出缓冲区用作输入缓冲区)。 使用变量MPI_IN_PLACE作为根进程recvbuf的值。 在这种情况下,将忽略recvcount和recvtype,并且根进程不会向其自身发送任何数据。 由于就地选项将接收缓冲区转换为发送和接收缓冲区,因此包含INTENT的Fortran绑定必须将这些标记为INOUT,而不是OUT。 我想要做的是使用包含根数据的相同缓冲区作为每个其他进程的接收缓冲区(如MPI_Bcast )。 MPI_Scatter和MPI_IN_PLACE会让我这样做吗?

如何从C使用MPI_Scatter和MPI_Gather?

到目前为止,我的应用程序正在读取带有整数列表的txt文件。 这些整数需要由主进程存储在数组中,即排名为0的处理器。这样可以正常工作。 现在,当我运行程序时,我有一个if语句检查它是否是主进程,如果是,我正在执行MPI_Scatter命令。 根据我的理解,这将使用数字细分数组并将其传递给从属进程,即所有rank> 0。 但是,我不知道如何处理MPI_Scatter 。 从属进程如何“订阅”以获取子数组? 如何告诉非主进程对子数组执行某些操作? 有人可以提供一个简单的例子来向我展示主进程如何从数组中发出元素然后让奴隶添加总和并将其返回给主数据库,将所有总和加在一起并将其打印出来? 我的代码到目前为止: #include #include //A pointer to the file to read in. FILE *fr; int main(int argc, char *argv[]) { int rank,size,n,number_read; char line[80]; int numbers[30]; int buffer[30]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); fr = fopen (“int_data.txt”,”rt”); //We open the file to be read. if(rank […]

使用MPI分散不同大小的矩阵块

(假设所有矩阵都按行主顺序存储。)说明问题的一个例子是在3×3网格上分布10×10矩阵,以便每个节点中子矩阵的大小看起来像 |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 3×3 | 3×3 | 3×4 | |—–+—–+—–| | 4×3 | 4×3 | 4×4 | |—–+—–+—–| 我在Stackoverflow上看过很多post(例如使用MPI和MPI分区矩阵将 C块中的2D数组块发送 到块中 )。 但是它们只处理相同大小的块(在这种情况下,我们可以简单地使用MPI_Type_vector或MPI_Type_create_subarray并且只使用一个MPI_Scatterv调用)。 所以,我想知道在MPI中将矩阵分散到处理器网格中的最有效方法是什么,其中每个处理器都有一个具有指定大小的块。 PS我也看过MPI_Type_create_darray ,但似乎没有让你为每个处理器指定块大小。