Многопроцессорное умножение матриц в C

Я хочу сделать матричное умножение, используя несколько процессов через fork и используя общую память, при этом каждый из процессов вычисляет одну строку для матрицы небольшого размера, но с матрицами большего размера невозможно создать процесс для каждой строки. Таким образом, он должен вычислить блок строк, определяемый размером. Например, до 10 строк он должен вычислять одну строку для каждого процесса, а после этого, скажем, для 20 строк один процесс должен вычислять по 4 строки каждый. Я не могу его запрограммировать, так как могу использовать номер строки как количество процессов. Предположим, я беру постоянное количество процессов, скажем, 8, тогда каждый блок будет иметь N/8 строк. Но тогда размер матрицы должен быть кратен 8, а количество процессов должно быть переменным. Предположим, у него 6 процессоров. Могу ли я взять количество процессов быть постоянным, т.е. 6. Каким может быть правильный подход? Как мне это написать?


person Lost    schedule 12.03.2013    source источник
comment
Я чувствую, что небольшое гугление здесь будет иметь большое значение, поскольку это было сделано много, много раз раньше.   -  person Michael Dorgan    schedule 13.03.2013
comment
Я не смог найти какой-либо пример программы умножения матриц на C, которая изображала бы умножение матриц с использованием процессов и общей памяти, а также способы ее оптимизации.   -  person Lost    schedule 13.03.2013


Ответы (1)


Вот пример кода, демонстрирующий множественность матриц. в потоках. Почти сразу нашел в поисковике. В нем показан способ выполнения того, что вы описываете.
http://www.cs.arizona.edu/classes/cs422/spring13/examples/matmult-dyn.c

Вам, вероятно, потребуется выполнить некоторые точные настройки, чтобы определить, какой подход является лучшим.

Вам, вероятно, также следует прочитать эту статью: http://aristeia.com/TalkNotes/PDXCodeCamp2010.pdf

person Randy Howard    schedule 12.03.2013
comment
Я использую в нем процессы вместо потоков и не смог найти в поисковике... - person Lost; 13.03.2013
comment
Ну конечно; естественно. Я изначально этого не понял. Я подозреваю, что многопоточность — более удобный способ решения этой проблемы, возможно, поэтому я пропустил его в первый раз. В любом случае нет причин создавать больше процессов (или потоков), чем у вас есть ядер, доступных для их запуска. Остальное только сверху. - person Randy Howard; 13.03.2013
comment
Так должен ли я ограничить количество процессов до 6? и заставить каждый процесс выполнять N/6 строк? - person Lost; 13.03.2013
comment
Трудно сказать точно без бенчмаркинга ... Тем не менее, я думаю, что начал бы с деления количества строк на количество ЦП и распределения такого количества строк для каждого. Если это не выходит равномерно, вам, очевидно, придется обрабатывать остаток в конце. Вы выполняете работу параллельно на всех ядрах, но не возвращаетесь постоянно, чтобы попросить еще. - person Randy Howard; 13.03.2013
comment
Хорошо, спасибо, я попробую сделать то же самое, хотя я не уверен, как мне справиться с остатком. - person Lost; 13.03.2013
comment
Ну, предположим, например, у вас осталось 4 в конце и 6 процессов, которые могли бы их обработать. Просто поместите один из 4 на каждый из первых 4 и сигнализируйте другим, что они вам больше не нужны. Это немного похоже на махание руками, потому что вы не показали никаких подробностей о том, как именно вы собираетесь взаимодействовать с процессами. - person Randy Howard; 13.03.2013