2016-07-09 19 views
2

Kennt jemand einen optimierten CUDA-Kernel zur Berechnung einer GEMM-Hamming-Distanz zwischen zwei Matrizen der Dimension A x N und N x B? Das Problem ist fast identisch mit GEMM, berechnet aber stattdessen die Summe (a_n! = B_n) für jeden Vektor {1 ... N}, anstatt jedes Vektorelement zu multiplizieren und zu summieren.Optimierte CUDA-Matrix-Hamming-Distanz

Ich wollte vor dem Schreiben meiner eigenen überprüfen, da dieses Problem relativ häufig ist, aber ich hatte noch keinen Erfolg darin, Code dafür zu finden. Vorschläge für Code zu ändern wäre auch hervorragend.

EDIT:

Neben kangshiyin Vorschläge unten, fand ich this walk-through of an optimized SGEMM implementation außerordentlich hilfreich sein, in dem Leitfaden CUDA C Programmierschritte über das grundlegende Shared-Memory-Matrix-Multiplikation Beispiel zu verstehen.

Antwort

3

Sie haben Recht, dass Sie Ihren Kernel schreiben könnten, indem Sie den Code gemm() ändern. CUDA-Beispiele haben eine einfache Implementierung von gemm(), aber es ist zu einfach. Die Leistung wird durch den Zugriff auf den gemeinsamen Speicher begrenzt, so dass auf Kepler-Geräten nur ~ 250 Gflops zur Verfügung stehen. Für eine höhere Leistung sollten Sie den Code gemm() in MAGMA überprüfen.

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

Diese beiden Papiere Ihnen auch sagen, wie und gemm() Melodie zu implementieren.

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

Im Gegensatz zu gemm() die schnelle Hardware-Unterstützung bei der FMA-Befehl hat für Multiplikations- und Additions-Operation, die gewünschte Operation Vergleichs- und Add kann mehrere Befehle müssen, damit die Leistung sollte niedriger sein. Betrachtet man die Spitzenleistung von gemm() ist ~ 3 Tflops auf Kepler. Sie können 0,5 bis 2 Tflops für die Berechnung der Abstandsmatrix erhalten.

Verwandte Themen