cutfというCUDAの組み込み関数やcuBLASの関数等をtemplate関数化するプロジェクトを持っているのですが,変数の符号を取得する関数を入れたくなったのでちょっぴり速い実装を書いてみました.
関数定義
こんな関数がほしい!ってやつですね.
- 入力xが正なら1,負なら-1を返す
- half2, half, float, doubleに対応
- if文で愚直に書くのは嫌
実装
ということで浮動少数の符号部以外を1に置き換える方法で書いてみます.
例えばFP32であれば
- 32bit目が符号部なので0x80000000(10進2147483648)をand
- 31bit-1bitが指数部と仮数部なので,1.0fに対応する0x3f800000(10進1065353216)をor
組み込み関数を利用してreinterpret castして&と|で実装してもいいのですが,CUDAの他のヘッダーファイルに合わせてPTXで書いてみます.
実験
ifを用いた愚直な実装とどちらが速いか実験してみました.- 実験コードと結果 : gitlab.momo86.net - mutsuki/cuda-sign
- NVIDIA Titan V, Geforce GTX 1080Ti
- CUDA 10.0
あとがき
正直ボトルネックになりにくい部分なのでここを速くしても仕方ない気はしますが,速いことに越したことはないでしょう.カテゴリー:CUDA
記事作成日:2018-11-29