CUDAで変数の符号を取得する関数をPTXで書く

cutfというCUDAの組み込み関数やcuBLASの関数等をtemplate関数化するプロジェクトを持っているのですが,変数の符号を取得する関数を入れたくなったのでちょっぴり速い実装を書いてみました.

関数定義

こんな関数がほしい!ってやつですね.

  • 入力xが正なら1,負なら-1を返す
  • half2, half, float, doubleに対応
  • if文で愚直に書くのは嫌

実装

ということで浮動少数の符号部以外を1に置き換える方法で書いてみます.

例えばFP32であれば

  1. 32bit目が符号部なので0x80000000(10進2147483648)をand
  2. 31bit-1bitが指数部と仮数部なので,1.0fに対応する0x3f800000(10進1065353216)をor
とするだけですね.

組み込み関数を利用してreinterpret castして&と|で実装してもいいのですが,CUDAの他のヘッダーファイルに合わせてPTXで書いてみます.

実験

ifを用いた愚直な実装とどちらが速いか実験してみました. 愚直if実装に比べてデバイスや型にもよりますが1.1~5.5倍程度高速でした.

あとがき

正直ボトルネックになりにくい部分なのでここを速くしても仕方ない気はしますが,速いことに越したことはないでしょう.
カテゴリー:CUDA
記事作成日:2018-11-29