2010-12-01 3 views
0

Согласно стандарту MPI 2.2 Раздел 4.1: для создания нового типа данных мы должны определить типовую карту, которая представляет собой последовательность (тип, смещение) пар. Перемещения не требуются, чтобы быть положительными, увеличивающимися и не различимыми.typemap rule вводит в заблуждение

  • Предположим, что я определяю типовую карту следующей последовательности: {(double, 0), (char, 0)} это не имеет смысла, но возможно, как стандарт может обеспечить такую ​​гибкость?
+0

Вы уверены, что это возможно? То есть, вы успешно определили и зафиксировали такой тип данных в какой-то реализации MPI? – suszterpatt 2010-12-02 15:16:22

+0

Вероятно, реализация MPI не позволит этого, я просто задаюсь вопросом, что именно представляет собой идея этой свободы, предлагаемая стандартом. – 2010-12-03 18:36:36

ответ

1

Если это единственное, что вы считаете непонятным для typemaps, вы умнее, чем я. Но что касается этого конкретного примера - С-союзы именно это; почему это не должно допускать typemaps?

+0

Вы правы. так вы считаете, что причиной этого является просто сохранение памяти? или, возможно, определить карточку машин для швейцарской армии для всех сообщений? – 2010-12-03 18:47:45

1

Я начал писать комментарий, но закончился из космоса, так что здесь идет. Во-первых, этот код компилируется и работает на 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 

Надеюсь, вы можете видеть важность отрицательных смещений от туда: там никто не знает, где различные узлы находятся в памяти, так что вполне возможно, что некоторые узлы будут находиться в более ранних местах, чем тот, на котором мы начинаем перемещаться по графику.

Смежные вопросы