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
   48   49   50   51   52   53   54   55   56   57   58