2016-07-09 36 views
2

次元A×NとN×Bの2つの行列間のGEMMスタイルハミング距離を計算するために最適化されたCUDAカーネルを知っている人はいませんか?この問題は、GEMMとほぼ同じですが、各ベクトル要素を掛け合わせる代わりに、各ベクトル{1 ... N}の合計(a_n!= b_n)を計算します。最適化されたCUDA行列ハミング距離

この問題は比較的一般的であるため、私は自分で作成する前に検証したかったが、まだコードを見つけることに成功していない。変更するコードの提案も優れています。

EDIT:以下kangshiyinの提案に加えて

、私はthis walk-through of an optimized SGEMM implementationは、CUDA Cプログラミング・ガイドの基本的な共有メモリ行列乗算の例を超えた段階を理解する上で非常に有用であることが判明しました。

答えて

3

gemm()コードを修正することで、カーネルに書き込むことができます。 CUDAの例は単純な実装でgemm()ですが、それは単純すぎます。パフォーマンスは共有メモリアクセスによって制限され、Keplerデバイスで〜250Gflopsしか提供されません。より高いパフォーマンスを得るには、MAGMAのgemm()コードを確認してください。

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

これらの2つの論文はまた、どのように実装し、チューニングgemm()する方法を教えてください。 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()のピーク性能を考慮すると、ケプラーの〜3 Tflopsです。ハミング距離行列の計算には0.5〜2 Tflopsを得ることができます。

関連する問題