2016-07-09 4 views
2

크기가 A × N이고 N × B 인 두 행렬 간의 GEMM 스타일 해밍 거리를 계산하는 데 최적화 된 CUDA 커널을 알고있는 사람이 있습니까? 문제는 GEMM과 거의 동일하지만 각 벡터 요소를 곱하고 합산하는 대신 각 벡터 {1 ... N}에 대한 합계 (a_n! = b_n)를 계산합니다.최적화 된 CUDA 행렬 해밍 거리

내 자신의 글을 쓰기 전에이 문제가 비교적 일반적이기 때문에 확인하고 싶었지만 아직 코드를 찾지 못했습니다. 수정할 코드에 대한 제안도 우수 할 것입니다.

는 편집 :

아래 kangshiyin의 제안과 더불어, 나는 CUDA C 프로그래밍 가이드의 기본 공유 메모리 행렬 곱셈 예를 넘어서는 단계를 이해하는 데 매우 도움이 될 this walk-through of an optimized SGEMM implementation을 발견했다.

답변

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()의 최고 성능을 고려하면 Kepler의 ~ 3 Tflops입니다. 해밍 거리 행렬 계산을 위해 0.5 ~ 2 Tflops를 얻을 수 있습니다.