Эффективный способ сделать данные непрерывными для передачи их между узлами
struct Face
{
// Matrixd is 1D representation of 2D matrix
std::array < Matrixd<5,5>, 2 > M;
};
std::vector <Face> face;
У меня есть распределенный цикл среди узлов. После того, как все узлы закончат работу над своими элементами, я бы хотел переместить соответствующие элементы между узлами. Но AFAIK использовать MPI_Allgatherv
данные должны быть смежными. Прежде всего, я переключился на одномерное представление двумерных матриц (раньше я использовал обозначение [][]). Теперь я хочу сделать face.M
быть смежным. Я думаю, чтобы скопировать все элементы, скажем, M[0] в std::array
передача, что между узлами. Этот способ эффективен? Чтобы дать представление о количестве данных, с которыми я работаю, если у меня есть 20k ячеек, у меня максимум 20k*3=60k граней. У меня тоже может быть миллион клеток.
1 ответ
Настоящий 2D массив в C/C++, например int foo[5][5]
уже соприкасаются в памяти; это в основном просто синтаксический сахар для int foo[25]
где доступы как foo[3][2]
неявно смотреть вверх foo[3*5 + 2]
в плоском эквиваленте. Переключение на Matrixd
определенный в одном измерении не изменит фактическую структуру памяти.
std::array
является (в основном) просто оболочкой для массивов в стиле C; без виртуальных членов и размера, определенного во время компиляции, без внутренних указателей (только необработанный массив), он также будет смежным. Я сильно подозреваю, что если вы проверите сборку, вы обнаружите, что array
из Matrixd
с уже смежный.
Короче говоря, я не думаю, что вам нужно что-то менять; вы уже смежны, поэтому MPI должен быть в порядке.