MPI_Scatterv: время обработки значительно больше, когда размер массива не кратен разрядам - PullRequest
0 голосов
/ 31 декабря 2018

Распределение глобального массива на меньшие локальные массивы и последующее собирание локальных массивов обратно в глобальный массив.

Используются 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.

Это известное поведение?Возможно известная проблема?

...