たとえば、さまざまな行列-ベクトル-乗算の結果を累積する場合(これは、累積要素が1つしかない場合でもBLASで行うことです)、正式にはゼロベクトルで始まります。しかし、CUDAデバイスメモリにゼロの配列を直接割り当てるオーバーヘッドのない方法はありません(またはありますか?)ので、頭に浮かぶ解決策は、0に初期化する代わりに、任意の数の配列を取得することです。 、またはbeta = 0.
の最初の呼び出しに値を渡します。結局のところ、それがそのパラメータを持っているなら、「なぜそれを使わないのか」。cublas<t>gemv
cusparse<t>csrmv
これは
- いい考え?または、β = 1の場合、配列を0に初期化してから呼び出しを使用するために、全体的にパフォーマンスが向上するように最適化されています
cusparseDcsrmv(..., 1., zeroes_array)
か? - 安全な?素朴なことに、 ℝ要素の表現としての浮動小数点はx⋅0 = 0∀xを満たす必要がありますが、この素朴な扱いは、浮動小数点を扱う場合はもちろんかなり致命的です。アレイが以前に同じデータ型で他の操作に使用され、結果が正常に動作した場合は安全だと確信していますが、新しく割り当てられたデバイスメモリの単一化されたブロックに対しても安全ですか?
密な行列の場合、乗算のO(n² )の複雑さにより、ベクトルのO(n)割り当てのパフォーマンスについてあまり推論する必要がないため、私は主にスパースの場合に関心があります。