правило typemap сбивает с толку

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

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

person Y.H.    schedule 01.12.2010    source источник
comment
Вы уверены, что это возможно? То есть, вы успешно определили и зафиксировали такой тип данных в какой-то реализации MPI?   -  person suszterpatt    schedule 02.12.2010
comment
Вероятно, реализации MPI этого не позволят, мне просто интересно, в чем именно заключается идея этой свободы, предлагаемой стандартом.   -  person Y.H.    schedule 03.12.2010


Ответы (2)


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

person Jonathan Dursi    schedule 01.12.2010
comment
Ты прав. так вы думаете, что причина этого заключается просто в сохранении памяти? или, возможно, определить типографию швейцарского армейского ножа для всех сообщений? - person Y.H.; 03.12.2010
comment
Я предполагаю, что это две вещи: одна — реализуемость; они не хотели заставлять разработчиков MPI выполнять большой набор тестов на картах типов во время фиксации. Другой — просто гибкость; при создании стандарта (особенно на широком спектре машин; в 80-х, когда это собиралось, было головокружительное разнообразие архитектур) трудно понять, кто найдет что полезное, поэтому лучше просто пусть все будет в порядке а если люди прострелят себе ногу, так тому и быть — это все-таки HPC. Я до сих пор не понимаю законности отрицательных смещений, но... - person Jonathan Dursi; 03.12.2010

Я начал писать комментарий, но не хватило места, так что начнем. Во-первых, этот код компилируется и запускается на реализации 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
comment
Ха, это все очень интересно. Я думаю, я никогда не думал о том, чтобы на самом деле отправлять биты связанной структуры данных с типом данных MPI; Я всегда просто полагал, что такая структура будет слишком динамичной, чтобы создавать типы, и можно будет просто отправлять узлы по отдельности. Что касается карт типов, вы должны быть правы насчет отправки, но получение (с той же картой типов) в конечном итоге свернет их обратно в те же 8 байтов, и поэтому вы получите подход типа объединения, я думаю - - Мне любопытно попробовать (и еще более любопытно узнать, действительно ли разные MPI реализуют это одинаково). - person Jonathan Dursi; 04.12.2010
comment
Что ж, имейте в виду, что указанный выше тип данных устаревает при изменении структуры данных, поэтому вам, вероятно, придется переопределять/повторно подтверждать его перед каждой отправкой, что имеет свою стоимость. Также имейте в виду, что вы можете получить сообщение, используя карту типов, отличную от той, с которой оно было отправлено: получение с помощью { (MPI_CHAR, 0), (MPI_BYTE,4) } сохранит два значения отдельно. - person suszterpatt; 04.12.2010