Ошибка сегментации с глобальной переменной в MPICH 1.6

Рассмотрим следующую простую программу:

#include <mpi.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>

using std::cout;
using std::string;
using std::vector;

vector<float> test;
#ifdef GLOBAL
string hostname;
#endif

int main(int argc, char** argv) {
int rank;  // The node id of this processor.
int size;  // The total number of nodes.
#ifndef GLOBAL
string hostname;
#endif
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

cout << "Joining the job as processor: " << rank << std::endl;

{
char buf[2048] = "HELLO";
hostname.assign(buf, 2048);
}
test.push_back(1.0f);

cout << "Hostname: " << hostname << "::" << test[0] << std::endl;

MPI_Finalize();
return 0;
}

Если я компилирую / запускаю это с:

mpicxx -c test.cc && mpicxx -lstdc++ test.o -o test && ./test

нет ошибки сегментации, но если я запускаю ее с:

mpicxx -DGLOBAL -c test.cc && mpicxx -lstdc++ test.o -o test && ./test

затем возникает ошибка сегментации в строке hostname.assign (). Кроме того, если я удаляю это присваивание, в деструкторе строки возникает ошибка сегментации, когда основной метод возвращается, поэтому метод присвоения не является фактическим виновником.

Обратите внимание, что единственная разница заключается в том, где объявлена ​​«глобальная» переменная hostname.

Я компилирую с MPICH2 версии 1.6, и у меня нет возможности изменить это, так как я запускаю это на суперкомпьютере.

Если я удалю MPI_Init и т. Д., Ошибка исчезнет, ​​и я пойму, что с MPI и этой глобальной переменной происходит нечто неожиданное.

Я нашел несколько других примеров того, как это происходит с людьми в сети, но все они решили свои проблемы, установив новую версию MPICH, что опять-таки не представляется возможным.

Более того, я хочу знать, ПОЧЕМУ это происходит больше, чем просто обойти это.

Спасибо за ваше время.

0

Решение

Хорошо, после небольшой отладки я обнаружил, что библиотека MVAPICH2-1.6 определяет переменную с именем hostname в:

mpid/ch3/channels/mrail/src/rdma/ch3_shmem_coll.c

Вот строка (55 в этой версии файла):

char hostname[SHMEM_COLL_HOSTNAME_LEN];

Компилятор не жаловался на конфликт имен здесь, но это почти наверняка виновник, так как изменение имени переменной в моей программе устранило ошибку. Я предполагаю, что это изменилось в более поздних версиях MVAPICH2, но я сообщу об ошибке, если нет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]