Я хочу сделать матричное умножение, используя несколько процессов через fork и используя общую память, при этом каждый из процессов вычисляет одну строку для матрицы небольшого размера, но с матрицами большего размера невозможно создать процесс для каждой строки. Таким образом, он должен вычислить блок строк, определяемый размером. Например, до 10 строк он должен вычислять одну строку для каждого процесса, а после этого, скажем, для 20 строк один процесс должен вычислять по 4 строки каждый. Я не могу его запрограммировать, так как могу использовать номер строки как количество процессов. Предположим, я беру постоянное количество процессов, скажем, 8, тогда каждый блок будет иметь N/8 строк. Но тогда размер матрицы должен быть кратен 8, а количество процессов должно быть переменным. Предположим, у него 6 процессоров. Могу ли я взять количество процессов быть постоянным, т.е. 6. Каким может быть правильный подход? Как мне это написать?
Многопроцессорное умножение матриц в C
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
Я использую в нем процессы вместо потоков и не смог найти в поисковике...
- person Lost; 13.03.2013
Ну конечно; естественно. Я изначально этого не понял. Я подозреваю, что многопоточность — более удобный способ решения этой проблемы, возможно, поэтому я пропустил его в первый раз. В любом случае нет причин создавать больше процессов (или потоков), чем у вас есть ядер, доступных для их запуска. Остальное только сверху.
- person Randy Howard; 13.03.2013
Так должен ли я ограничить количество процессов до 6? и заставить каждый процесс выполнять N/6 строк?
- person Lost; 13.03.2013
Трудно сказать точно без бенчмаркинга ... Тем не менее, я думаю, что начал бы с деления количества строк на количество ЦП и распределения такого количества строк для каждого. Если это не выходит равномерно, вам, очевидно, придется обрабатывать остаток в конце. Вы выполняете работу параллельно на всех ядрах, но не возвращаетесь постоянно, чтобы попросить еще.
- person Randy Howard; 13.03.2013
Хорошо, спасибо, я попробую сделать то же самое, хотя я не уверен, как мне справиться с остатком.
- person Lost; 13.03.2013
Ну, предположим, например, у вас осталось 4 в конце и 6 процессов, которые могли бы их обработать. Просто поместите один из 4 на каждый из первых 4 и сигнализируйте другим, что они вам больше не нужны. Это немного похоже на махание руками, потому что вы не показали никаких подробностей о том, как именно вы собираетесь взаимодействовать с процессами.
- person Randy Howard; 13.03.2013