Я пересматривал некоторый код, который написал много лет назад, и решил переписать его, чтобы лучше использовать потоки (и лучше использовать программирование в целом ..).
Он находится здесь: https://github.com/buddhabrot/buddhabrot/blob/master/basic.c:
Это приложение, которое отображает фрактал buddhabrot.По причинам, выходящим за рамки этого вопроса, трудно использовать запоминание, чтобы оптимизировать это, и в основном, если вы профилируете это, более 99% времени тратится в самом внутреннем цикле, который в конечном итоге делает:
buddhabrot[col][row]++;
Несколько потоков выполнят этот код.Поскольку приращение не является поточно-ориентированным, я использовал специальную блокировку мьютекса вокруг этой части памяти.Итак, каждое адресуемое место в памяти buddhabrot имеет отдельный мьютекс.
Теперь это более эффективно, чем использование одной блокировки, конечно (которая определенно заставит все потоки ждать друг друга), но это меньшеэффективная память;кажется, что мьютексы также принимают некоторые данные.Мне также интересно узнать о других последствиях реализации pthreads с миллионами мьютексов?
Теперь у меня есть две другие стратегии для рассмотрения:
Использовать менее плотный набор мьютексовзамки, для каждого "региона" на карте.Так, например, блокировка для [col / 16] [row / 16] блокирует поток, только если он посещает ту же область 16 пикселей, что и другая.Плотность замков можно динамически регулировать.Но когда я моделировал это, мне было интересно, не решаю ли я существующую проблему, которая может даже быть реализована ядрами, и я также не могу найти способ сделать это, не замедляя процесс.Я также подумал о «деревьях мьютексов», но все это слишком медленно внутри этого цикла (чтобы дать представление, после оптимизации порядка некоторых математических операций за спиной компилятора, я мог бы выжать на 30% больше процессорного времени),Есть ли тема для этого, как мне найти более подробную информацию о «планировании плотности мьютексов» ..?
Скопируйте память для каждого потока, чтобы мне даже не пришлось мьютексвокруг него.Но это еще более неэффективно для памяти.Это решило бы проблему наличия миллионов мьютексов, не зная их последствий.
Итак, есть ли что-нибудь еще, что-нибудь лучшее, что я мог бы сделать?