Эффективный способ сделать данные непрерывными для передачи их между узлами

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 должен быть в порядке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector