Оптимизированное расстояние хамминга матрицы CUDA

Кто-нибудь знает об оптимизированном ядре CUDA для вычисления расстояния Хэмминга в стиле GEMM между двумя матрицами размерности A x N и N x B? Проблема почти идентична GEMM, но вместо этого вычисляет сумму (a_n! = B_n) для каждого вектора {1 ... N} вместо умножения и суммирования каждого элемента вектора.

Я хотел проверить, прежде чем писать свою собственную, поскольку эта проблема довольно распространена, но мне пока не удалось найти для нее код. Предложения по изменению кода тоже были бы отличными.

РЕДАКТИРОВАТЬ:

В дополнение к приведенным ниже предложениям кангшиин я обнаружил, что это пошаговое руководство по оптимизированной реализации SGEMM быть чрезвычайно полезным в понимании шагов, выходящих за рамки простого примера умножения матриц совместно используемой памяти в Руководстве по программированию CUDA C.


person lakinsm    schedule 09.07.2016    source источник


Ответы (1)


Вы правы, что можете написать свое ядро, изменив gemm() код. В примерах CUDA есть простая реализация gemm(), но она слишком проста. Производительность ограничена доступом к разделяемой памяти, что дает только ~ 250 Гфлопс на устройствах Kepler. Для повышения производительности вы можете проверить gemm() код в MAGMA.

http://icl.cs.utk.edu/magma/index.html

В этих двух документах также рассказывается, как реализовать и настроить gemm().

http://staff.kfupm.edu.sa/ics/ahkhan/Resources/Papers/Autotuning/Autotuning%2520GEMM%2520Kernels%2520for%2520the%2520Fermi%2520GPU.pdf

http://www.netlib.org/lapack/lawnspdf/lawn267.pdf

В отличие от gemm(), который имеет аппаратную поддержку с инструкцией FMA для быстрой операции умножения и сложения, для желаемой операции сравнения и сложения может потребоваться больше инструкций, поэтому производительность должна быть ниже. Учитывая, что пиковая производительность gemm() составляет ~ 3 Тфлопс на Kepler. Вы можете получить 0,5 ~ 2 Тфлопс для вычисления матрицы расстояний Хэмминга.

person kangshiyin    schedule 09.07.2016