Я начал писать комментарий, но закончился из космоса, так что здесь идет. Во-первых, этот код компилируется и работает на implmentation HP-MPI, что у меня есть доступ к:
#include <mpi.h>
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int count = 2;
int lengths[] = { 1, 1 };
MPI_Aint disp[] = { 0, 0 };
MPI_Datatype types[] = { MPI_DOUBLE, MPI_CHAR };
MPI_Datatype weird_type;
MPI_Type_struct(count, lengths, disp, types, &weird_type);
MPI_Type_commit(&weird_type);
MPI_Finalize();
return 0;
}
Однако { (double, 0), (char,0) }
TypeMap не будет вести себя как союз: если вы отправляете данные с этой TypeMap, то же самое адрес памяти сначала будет интерпретироваться как double
, а затем как char
, и оба значения будут отправлены (при условии, что реализация не взорвана).
Я могу только подумать о одном правдоподобном прецеденте для такого поведения: рассмотрите типовую карту { (MPI_CHAR, 0), (MPI_BYTE,0) }
. Передача переменной char
с использованием этого типа будет выполнять преобразование представления в первом случае, но не во втором: таким образом вы можете проверить, одинаково ли кодировка символов на машине-отправителе и приемнике. Конечно, есть и другие способы сделать это, но, тем не менее, вариант есть. Хотя более вероятным сценарием является то, что стандарт просто не касается экзотических особых случаев.
Кроме того, что касается отрицательных перемещений: я использовал их раньше, когда мне приходилось передавать данные из связанной структуры данных (например, графика). Это не для слабонервных, но вот псевдокод моего алгоритма:
std::vector<MPI_Aint> displacements;
for (each node n in the graph)
{
if (n needs to be sent)
{
displacements.push_back(<MPI address of n>);
}
}
for (int i=0; i<displacements.size(); i++)
{
// compute the element #i's offset from the first one
displacements[i] -= displacements[0];
}
// create HIndexed datatype where blocks consist of one node,
// and begin at the memory addresses in 'displacements'
// send nodes as one element of the previously defined type,
// beginning at the address of the first node
Надеюсь, вы можете видеть важность отрицательных смещений от туда: там никто не знает, где различные узлы находятся в памяти, так что вполне возможно, что некоторые узлы будут находиться в более ранних местах, чем тот, на котором мы начинаем перемещаться по графику.
Вы уверены, что это возможно? То есть, вы успешно определили и зафиксировали такой тип данных в какой-то реализации MPI? – suszterpatt 2010-12-02 15:16:22
Вероятно, реализация MPI не позволит этого, я просто задаюсь вопросом, что именно представляет собой идея этой свободы, предлагаемая стандартом. – 2010-12-03 18:36:36