0

たとえば、さまざまな行列-ベクトル-乗算の結果を累積する場合(これは、累積要素が1つしかない場合でもBLASで行うことです)、正式にはゼロベクトルで始まります。しかし、CUDAデバイスメモリにゼロの配列を直接割り当てるオーバーヘッドのない方法はありません(またはありますか?)ので、頭に浮かぶ解決策は、0に初期化する代わりに、任意の数の配列を取得することです。 、またはbeta = 0.の最初の呼び出しに値を渡します。結局のところ、それがそのパラメータを持っているなら、「なぜそれを使わないのか」。cublas<t>gemvcusparse<t>csrmv

これは

  • いい考え?または、β = 1の場合、配列を0に初期化してから呼び出しを使用するために、全体的にパフォーマンスが向上するように最適化されていますcusparseDcsrmv(..., 1., zeroes_array)か?
  • 安全な?素朴なことに、 ℝ要素の表現としての浮動小数点はx⋅0 = 0∀xを満たす必要がありますが、この素朴な扱いは、浮動小数点を扱う場合はもちろんかなり致命的です。アレイが以前に同じデータ型で他の操作に使用され、結果が正常に動作した場合安全だと確信していますが、新しく割り当てられたデバイスメモリの単一化されたブロックに対しても安全ですか?

密な行列の場合、乗算のOn² )の複雑さにより、ベクトルのOn)割り当てのパフォーマンスについてあまり推論する必要がないため、私は主にスパースの場合に関心があります。

4

1 に答える 1

1

これは完全に安全である必要があり、常に実行されます。β=0のときに正しく動作しなかったパッケージには、重大なバグがあります。

特にcsrmvのcusparseドキュメントには、「ベータがゼロの場合、yは有効な入力である必要はない」と記載されており、LAPACKは* gemvについて同様のことを述べています(「ベータがゼロとして提供される場合、Yを入力に設定する必要はありません」 ")

最適化に関しては、beta=1とbeta=0がどの実装に対しても特定の最適化されたコードパスを持っている場合がありますが、そうではない場合があります。おそらくそうでない場合は、どちらもしません。

于 2012-03-13T13:20:36.207 に答える