Skip to content

Instantly share code, notes, and snippets.

@galek
Last active June 27, 2017 21:32
Show Gist options
  • Save galek/cae801114c02090aa45afe9002cb59ec to your computer and use it in GitHub Desktop.
Save galek/cae801114c02090aa45afe9002cb59ec to your computer and use it in GitHub Desktop.
MPI_MAIN_SENDED
#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;
}
@galek
Copy link
Author

galek commented Jun 27, 2017

Не заливал версию с double числами. По приезду домой залью

@galek
Copy link
Author

galek commented Jun 27, 2017

Поправил обход, теперь сразу заливаем всю строку на процесс

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment