Я начал писать комментарий, но не хватило места, так что начнем. Во-первых, этот код компилируется и запускается на реализации 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) }
не будет вести себя как объединение: если вы отправляете данные с этой картой типов, один и тот же адрес памяти будет сначала интерпретирован как 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
Надеюсь, отсюда вы понимаете важность отрицательных смещений: невозможно сказать, где в памяти находятся различные узлы, поэтому вполне возможно, что некоторые узлы будут находиться в более ранних местах, чем то, с которого мы начинаем обход графа.
person
suszterpatt
schedule
03.12.2010