优化的 CUDA 矩阵汉明距离

Optimized CUDA matrix hamming distance

是否有人知道用于计算维度 A x N 和 N x B 的两个矩阵之间的 GEMM 样式汉明距离的优化 CUDA 内核?该问题与 GEMM 几乎相同,但是计算每个向量 {1 ... N} 的总和 ( a_n != b_n ),而不是对每个向量元素进行乘法和求和。

自己写之前想验证一下,因为这个问题比较普遍,但是一直没找到代码。修改代码的建议也很好。

编辑:

除了以下 kangshiyin 的建议外,我发现 this walk-through of an optimized SGEMM implementation 对于理解 CUDA C 编程指南中基本共享内存矩阵乘法示例以外的步骤非常有帮助。

你是对的,你可以通过修改 gemm() 代码来编写你的内核。 CUDA例子有gemm()的简单实现,但是太简单了。性能受共享内存访问限制,在 Kepler 设备上仅提供约 250 Gflops。为了获得更高的性能,您可能需要检查 MAGMA 中的 gemm() 代码。

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() 的峰值性能在 Kepler 上约为 3 Tflops。海明距离矩阵计算你或许可以得到0.5~2 Tflops