В настоящее время я изучаю, можно ли ускорить обход дерева деревьев Эндде Боас (или любого дерева). Учитывая один запрос на поиск в качестве входных данных, уже имеющий несколько узлов дерева в строке кэша (макет Van emde Boas), обход дерева кажется узким местом для инструкций.Использование SIMD/AVX/SSE для обхода дерева
Будучи совершенно новым для SIMD/AVX/SSE инструкций, мне хотелось бы узнать от экспертов в этой теме, можно ли сразу сравнить несколько узлов с значением, а затем узнать, какой путь дерева следовать далее , Мои исследования привели к следующему вопросу:
Сколько циклов/инструкций процессора пропало впустую при построении регистра SIMD/AVX/SSE и т. Д. Это сделало бы его использование для пути, если строительство занимает больше времени, чем пересечение всего sub-tree вручную (2 + 4 + 8 узлов в 1 кешью размером 64 байта).
Сколько циклов/инструкций процессора теряется при поиске правильного регистра SIMD/AVX/SSE, на котором отвечает ответ на какой путь? Может ли кто-нибудь придумать разумный способ, чтобы эти инструкции «findMinimumInteger» AVX могли использоваться, чтобы решить, что в 1 (?) Цикле процессора?
Какова ваша догадка?
Другим, более сложным подходом к ускорению обхода дерева будет то, что сразу будет выполняться несколько поисковых запросов, когда существует высокая вероятность попадания в узлы близко друг к другу на последнем уровне дерева. Какие-нибудь догадки об этом? Ofc ему пришлось бы отложить эти запросы в сторону, которые больше не принадлежат к одному и тому же поддереву, а затем рекурсивно найти их после завершения первого «параллельного обхода» дерева. В дереве-запросах есть последовательные, хотя и не постоянные шаблоны доступа (запрос [i] всегда <, чем запрос [i + 1]).
Важно: этот материал о целочисленный дерева, поэтому ван Emde Боаш Дерево используется (возможно, х-быстро/у-быстрые попытки позже)
мне интересно, о том, что ваши 50 центов на это , учитывая, что можно было бы заинтересовать наивысшую достижимую производительность на крупномасштабном дереве. Заранее благодарю вас за потраченное время на это :-)
Если у вас много деревьев, у меня возникнет соблазн сделать каждый поиск дерева параллельным потоком. (Мы делаем это в инструменте анализа/преобразования программ, который мы создаем, как представляется, работают разумно). Почему не один из ваших рассмотренных вариантов? Другая идея: если у вас есть несколько запросов, и вы знаете, что они заблаговременно, вы можете скомпилировать их в FSA, используемую для ведения поиска. Часть FSA, генерируемая подтемами общего запроса, обрабатывается только один раз при значительной экономии. (Посмотрите на парсеры LR для аналогичного трюка с образцом продукта). –
Мы будем использовать массивную резьбу в любом случае. Это всего лишь самая эффективная реализация одного дерева на оборудовании AVX512. – user1610743