优化的 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://www.netlib.org/lapack/lawnspdf/lawn267.pdf
与gemm()
硬件支持FMA指令进行快速乘加操作不同,您想要的比较加操作可能需要更多的指令,因此性能应该较低。考虑到 gemm()
的峰值性能在 Kepler 上约为 3 Tflops。海明距离矩阵计算你或许可以得到0.5~2 Tflops
是否有人知道用于计算维度 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://www.netlib.org/lapack/lawnspdf/lawn267.pdf
与gemm()
硬件支持FMA指令进行快速乘加操作不同,您想要的比较加操作可能需要更多的指令,因此性能应该较低。考虑到 gemm()
的峰值性能在 Kepler 上约为 3 Tflops。海明距离矩阵计算你或许可以得到0.5~2 Tflops