mpi send/recv 结构中的多个可变长度数组
mpi send/recv multiple variable length arrays in a struct
我需要能够从等级 0 向所有等级发送和接收两个 uint64_t 数组。
我有一个 typedef 结构如下:
typedef struct _mpi_data_t {
uint64_t *array1;
uint64_t *array2;
size_t array1_size;
size_t array2_size;
} mpi_data_t;
在等级 0 中,我填充数组并计算位移以创建 mpi 数据类型。
MPI_Get_address(&mpi_data_send, &address[0]);
MPI_Get_address(&mpi_data_send.array1[0], &address[1]);
MPI_Get_address(&mpi_data_send.array2[0], &address[2]);
MPI_Get_address(&mpi_data_send.array1_size, &address[3]);
displacements[0] = address[1] - address[0];
displacements[1] = address[2] - address[0];
displacements[2] = address[3] - address[0];
我也设置块计数数组如下:
int block_count[3] = {mpi_data_send.array1_size, mpi_data_send.array2_size, 2};
我的问题是,当收到此数据类型时,其他等级不能创建具有相同位移和块计数的相同数据类型规范,因为数组是由等级 0(发送方)生成的。
如何发送和接收这两个动态大小的数组?
您可以使用 MPI_Probe
和 MPI_Get_count
来查找接收消息的长度。
您没有在代码中提供发送和接收格式,但作为建议,您可以单独发送数组并接收它们。
这个 C 示例可以帮助:
// Author: Wes Kendall
// Copyright 2011 www.mpitutorial.com
// This code is provided freely with the tutorials on mpitutorial.com. Feel
// free to modify it for your own use. Any distribution of the code must
// either provide a link to www.mpitutorial.com or keep this header intact.
//
// Example of using MPI_Probe to dynamically allocated received messages
//
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 2) {
fprintf(stderr, "Must use two processes for this example\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int number_amount;
if (world_rank == 0) {
const int MAX_NUMBERS = 100;
int numbers[MAX_NUMBERS];
// Pick a random amont of integers to send to process one
srand(time(NULL)+world_rank);
number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS;
// Send the amount of integers to process one
MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD);
printf("0 sent %d numbers to 1\n", number_amount);
} else if (world_rank == 1) {
MPI_Status status;
// Probe for an incoming message from process zero
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
// When probe returns, the status object has the size and other
// attributes of the incoming message. Get the size of the message.
MPI_Get_count(&status, MPI_INT, &number_amount);
// Allocate a buffer just big enough to hold the incoming numbers
int* number_buf = (int*)malloc(sizeof(int) * number_amount);
// Now receive the message with the allocated buffer
MPI_Recv(number_buf, number_amount, MPI_INT, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
printf("1 dynamically received %d numbers from 0.\n",
number_amount);
free(number_buf);
}
MPI_Finalize();
}
在本例中,随机长度数组(小于 100)分配到第 0 位并发送到第 1 位。
我需要能够从等级 0 向所有等级发送和接收两个 uint64_t 数组。
我有一个 typedef 结构如下:
typedef struct _mpi_data_t {
uint64_t *array1;
uint64_t *array2;
size_t array1_size;
size_t array2_size;
} mpi_data_t;
在等级 0 中,我填充数组并计算位移以创建 mpi 数据类型。
MPI_Get_address(&mpi_data_send, &address[0]);
MPI_Get_address(&mpi_data_send.array1[0], &address[1]);
MPI_Get_address(&mpi_data_send.array2[0], &address[2]);
MPI_Get_address(&mpi_data_send.array1_size, &address[3]);
displacements[0] = address[1] - address[0];
displacements[1] = address[2] - address[0];
displacements[2] = address[3] - address[0];
我也设置块计数数组如下:
int block_count[3] = {mpi_data_send.array1_size, mpi_data_send.array2_size, 2};
我的问题是,当收到此数据类型时,其他等级不能创建具有相同位移和块计数的相同数据类型规范,因为数组是由等级 0(发送方)生成的。
如何发送和接收这两个动态大小的数组?
您可以使用 MPI_Probe
和 MPI_Get_count
来查找接收消息的长度。
您没有在代码中提供发送和接收格式,但作为建议,您可以单独发送数组并接收它们。
这个 C 示例可以帮助:
// Author: Wes Kendall
// Copyright 2011 www.mpitutorial.com
// This code is provided freely with the tutorials on mpitutorial.com. Feel
// free to modify it for your own use. Any distribution of the code must
// either provide a link to www.mpitutorial.com or keep this header intact.
//
// Example of using MPI_Probe to dynamically allocated received messages
//
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if (world_size != 2) {
fprintf(stderr, "Must use two processes for this example\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int number_amount;
if (world_rank == 0) {
const int MAX_NUMBERS = 100;
int numbers[MAX_NUMBERS];
// Pick a random amont of integers to send to process one
srand(time(NULL)+world_rank);
number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS;
// Send the amount of integers to process one
MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD);
printf("0 sent %d numbers to 1\n", number_amount);
} else if (world_rank == 1) {
MPI_Status status;
// Probe for an incoming message from process zero
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
// When probe returns, the status object has the size and other
// attributes of the incoming message. Get the size of the message.
MPI_Get_count(&status, MPI_INT, &number_amount);
// Allocate a buffer just big enough to hold the incoming numbers
int* number_buf = (int*)malloc(sizeof(int) * number_amount);
// Now receive the message with the allocated buffer
MPI_Recv(number_buf, number_amount, MPI_INT, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
printf("1 dynamically received %d numbers from 0.\n",
number_amount);
free(number_buf);
}
MPI_Finalize();
}
在本例中,随机长度数组(小于 100)分配到第 0 位并发送到第 1 位。