如何在MPI_Send()中发送struct类型的变量? [英] How to send a variable of type struct in MPI_Send()?

查看:66
本文介绍了如何在MPI_Send()中发送struct类型的变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用MPI用C编写了一个程序,其中struct变量将以环形方式发送给进程,并根据从该变量接收的值分配该特定进程的工作.

I have coded a program in C using MPI wherein the struct variable is to be sent in a ring fashion to the processes and, based on the value received from that variable, the work for that particular process is assigned.

问题是我需要知道如何在MPI_Send()函数中发送结构变量,因为它在运行时提供了INVALID DATATYPE,请考虑以下示例

The problem is I need to know how to to send a struct variable in the MPI_Send() function as it is giving INVALID DATATYPE at the runtime , Consider the following example

struct info{
  int ne, n, u, v, process, min, strip, mincost, b;
} stat;

MPI_Send(&stat,sizeof(stat),sizeof(struct info),1,2,MPI_COMM_WORLD);

推荐答案

在发送结构之前,您必须执行一些操作. 我为您的示例编写了代码,但是为了更好地理解,您应该阅读一些文档. 无论如何,这里有一些提示:

You have to do some operation before send a struct. I wrote the code for your example but to understand better you should read some documentation. Anyway, here some tips:

  • 如果您的结构仅由一种元素组成,例如您的示例中所有var都是int,则最好发送一个向量,注意每个变量的位置.
  • 如果还有其他种类,则必须将 count 设置为2或更多,并更改所有其他数组(例如array_of_types,array_of_blocklengths等).
  • 在这种情况下,您可以自行计算 array_of_displaysments 的值,请注意
  • If you have a struct made of just one kind of elements, like in your example that all the vars are int, it's better to send a vector taking care the position of each variable.
  • If you had other kinds, you have to set count to 2 or more and change all the other arrays (e.g: array_of_types, array_of_blocklengths et cetera).
  • You can calculate the values of array_of_displaysments on your own in that case take care of the Data structure alignment. If for example you have the struct that follows, x will start from 0 but y from 8, because a padding of 4 bytes will be add to align the elements. struct point{ int x; double y; };
  • If you don't want to calculate the array_of_displaysments always use MPI_Get_Address and do not rely on the & operator.

代码在这里:

struct info{
    int ne, n, u, v, process,min,strip,mincost,b;
}stat;


int main(...){

/*MPI INIT*/

struct info _info,  

int count; //Says how many kinds of data your structure has
count = 1; //1, 'cause you just have int

// Says the type of every block
MPI_Datatype array_of_types[count];
// You just have int
array_of_types[0] = MPI_INT;

// Says how many elements for block
int array_of_blocklengths[count];
// You have 8 int
array_of_blocklengths[0] = {8};

/* Says where every block starts in memory, counting from the beginning of the struct. */
MPI_Aint array_of_displaysments[coun];
MPI_Aint address1, address2;
MPI_Get_address(&_info,&address1);
MPI_Get_address(&_info.ne,&address2);
array_of_displaysments[0] = address2 - address1;

/*Create MPI Datatype and commit*/
MPI_Datatype stat_type;
MPI_Type_create_struct(count, array_of_blocklengths, array_of_displaysments, array_of_types, &stat_type);
MPI_Type_commit(&stat_type);

// Now we are ready to send
MPI_Send(&_info, 1, stat_type, dest, tag, comm),

/* . . . */


// Free datatype
MPI_Type_free(&stat_type);

// MPI finalization
MPI_Finalize();
}

这篇关于如何在MPI_Send()中发送struct类型的变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆