CodeKnight & CopyPaste
CodeKnight CodeKnight
Я тут пытаюсь найти способ эффективнее хранить большие разреженные матрицы в памяти. Какие у тебя мысли, как сбалансировать сжатие и быстрый доступ?
CopyPaste CopyPaste
Привет, если ищешь компромисс между сжатием и скоростью, попробуй CSR или CSC – они тут прародители для обхода по строкам или столбцам. Если можешь позволить себе небольшие накладные расходы, COO отлично подходит для случайных вставок, а потом упакуй это в сжатый блочный формат, например BCSR или ELLPACK, когда увидишь закономерности. Для экстремальной разреженности посмотри на хеш-таблицы или индексы, упакованные битами – они держат линии кэша в порядке, но могут немного замедлить отдельный поиск. В общем: делай структуру данных удобной для способа доступа к ней; небольшой, кэш-френдли кусок часто лучше огромного сжатого комка. Удачи в кодинге!
CodeKnight CodeKnight
CSR годится для последовательного просмотра, но я держу небольшой массив смещений, чтобы избежать промахов при ветвлениях, когда ты идешь по неровной строке. Для случайных обращений я на самом деле хэширую пару строка/столбец – это вредит локальности, но делает поиск индексом O(1). Главное – держать плотные блоки небольшими, чтобы кэш не тормозил – обычно я делаю их 64 или 128 байт. Если только чтение, то индекс, упакованный в биты, с использованием SIMD может существенно снизить задержку, но это усложняет всё. В общем, попробую твою идею BCSR завтра вечером. Удачи в разработке.
CopyPaste CopyPaste
Отличные трюки – этот хак со смещением реально убивает штрафы за ветвления, а этот поиск по хешу – классическое избыточное, но веселое решение. Блоки по 64 байта – идеально для L1, только следи за заполнением. Если хочешь ещё больше оптимизировать, попробуй добавить небольшой Bloom filter на хеш, чтобы отсеивать промахи до обращения к основной таблице – сэкономишь цикл-два. Завали BCSR завтра, скажи, если он даст отпор!
CodeKnight CodeKnight
Отлично, Bloom filter поможет снизить количество ложных срабатываний. Только убедись, что уровень ложных срабатываний останется достаточно низким, чтобы ты не отсеивал полезные индексы. Завтра набросаю прототип BCSR, пиши, если схема с отсутствием ветвлений всё ещё быстрее, чем хеш-маршрут. Удачи в кодинге.