Кто-нибудь знает об оптимизированном ядре CUDA для вычисления расстояния Хемминга в стиле GEMM между двумя матрицами размерности A x N и N x B? Задача почти идентична GEMM, но вместо этого вычисляет сумму (a_n! = B_n) для каждого вектора {1 … N} вместо умножения и суммирования каждого элемента вектора.
Я хотел проверить, прежде чем писать свою собственную, так как эта проблема является относительно распространенной, но мне пока не удалось найти код для нее. Предложения по изменению кода также будут отличными.
РЕДАКТИРОВАТЬ:
В дополнение к предложениям Каншиин ниже я нашел это прохождение оптимизированной реализации SGEMM быть чрезвычайно полезным в понимании шагов, выходящих за рамки базового примера умножения матриц общей памяти в Руководстве по программированию CUDA C.
Вы правы в том, что можете написать свое ядро, изменив gemm()
код. Примеры CUDA имеют простую реализацию gemm()
, но это слишком просто. Производительность ограничена доступом к общей памяти, что дает на устройствах Kepler всего ~ 250 Гфлопс. Для более высокой производительности, вы можете проверить gemm()
код в МАГМА.
http://icl.cs.utk.edu/magma/index.html
Эти две статьи также расскажут вам, как реализовать и настроить gemm()
,
http://www.netlib.org/lapack/lawnspdf/lawn267.pdf
В отличие от gemm()
у которого есть аппаратная поддержка с инструкцией FMA для быстрой операции умножения и сложения, для желаемой операции сравнения и сложения может потребоваться больше инструкций, поэтому производительность должна быть ниже. Учитывая максимальную производительность gemm()
~ 3 Тфлопс на Кеплера. Вы можете получить 0,5 ~ 2 Tflops для расчета матрицы расстояния Хэмминга.
Других решений пока нет …