我正在尝试将一些数据从工作人员发送到C ++中的MPI程序中的主机(排名为0)。目标是传递2个字符串和一个整数。为此,我创建了一个结构。
结构
它称为单词,定义如下:
struct word
{
char word_name[str_size];
char url[str_size];
int counter;
};
/* Some important variables to the question */
MPI_Datatype mpi_word_type;
const int str_size = 200;
以前,我是通过
char *
尝试此操作的,但是它不起作用,因为进程没有共享相同的内存空间。现在,如果将变量从
char[]
更改为简单的char
并尝试使用示例,则可以发送该结构。如上所述,我无法摆脱分段错误。发送零件-工人
首先,创建并填充示例结构,然后首先发送结构的大小,然后发送结构本身。像这样:
word word_col;
std::string tmp = "somename";
strcpy(word_col.word_name, tmp.c_str());
std::string tmp2 = "someurl";
strcpy(word_col.url, tmp2.c_str());
word_col.counter = 10;
int size = sizeof(word_col);
MPI::COMM_WORLD.Send(&size, 1, MPI::INT, 0, 1);
MPI::COMM_WORLD.Send(&word_col, size, mpi_word_type, 0, 1);
接收部分-主
const int nitems = 3;
int blocklengths[3] = { str_size, str_size, 1 };
MPI_Datatype types[3] = { MPI::CHAR, MPI::CHAR, MPI::INT };
MPI_Aint offsets[3];
offsets[0] = (MPI_Aint) offsetof(struct word, word_name);
offsets[1] = (MPI_Aint) offsetof(struct word, url);
offsets[2] = (MPI_Aint) offsetof(struct word, counter);
MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_word_type);
MPI_Type_commit(&mpi_word_type);
...
for(...)
{
word word_col;
int size;
MPI::COMM_WORLD.Recv(&size, 1, MPI::INT, MPI::ANY_TAG, 1, status);
MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);
}
我已经为这个问题苦苦挣扎了好几个小时,并且已经看到了许多示例和有关此问题的另一个问题,但是我无法弄清楚这是什么问题。
最佳答案
这是错误的编程。您有未分配和未初始化的指针,并且您正在尝试将数据推送到该指针。
您有两种选择:
您可以将结构定义为:
const int str_size = 200;
struct word
{
char word_name[str_size]; // fixed sized char array
char url[str_size]; // fixed sized char array
int counter;
};
要么,
const int str_size = 200;
struct word
{
char *word_name; /
char *url;
int counter;
Word() {
word_name = new char[str_size];
url = new char[str_size];
}
~Word() {
delete [] word_name;
delete [] url;
}
};
想法是您需要为这些变量分配内存
另外,在接收时,您已使用:
MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);
它不应该像下面吗?
MPI::COMM_WORLD.Recv(&word_col, sizeof(word_col), mpi_word_type, MPI::ANY_TAG, 1, status);