Распределение глобального массива на меньшие локальные массивы и последующее собирание локальных массивов обратно в глобальный массив.
Используются MPI_Scatterv () (вызывается только один раз) и MPI_Gatherv () (вызывается в цикле).
... some code
for j = 0 to nprocs-1
displs[j] = (int)j*global_size/nprocs;
counts[j] = (int)(global_size(j+1)*/nprocs)-(int)(global_size*j/nprocs);
... test (checks), this ensures the best size distribution
... all arrays are pointers with allocated sizes as per above
MPI_Scatterv(global_array,counts,displs,type,
local_array,counts[rank],type,root,comm);
... begins loop (every rank does this whole loop)
... some calculations, inner loops divided between ranks
MPI_Allgatherv(local_array,counts[rank],type,
global_array,counts,displs,type,comm);
... some calculations, inner loops divided between ranks
Это работает.Вроде, как бы, что-то вроде.Если global_size% nprocs == 0, я получаю ожидаемое повышение скорости.Если нет, я получаю резкое увеличение времени обработки.Загрузка кода основана на global_size.
Это известное поведение?Возможно известная проблема?