2013-04-17 2 views
2

Я хочу транслировать вектор C++ с использованием MPI.В MPI Как транслировать вектор C++?

Я не разрешается использовать boost.mpi

Сейчас я использую самый upvoted ответ от Vector Usage in MPI(C++) но он не работает ..

Ok, вот код:

// declaration of variables (ParsedData object will contain these variables) 
int generators_count, intervals_count; 
std::vector<float> mean_arr, variance_arr, interval_begins_arr, interval_ends_arr; 
std::vector<int> amount_of_numbers_to_generate_arr; 

// load data into parsed_data object 
if (process_id == 0) { 
    ParsedData parsed_data = load_input_data(filename); 
    intervals_count = parsed_data.intervals_count; 
    generators_count = parsed_data.generators_count; 
    mean_arr = parsed_data.mean_arr; 
    variance_arr = parsed_data.variance_arr; 
    interval_begins_arr = parsed_data.interval_begins_arr; 
    interval_ends_arr = parsed_data.interval_ends_arr; 
    amount_of_numbers_to_generate_arr = parsed_data.amount_of_numbers_to_generate_arr; 
} 

// send size of vectors to all processes - that MPI code works 
MPI_Bcast(&intervals_count, 1, MPI_INT, 0, MPI_COMM_WORLD); 
MPI_Bcast(&generators_count, 1, MPI_INT, 0, MPI_COMM_WORLD); 

// reserve memory for vectors 
if (process_id != 0) { 
    mean_arr.reserve(generators_count); 
    variance_arr.reserve(generators_count); 
    amount_of_numbers_to_generate_arr.reserve(generators_count); 

    interval_begins_arr.reserve(intervals_count); 
    interval_ends_arr.reserve(intervals_count); 
} 

// stolen from https://stackoverflow.com/questions/2546298/vector-usage-in-mpic 
// broadcast each vector, following code compiles but not works properly 
MPI_Bcast(&mean_arr[0], mean_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD); 
MPI_Bcast(&variance_arr[0], variance_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD); 
MPI_Bcast(&interval_begins_arr[0], interval_begins_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD); 
MPI_Bcast(&interval_ends_arr[0], interval_ends_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD); 
MPI_Bcast(&amount_of_numbers_to_generate_arr[0], amount_of_numbers_to_generate_arr.size(), MPI_FLOAT, 0, MPI_COMM_WORLD); 

Когда я просто помещаю результаты на другом процессе, я получил неправильный ответ:

cout << "process ID " << process_id << endl << "amount_of_numbers_to_generate_arr[0] " << amount_of_numbers_to_generate_arr[0] << endl; 

Результат:

using process 0 
process ID 0 
amount_of_numbers_to_generate_arr[0] 100000000 
using process 1 
process ID 1 
amount_of_numbers_to_generate_arr[0] -423989576 
using process 2 
process ID 2 
amount_of_numbers_to_generate_arr[0] 1741864632 

И это должно быть:

using process 0 
process ID 0 
amount_of_numbers_to_generate_arr[0] 100000000 
using process 1 
process ID 1 
amount_of_numbers_to_generate_arr[0] 100000000 
using process 2 
process ID 2 
amount_of_numbers_to_generate_arr[0] 100000000 

Во всяком случае, как исправить это?

Возможно, есть другой подход?

+0

[Вот аналогичный вопрос] (http://stackoverflow.com/questions/16738257/mpi-bcast-broadcast-of-a-stdvector-of-structs), посвященный конкретно проходящим векторам структур. –

ответ

4

Когда вы «резервируете память для векторов», вы фактически не изменяете размер векторов. В последующих вызовах MPI_Bcast размеры векторов по-прежнему равны 0, поэтому значения не принимаются.

Для фактического изменения размеров векторов звоните resize вместо reserve.

+0

Блестящий! Оно работает. : D Спасибо за быстрый ответ. –