Самый быстрый способ найти построчный максимум по подматрицам

Это почти полно. Есть шанс (Парадокс дня рождения), что произойдет столкновение с хешем, поэтому одного индекса UNIQUE недостаточно.

Лучше использовать хэш вместе со сравнением, чтобы быть полностью безопасным .

SELECT COUNT(*) FROM table
WHERE md5hash = MD5(text)
AND textvalue = text

Это может быть обернуто в INSERT или UPDATE TRIGGER - или, возможно, даже STORED PROCEDUR для легкой проверки.

Посмотрите на this Stack Overflow question для примера хэш-столкновения.

1
задан Enzo Ferrazzano 24 February 2019 в 11:43
поделиться

1 ответ

Вероятно, вы можете оптимизировать кеш с помощью цикла SIMD, который читает, может быть, 8 или 12 полных векторов строк, а затем те же строки для следующего столбца. (То есть для 32-битных элементов, 8 * 4 или 8 * 8 строк параллельно). Вы используете MSVC, который поддерживает встроенные функции x86 SSE2 / AVX2, такие как _mm256_load_ps и _mm256_max_ps или _mm256_max_epi32.

Если вы начнете с границы выравнивания, то, надеюсь, вы прочитаете все строки кеша, к которым вы прикоснулись. И затем тот же шаблон доступа в выходных данных. (Таким образом, вы читаете от 2 до 6 последовательных строк кэша с шагом между блоками чтения / записи.)

Или, возможно, записать результаты tmp где-нибудь компактно (1 значение на сегмент в строке), прежде чем уничтожить больше кеш запись копий одного и того же элемента в каждый столбец. Но попробуйте оба пути; смешивание операций чтения и записи может позволить процессору лучше перекрывать работу и находить больше параллелизма на уровне памяти.

0
ответ дан Peter Cordes 24 February 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: