Комментарии участников:
Довольно прямолинейное решение. Получилось, потому что памяти становится все больше и больше. Но реально работающее — это уже не плохо :)
Опять же, теоретически можно прикрутить и более сложную data structure и получить чудеса, но вопрос в реализации, пусть предъявят работающий «ящик» с прогонкой каких-нибудь вызывающих доверие бенчмарков из «общих алгоритмов» с 80% экономией по времени, и… станут миллиардерами ;)
В порядке бреда — почему бы не воспользоваться системой блокировок, как это сделано в СУБД?
Ядро, захватившее элемент очереди вычислений, накладывает на него блокировку. Следующее ядро ищет ближайший к нему свободный элемент. Адреса обновляются по факту снятия одной или нескольких ближайших к началу очереди блокировок — это можно подобрать экспериментально. Само-то по себе место в очереди особого значения не имеет, когда с ней работают сразу несколько ядер.
Ядро, захватившее элемент очереди вычислений, накладывает на него блокировку. Следующее ядро ищет ближайший к нему свободный элемент. Адреса обновляются по факту снятия одной или нескольких ближайших к началу очереди блокировок — это можно подобрать экспериментально. Само-то по себе место в очереди особого значения не имеет, когда с ней работают сразу несколько ядер.
так втом то и проблемма что к одной очереди обращаюся несколько ядер
С алгоритмами, которые используют распространенную структуру сведений, называемую очередью по приоритетам (priority queue), такая прямая пропорциональность сберегается примерно до восьми ядер, но с дальнейшим добавлением ядер рост быстродействия замедляется. Причина заключается в том, что к началу очереди, сформированной по приоритетности, одновременно пытаются обратиться многие ядра. Возникающие конфликты тормозят вычисления — иногда на многие порядки величины.
Тут мысля отказаться от приоритетов вообще. Выделяем список блокировок, и заставляем ядро обращаться сначала к нему, чтобы узнать, к какому элементу нужно обратиться — это будет ближайший к первому заблокированному. Ядро тут же блочит этот элемент и работает с ним. И так со всеми ядрами. Когда блокировка/несколько блокировок сняты — адреса пересчитываются. Короче, мне думается, что надо не разрешать коллизии, а избегать их возникновения.