Я использую MPI_Gather в первый раз и следую некоторым примерам, но по какой-то причине я получаю ошибку seg всякий раз, когда я ее вызываю. Соответствующий код находится здесь:
//Get the top N matches for each node
for (int j = 0; j < send_counts[id]; j++)
{
data = read_file(my_dir + files[rec_buf[j]]);
temp_results = circularSubvectorMatch(test_vectors[i], data, N);
results.insert(results.end(), temp_results.begin(), temp_results.end());
}
std::sort(results.begin(), results.end(), sort_function);
results.resize(N);
//Send the N dissimilarities from each node to the root process and let it figure out
//the Nth best one overall
float *best_times = new float[N];
for (int j = 0; j < N; j++)
{
best_times[j] = results[j].dissimilarity;
}
MPI_Barrier(MPI_COMM_WORLD);
float *all_dissimilarities = NULL;
if (id == 0)
{
float *all_dissimilarities = new float[N * procs];
}
MPI_Gather(best_times, N, MPI_FLOAT, all_dissimilarities, N, MPI_FLOAT, 0, MPI_COMM_WORLD);
float *nth_best;
if (id == 0)
{
std::sort(all_dissimilarities, all_dissimilarities + N * procs - 1);
*nth_best = all_dissimilarities[N-1];
*nth_best = 1.0;
}
MPI_Bcast(nth_best, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);
cout << "My id is " << id << "and I received: " << *nth_best << endl;
//each process prints each result it has that is better than or equal
//to the Nth best result calculated by the root process
//output search vector and search time
free(all_dissimilarities);
free(best_times);
MPI_Barrier(MPI_COMM_WORLD);
Я выделил буфер отправки и буфер приема, как в примере, может ли кто-нибудь пролить свет на то, почему я могу получить эту ошибку?
float *best_times = new float[N];
Затем вы усугубляете проблему, вызываяfree()
в памяти, выделенной с помощьюnew[]
. В нынешнем виде ваш фрагмент кода вводит неопределенное поведение. - person PaulMcKenzie   schedule 20.04.2014all_dissimilarities
; второй раз, когда выделяется память (float *all_dissimilarities = new float[N * procs];
), находится в блоке if и не влияет наall_dissimilarities
, определенный в теле основной функции, который остается NULL. Теперь, почему векторная версия ниже дает сбой, я не уверен... - person T.C.   schedule 20.04.2014