Last active
June 27, 2017 21:32
-
-
Save galek/cae801114c02090aa45afe9002cb59ec to your computer and use it in GitHub Desktop.
MPI_MAIN_SENDED
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <time.h> | |
#include <pvm3.h> | |
#include <unistd.h> | |
using namespace std; | |
# define SIZE 1000 | |
# define NPROCS 5 | |
int main(int argc, char **argv) | |
{ | |
int mytid , task_ids [ NPROCS ]; | |
// A-Матрица, размера Size size | |
float a [ SIZE ][SIZE}; | |
// вектор | |
float b [ SIZE ]; | |
// вектор временных результатов | |
float tmp_results [ NPROCS ]; | |
// результирующий вектор | |
float sum [ NPROCS ]; | |
// используется для получения/отправки сообщений | |
int msgtype; | |
// Размерность данных | |
int num_data = SIZE / NPROCS ; | |
/* enroll in PVM */ | |
mytid = pvm_mytid (); | |
// Заполняем произвольными данными | |
for (int i = 0; i < SIZE; i++) { | |
for ( int j = 0; j < SIZE ; j ++) { | |
a [ i ][j] = i % 25; | |
b [ i ] = i % 35; | |
} | |
} | |
for (int i = 0; i < SIZE; i++) { | |
sum[i]=0; | |
} | |
// Порождаем работников в количестве NPROCS штук | |
pvm_spawn (" child ", ( char **) 0, PvmTaskDefault , "", NPROCS , task_ids ) ; | |
/* Отправляем данные работникам */ | |
for (int i = 0; i < NPROCS ; i ++) | |
{ | |
pvm_initsend ( PvmDataDefault ); | |
pvm_pkint (& num_data , 1 , 1); | |
#if 0 | |
// делаем обход по строке матрицы*на строку вектора | |
// Раньше у меня был матричный обход здесь, еще один цикл и отправка сообщений | |
// pvm_pkint (& a [ num_data * i][j], num_data , 1) ; | |
// почему так? -это обход по элементу каждой линии | |
// for (int j = 0; j < num_data ; j ++) { | |
//pvm_pkint (& a [ SIZE * num_data * i+j], SIZE * num_data , 1) ; | |
// } | |
#else | |
// Сразу забираем всю строку | |
pvm_pkfloat (& a [ SIZE * num_data * i], SIZE * num_data , 1) ; | |
#endif | |
pvm_pkfloat (& b [ num_data * i], num_data , 1); | |
pvm_send ( task_ids [ i ], 4) ; | |
} | |
/* Ждем и получаем результаты по сообщению */ | |
msgtype = 7; | |
for (int i = 0; i < NPROCS ; i ++) | |
{ | |
pvm_recv ( task_ids [ i ] , msgtype ) ; | |
// Распаковка в вектор временных данных | |
pvm_upkfloat ( tmp_results [ i ] , num_data , 1) ; | |
// Распаковали и теперь записываем результат в финальный вектор | |
for (int j = 0; j < num_data ; j ++) { | |
sum [ i * NPROCS +j ] = results [j]; | |
} | |
} | |
printf (" Final multiplication: \n") ; | |
for ( i = 0; i < SIZE ; i ++) | |
printf ("%d \n", sum [ i ]) ; | |
pvm_exit () ; | |
return 0; | |
} |
Поправил обход, теперь сразу заливаем всю строку на процесс
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Не заливал версию с double числами. По приезду домой залью