Page 54 - 6601
P. 54
MPI_Scatterv(pMatrix , pSendNum, pSendInd, MPI_DOUBLE,
pProcRows,pSendNum[ProcRank],
MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Звільнення пам’яті
delete [] pSendNum;
delete [] pSendInd;
}
У вищенаведеному фрагменті використано функцію
MPI_Scatterv, яка дозволяє посилати кожному процесу різну
кількість елементів. Початок розташування елементів блоку, що
посилається i-му процесу, задається в масиві зсувів displs, а число
посиланих елементів – в масиві sendcounts. Формат функції
наступний:
int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs,
MPI_Datatype sendtype, void* recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm),
де sendbuf (IN)– адреса початку буфера посилки (використовується
тільки в процесі-відправнику root);
sendcounts (IN)– цілочисельний масив (розмір рівний числу
процесів в групі), що містить число елементів, які
надсилаються кожному процесу;
displs(IN) – цілочисельний масив (розмір рівний числу процесів
в групі), i-те значення визначає зсув відносно початку
sendbuf для даних, що посилаються процесу i;
sendtype (IN)– тип посиланих елементів;
recvbuf (OUT)– адреса початку буфера прийому;
recvcount (IN)– число отримуваних елементів;
recvtype (IN)– тип отримуваних елементів;
root (IN)– номер процесу-відправника;
comm (IN)– комунікатор(група процесів).
52