Может ли тег MPI_Send () быть длинным int? - PullRequest
0 голосов
/ 07 мая 2020

Я работаю над своим проектом, в котором используются cpp и openmpi. В моей программе есть много «вычислительных единиц», я называю их элементами . Для каждого элемента я генерирую уникальный unsigned long int, чтобы идентифицировать его, я называю это целое число ключом .

Проблема в том, что теперь мне нужны некоторые элементы для связи друг с другом между процессорами, а именно с использованием MPI_Send() и MPI_Recv(). Поскольку каждый элемент знает, кому он должен отправлять сообщения и получать сообщения, т. Е. Знает ключ целевого элемента, который они должны отправлять или получать от него, было бы интуитивно понятно использовать ключ как tag в MPI_Send() и MPI_Recv(). Однако я вижу tag на странице man openmpi - это int. Значит, это целое число размером 4 байта? Могу ли я использовать unsigned long int в качестве тега? Спасибо большое!

1 Ответ

1 голос
/ 07 мая 2020

Нет, к сожалению, теги не могут быть long int s. Привязки C определяют тег как int, но набор фактически разрешенных значений еще меньше и также зависит от реализации. Во-первых, теги должны быть положительными. Затем существует верхняя граница (UB), налагаемая реализацией MPI, которая доступна путем запроса MPI_COMM_WORLD для атрибута MPI_TAG_UB:

int flag;
int *tag_ub;

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &tag_ub, &flag);
if (flag)
  cout << "Max allowed tag value is " << *tag_ub << endl;
else
  cout << "No idea what the max allowed tag value is" << endl;

Не только значение может различаться между различными реализациями MPI, но он также может отличаться, учитывая ту же реализацию, в зависимости от транспорта (ов) связи, выбранного заданием (я видел, как это происходило с некоторыми реализациями MPI). Стандарт гарантирует только то, что значение тега UB не будет меньше 32767.

Ваш лучший и наиболее переносимый вариант - сделать идентификатор элемента частью фактических данных сообщения.

...