优化的CUDA矩阵汉明距离

时间:2016-07-09 00:56:41

标签: c++ c matrix cuda hamming-distance

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

我想在编写自己之前验证,因为这个问题相对常见,但我还没有成功找到它的代码。修改代码的建议也很好。

编辑:

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

1 个答案:

答案 0 :(得分:3)

您可以通过修改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

与具有用于快速乘加操作的FMA指令的硬件支持的gemm()不同,您所需的操作比较和添加可能需要更多指令,因此性能应该更低。考虑到gemm()的峰值性能在开普勒上是〜3 Tflops。汉明距离矩阵计算可能会得到0.5~2个Tflops。