Page 53 - 6601
P. 53
Нижче наведено лістинг цієї функції. Функція здійснює розсилку
вектора В і розподіл рядків початкової матриці A по процесах
обчислювальної системи. Слід зазначити, що коли кількість рядків
матриці n не є кратною числу процесорів p, об'єм даних, що
пересилаються, для процесів може бути різним, і для передачі
повідомлень необхідно використовувати функцію MPI_Scatterv
бібліотеки MPI. У функції використано наступні аргументи:
*pMatrix – вказівник на матрицю А;
*pProcRows – вказівник на смугу рядків матриці А, яка
надсилається процесу з номером Rank;
*pVector – вказівник на вектор В;
RowSize – кількість елементів у рядку матриці А;
RowNum – кількість рядків матриці А;
ProcRank – глобальна змінна – поточний номер процесу.
void DataDistribution (double *pMatrix, int RowSize, int RowNum,
double *pProcRows, double *pVector )
{ int *pSendNum; //кількість елементів, що пересилаються процесу
int *pSendInd; // індекс першого елемента даних, що пересилається
процесу
// Розсилка вектора b всім процесам програми
MPI_Bcast(pVector, RowSize, MPI_DOUBLE, 0,
MPI_COMM_WORLD);
// Виділення пам’яті
pSendNum = new int [ProcNum];
pSendInd = new int [ProcNum];
// Визначення набору рядків для кожного процесу
int ProcDataSize = RowSize * (RowNum/ProcNum);
pSendInd[0] = 0;
for ( int i=1; i<ProcNum; i++ ) {
pSendInd[i] = pSendInd[i-1] + ProcDataSize;
pSendNum[i-1] = ProcDataSize; }
pSendNum[ProcNum-1] = RowSize*RowNum -
pSendInd[ProcNum-1];
// Розсилка рядків матриці всім процесам програми
51