MPI C 如何访问其他级别的 struct/variables
MPI C how to access struct/variables of other rank
所以如果我有 C 代码 运行 MPI 和这样的结构:
typedef struct Node{
int succ;
int pred;
int has_token;
char state;
}node;
一个rank可以访问另一个rank节点吗?
例如我有:
//What i want:
if(rank==0){
//so rank 0.state lets say i want rank 2.state
if(currentRankNode.state=='I' && someOtherRankNode.state=='S'){
//do_smth
}
}
问题是,我应该用什么替换 someOtherRankNode
以获得例如等级 2 的节点和之后的状态?
根据您在这里获得的少量信息,我认为您要问的是如何查看另一个 MPI 进程的内存(即使用 rank == 2
查看进程的当前状态)。
默认情况下,MPI进程的内存空间被操作系统完全隔离,即使运行在同一台物理机器上。您必须通过发送和接收消息来同步状态知识。在较新版本的 MPI 中,您可以使用 MPI Windows: https://www.mpich.org/static/docs/v3.2/www3/MPI_Win_allocate_shared.html 等功能,尽管这有点复杂。
不,至少你需要一个像MPI_Send
、MPI_BCast
、MPI_AllGather
这样的通信程序来发送someOtherRankNode.state
到rank == 0
。例如:
#include <stdio.h>
#include <mpi.h>
int main(void)
{
char rank_0_state;
char rank_1_state;
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 2)
return 1;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
rank_0_state = 'I';
if (rank == 1)
rank_1_state = 'S';
if (rank == 0) {
MPI_Status status;
MPI_Recv(&rank_1_state, 1, MPI_BYTE, 1, 0, MPI_COMM_WORLD, &status);
}
if (rank == 1)
MPI_Send(&rank_1_state, 1, MPI_BYTE, 0, 0, MPI_COMM_WORLD);
if (rank == 0) {
if (rank_0_state == 'I' && rank_1_state == 'S') {
printf("I am rank 0 receiving the right value from rank 1\n");
}
}
MPI_Finalize();
return 0;
}
尝试使用 MPI_Type_struct 跨进程正确发送该结构。
所以如果我有 C 代码 运行 MPI 和这样的结构:
typedef struct Node{
int succ;
int pred;
int has_token;
char state;
}node;
一个rank可以访问另一个rank节点吗?
例如我有:
//What i want:
if(rank==0){
//so rank 0.state lets say i want rank 2.state
if(currentRankNode.state=='I' && someOtherRankNode.state=='S'){
//do_smth
}
}
问题是,我应该用什么替换 someOtherRankNode
以获得例如等级 2 的节点和之后的状态?
根据您在这里获得的少量信息,我认为您要问的是如何查看另一个 MPI 进程的内存(即使用 rank == 2
查看进程的当前状态)。
默认情况下,MPI进程的内存空间被操作系统完全隔离,即使运行在同一台物理机器上。您必须通过发送和接收消息来同步状态知识。在较新版本的 MPI 中,您可以使用 MPI Windows: https://www.mpich.org/static/docs/v3.2/www3/MPI_Win_allocate_shared.html 等功能,尽管这有点复杂。
不,至少你需要一个像MPI_Send
、MPI_BCast
、MPI_AllGather
这样的通信程序来发送someOtherRankNode.state
到rank == 0
。例如:
#include <stdio.h>
#include <mpi.h>
int main(void)
{
char rank_0_state;
char rank_1_state;
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 2)
return 1;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
rank_0_state = 'I';
if (rank == 1)
rank_1_state = 'S';
if (rank == 0) {
MPI_Status status;
MPI_Recv(&rank_1_state, 1, MPI_BYTE, 1, 0, MPI_COMM_WORLD, &status);
}
if (rank == 1)
MPI_Send(&rank_1_state, 1, MPI_BYTE, 0, 0, MPI_COMM_WORLD);
if (rank == 0) {
if (rank_0_state == 'I' && rank_1_state == 'S') {
printf("I am rank 0 receiving the right value from rank 1\n");
}
}
MPI_Finalize();
return 0;
}
尝试使用 MPI_Type_struct 跨进程正确发送该结构。