Управление памятью для устранения гауссов - PullRequest
0 голосов
/ 02 мая 2011

Матрица создается в процессоре 0 и распространяется на другие процессоры.Матрица - это симметричная плотная матрица.Вот почему он инициализируется в процессоре 0.

Матрица создается следующим образом:

A=malloc(sizeof(double)*N*N);
for (i=0; i<N; i++)
    for(j=0; j<N; j++)
     A(i,j)=rand()%10; // The code will be changed.

A (i, j) определяется как:

#define A(i,j) A[i*N+j]

и N должно быть 100 000 для проверки алгоритма.

Проблема здесь в следующем: если N = 100 000, то необходимая память составляет приблизительно 76 ГБ.Что вы предлагаете для хранения матрицы A?

PS: алгоритм работает очень хорошо, когда N <20.000, а кластер представляет собой систему с нарушенной памятью (2 ГБ ОЗУ на процессор) </p>

Ответы [ 3 ]

2 голосов
/ 02 мая 2011

Если вы программируете в системе POSIX с достаточным виртуальным адресным пространством (что на практике будет означать 64-битную систему), вы можете использовать mmap().

. Или создайте анонимное отображение требуемого размера.(это будет резервная копия, что означает, что вам потребуется не менее 76 ГБ подкачки), либо создайте реальный файл требуемого размера и отобразите его.

Преимущество решения с файловой поддержкой заключается в том, чтоесли у вашего кластера есть общая файловая система, вам не нужно явно передавать матрицу каждому процессору - вы можете просто msync() ее создать после создания и затем сопоставить правильную область на каждом процессоре.

2 голосов
/ 02 мая 2011

Если вы делаете это, как указано в комментариях, для проведения теста масштабирования, то Оли Чарльзуорт совершенно прав;все, что вы делаете, это делает сравнение яблок с апельсинами, потому что вашему узлу не нужно использовать 76 ГБ.Что хорошо;Одна из главных причин использования MPI - решение проблем, которые не могут уместиться на одном узле.Но если попытаться поместить 76 ГБ данных на один процессор, то сравнение, которое вы делаете, не будет иметь никакого смысла.Как упоминали и Оли Чарльзуорт, и Кафе, с помощью различных методов вы можете использовать диск вместо ОЗУ, но тогда ваш 1-процессорный ответ не будет напрямую сопоставим с числами совпадений в ОЗУ, полученными от большего числа узлов,так что вам придется проделать большую работу, чтобы получить число, которое на самом деле ничего не будет значить.

Если вы хотите масштабировать результаты для такого рода проблем, вы должны либо начать с наименьшего числаузлы, к которым подходит проблема , и принимают данные с увеличением числа процессоров, или вы выполняете слабое масштабирование вместо тестов с сильным масштабированием - вы продолжаетепостоянная работа на процессор при увеличении числа процессоров, а не общая работа, являющаяся постоянной.

Кстати, как бы вы ни делали измерения, вы получите лучшие результаты, если, как полагает Оли Чарльзуорт, каждый процессор генерирует свои собственные данные, а не серийное узкое место, имея ранг 0 для генерацииматрицы и затем все процессоры получают свои части.

1 голос
/ 02 мая 2011

Если вы можете переключиться на C ++, вы можете взглянуть на STXXL , который является реализацией STL, специально разработанной для огромных наборов данных, с прозрачной поддержкой дисков и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...