Julia: 行列乗算API

䜜成日 2017幎09月28日  Â·  208コメント  Â·  ゜ヌス: JuliaLang/julia

珟圚、スパヌスmatmultコヌドには次の行がありたす。

https://github.com/JuliaLang/julia/blob/056b374919e11977d5a8d57b446ad1c72f3e6b1d/base/sparse/linalg.jl#L94 -L95

これは、密な配列のC BLAS gemm APIを䞊曞きするより䞀般的なA_mul_B*!(α,A,B,β,C) = αAB + βCメ゜ッドが必芁であるこずを意味するず思いたす。 それでもそうですか 䞡方のAPIを保持するこずも可胜です。぀たり、 A_mul_B*!(C,A,B)ずしお定矩されるA_mul_B*!(C,A,B) = A_mul_B*!(1,A,B,0,C) A_mul_B*!(C,A,B)メ゜ッドを保持するこずも可胜です。

個人的には、すべおの配列タむプに察しおgemm APIを定矩しおもらいたいず思いたすこれは他の堎所で衚珟さたす。 密な配列にこれらのメ゜ッドを実装するこずは、 gemm盎接呌び出すだけなので、かなり簡単に思えたす。 スパヌスケヌスはすでに実装されおいたす。 唯䞀の実際の倉曎は、 αおよびβ匕数を受け入れない玔粋なjuliaゞェネリックmatmultぞの倉曎です。

これにより、任意のタむプの配列/数倀で機胜するゞェネリックコヌドが䜜成されたす。 私は珟圚、bigfloatsずスパヌス配列で機胜するexpmの簡単な実装を持っおいたす _generic_matmatmult!倉曎を加えた埌。

linear algebra

最も参考になるコメント

私は、今から10日の期限で1回の承認投祚を提案したす。 承認投祚ずは、誰もが議論を続けるよりも奜たしいず考えるすべおのオプションに投祚するこずを意味したす。 継続的な議論よりも今は自分の最も嫌いな名前を持ちたい人は、3぀すべおに投祚する必芁がありたす。 広範な承認を受けるオプションがない堎合、たたは投祚スキヌム自䜓が広範な承認を満たしおいない堎合は、議論を継続する必芁がありたす。 承認されたオプションがほが同点の堎合、 @ tkfが決定したすPR䜜成者の特暩。

+1私はこの投祚スキヌムに同意し、承認祚を投じたした。
-1私はこの投祚スキヌムに同意したせん。 あたりにも倚くの、たたはあたりにも重芁な人々がこのオプションを遞択した堎合、投祚は無効になりたす。

心 mul!は、継続的な議論よりも望たしいです。
ロケット muladd!は、継続的な議論よりも望たしいです。
Hooray継続的な議論よりもaddmul!が望たしいです。

私は暫定的に、75の承認ず5人が確実に定足数を䜜成するこずを提案したす぀たり、投祚手順党䜓ぞの䞍䞀臎を含め、投祚した人の75、および少なくずも5人が勝利オプションを承認したした。参加が少ない堎合、次に5/6たたは6/8が定足数を䜜成したすが、党䌚䞀臎の4/4は倱敗ず芋なされる可胜性がありたす。

党おのコメント208件

参照。 9930、20053、23552。 ベスト

参照しおいただきありがずうございたす。 この問題は、APIの改良よりもgemmスタむルのメ゜ッドの远加に関係しおいるず思いたすが、それでも9930ずあたりにも類䌌しおいるず思われる堎合は、閉じるこずができたす。

出発点ずしお、 _generic_matmatmul!にgemm APIを持たせるためのサポヌトはありたすか 珟圚のメ゜ッドはα=1ずβ=0䜿甚するだけで実装されるため、これはかなり単玔な倉曎であり、玔粋に付加的/非砎壊的です。 PRできたす。 私はおそらくこのバヌゞョンず同じように行きたすそのバヌゞョンでは、必芁がなかったのですべおのトランスポヌズをカットしたした。ここではそれを行いたせん。

はい。 それは良いスタヌトになるでしょう。 ただし、匕数の順序を考慮する必芁がありたす。 もずもず、BLASの順序に埓う方が自然だず思っおいたしたが、珟圚の3぀の匕数A_mul_B!も圓おはたる、最初に出力匕数を持぀こずに぀いおはかなり䞀貫しおいたす。 さらに、すでに指摘したように、3぀の匕数のバヌゞョンはα=1ずβ=0の5぀の​​匕数のバヌゞョンに察応し、デフォルト倀の匕数は最埌になりたす。 もちろん、これに必ずしもデフォルト倀の構文を䜿甚する必芁はありたせんが、ここで䜿甚するこずは理にかなっおいたす。

なぜ䞀般的なgemm関数を導入しないのですか

はい。 それは良いスタヌトになるでしょう。 ただし、匕数の順序を考慮する必芁がありたす。 もずもず、BLASの順序に埓う方が自然だず思っおいたしたが、珟圚の3぀の匕数A_mul_Bにも圓おはたる、最初に出力匕数を持぀こずに぀いおはかなり䞀貫しおいたす。 さらに、すでに指摘したように、3぀の匕数のバヌゞョンはα= 1およびβ= 0の5぀の匕数のバヌゞョンに察応し、デフォルト倀の匕数は最埌になりたす。 もちろん、これに必ずしもデフォルト倀の構文を䜿甚する必芁はありたせんが、ここで䜿甚するこずは理にかなっおいたす。

いいですね。 9930で、実際の匕数の順序ずメ゜ッドの名前倉曎に぀いおの議論を続けるこずができたす。 私は珟圚おこうので、これは、よりわずか5匕数バヌゞョンが利甚可胜になる皋床であるAx_mul_Bx!(α,A,B,β,C)むンタヌフェむスを。

䞀般的なgemm関数を導入しおみたせんか

䞊蚘の倉曎に加えお、 _generic_matmatmul!名前をgemm!に倉曎するこずを提案しおいたすか

明確にするために、ディスパッチする怠惰な転眮/随䌎型ずずもに、単䞀のメ゜ッドmul(C,A,B,α=1,β=0)を䜿甚する必芁があるず思いたすが、それは別のPRになりたす。

䞀般的なgemm関数を導入しおみたせんか

gemmはゞュリアの誀称だず思いたす。 BLASでは、 ge郚分は、行列が䞀般的であるこず、぀たり特別な構造がないこず、最初のmが乗算であるこず、リストmが行列であるこずを瀺したす。 Juliaでは、 ge 䞀般郚分が最埌のm マトリックスず同様に眲名に゚ンコヌドされおいるので、 mul!ず呌ぶべきだず思いたす。

SparseArrays.jlの衚蚘mul!(α, A, B, β, C)です

https://github.com/JuliaLang/julia/blob/160a46704fd1b349b5425f104a4ac8b323ea85af/stdlib/SparseArrays/src/linalg.jl#L32

公匏構文ずしお「完成」 そしお、これはmul!(C, A, B) 、 lmul!(A, B) 、およびrmul!(A,B)に远加されたすか

私はA 、 B 、 Cを異なる順序で䞊べるのが奜きではありたせん。

SparseArrays.jlの衚蚘mul!(α, A, B, β, C)は、公匏の構文ずしお「finalised」されおいたすか

いいえず思いたす。 もずもず私はBLASに埓うずいうアむデアが奜きでしたそしお順序もこれが通垞数孊的に曞かれる方法ず䞀臎したしたが、今ではオプションの4番目ず5番目の匕数ずしおスケヌリング匕数を远加するのが理にかなっおいるず思いたす。

明確にするために、ある意味でオプションの匕数が必芁です

function mul!(C, A, B, α=1, β=0)
 ...
end

他のオプションはオプションのキヌワヌド匕数になりたす

function mul!(C, A, B; α=1, β=0)
...
end

しかし、人々がナニコヌドに満足しすぎおいるかどうかはわかりたせん。

私はナニコヌドに非垞に満足しおいたすが、私たちが垞にASCIIオプションを持っおいるこずを詊みおいるのは事実であり、それはここで可胜です。 αずβずいう名前も、BLASを知らない限り、あたり盎感的ではないので、ここでは䜍眮匕数を䜿甚する方が良い解決策だず思いたす。

私の意芋では、より論理的な呜名法は、 muladd!(A, B, C, α=1, β=1)乗算ず加算を行うさたざたなBLASルヌチンにマップさせるこずです。  gemm䞊蚘のようなだけでなく、䟋えば、 axpy堎合Aスカラヌです。

mul!関数は、すべおの䞭間結果をYに栌玍できる限り、任意の数の匕数を取るmul!(Y, A, B, ...)ようなむンタヌフェむスを持぀こずができたす *同じように。オプションのkwargは、劥圓なデフォルトで乗算の順序を指定できたす

mul!(Y, A::AbstractVecOrMat, B:AbstractVecOrMat, α::Number)には、2぀の行列/ベクトルずスカラヌの他の順列ず同様に、デフォルトの実装muladd!(A, B, Y, α=α, β=0)がありたす。

密行列に察しおmul!(C, A, B, α, β)定矩するための別の投祚。 これにより、密行列ず疎行列のゞェネリックコヌドを蚘述できたす。 このような関数を非線圢最小二乗パッケヌゞで定矩したかったのですが、これはタむプの著䜜暩䟵害だず思いたす。

たた、 MixedModelsパッケヌゞ甚にmul!(C, A, B, α, β)メ゜ッドを蚘述しお、ちょっずしたタむプの著䜜暩䟵害に埓事したいず思っおいたすが、そのようなメ゜ッドがLinearAlgebraれおいるずはるかに良いでしょう。パッケヌゞ。 この操䜜のゞェネリックmuladd!メ゜ッドがあるず、私も問題ありたせん。

私は賛成ですが、おそらくmul!は別の名前にする必芁があるず思いたす。 muladd!は劥圓なようですが、確かに提案を受け入れおいたす。

たぶんmulinc!は乗算むンクリメントですか

たぶん私たちはaddmul!(C, A, B, α=1, β=1)ようなものを持぀こずができたすか

これはmuladd!圢匏ではありたせんか それずも、それをaddmul!ず呌ぶ背埌にある考え方は、乗算匕数ではなく加算匕数を倉曎するずいうものですか 乗算匕数を倉曎するこずはありたすか

lmul!やldiv! 、最初以倖の芁玠を倉曎する堎合があるため、通垞の「muladd」順序 muladd!(A,B,C) で倉曎できるこずに泚意しおください。 問題は、 αずβ順序を

スカラヌαずβのタむプをディスパッチするオプションを実装者に任せたら玠晎らしいず思いたせんか ゚ンドナヌザヌのために砂糖を加えるのは簡単です。

すでにmul!(C, A, B, α, β)萜ち着き、デフォルト倀はα 、 βだず思いたした。 このバヌゞョンはhttps://github.com/JuliaLang/julia/blob/b8ca1a499ff4044b9cb1ba3881d8c6fbb1f3c03b/stdlib/SparseArrays/src/linalg.jl#L32-L50で䜿甚しおい

ありがずう それが文曞化されおいればいいのですが。

すでにmul!(C, A, B, α, β)萜ち着き、デフォルト倀はα 、 βだず思いたした。

SparseArraysはそれを䜿甚したすが、どこでも議論されたこずを思い出したせん。

いく぀かの点で、 muladd!名前は、乗算ずそれに続く加算であるため、より自然です。 ただし、αずβのデフォルト倀muladd!(C, A, B, α=1, β=0) βのデフォルトは1ではなくれロであるこずに泚意しおくださいは、 mul!(C, A, B)に戻したす。

これをmul!ずmuladd!どちらで呌び出すかは、衒孊ず䞀貫性のケヌスのようであり、SparseArraysの既存のメ゜ッドのケヌスはmul!を䞻匵するず思いたす。 私のお気に入りのオスカヌワむルドの匕甚にもかかわらず、䞀貫性を䞻匵するずいう奇劙なケヌスに自分自身を芋぀けたす。「䞀貫性は想像を絶する最埌の避難所です。」

いく぀かの点で、 muladd!名前は、乗算ずそれに続く加算であるため、より自然です。 ただし、αずβのデフォルト倀muladd!(C, A, B, α=1, β=0) βのデフォルトは1ではなくれロであるこずに泚意しおくださいは、 mul!(C, A, B)に戻したす。

CにInfsたたはNaNが含たれおいる堎合、これには興味深い䟋倖がありたす。理論的には、 β==0堎合、結果はNaNのたたです。 BLASずスパヌス行列コヌドが明瀺的にβ==0チェックし、それをれロに眮き換えるため、これは実際には発生したせん。

true*xは垞にxであるずいう意味で、 trueずfalseはそれぞれ「匷い」1ず0であるため、デフォルトがα=true, β=falseであるず考えるこずができたす。 xずfalse*xは垞にzero(x)です。

lmul!も、その䟋倖的な動䜜が必芁です https 

trueずfalseは、 true*xが垞にxあり、 false*xが垞にzero(x)であるずいう意味で、それぞれ「匷い」1ず0です。

私はそれを知りたせんでした

julia> false*NaN
0.0

FWIW、この操䜜のLazyArrays.jl構文の読みやすさにかなり満足しおいたす。

y .= α .* Mul(A,x) .+ β .* y

舞台裏では、BLAS互換アレむバンドおよびストラむドの堎合、 mul!(y, A, x, α, β)に䞋がりたす。

知らなかった

これは、 im = Complex(false, true)機胜させるものの䞀郚です。

SparseArraysはそれを䜿甚したすが、どこでも議論されたこずを思い出したせん。

䞊蚘のhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-365463941で説明され、異議なしにhttps://github.com/JuliaLang/julia/pull/26117で実装されたした。 密集したケヌスにはα,βバヌゞョンがないため、このリポゞトリで決定が即座に圱響を䞎える唯䞀の堎所はSparseArraysたす。

LinearAlgebra.BLAS.gemm!どうですか 5぀のmul!ずしおもラップするべきではありたせんか

それはすべきですが、ただ誰もそれをしおいたせん。 matmul.jlは倚くのメ゜ッドがありたす。

これは䞊蚘の23919コメントで説明され、26117で異議なしに実装されたした。

たあ、これは私の異議だず考えおください。 別の名前がいいず思いたす。

なぜ違う名前になるのでしょうか 密な堎合ず疎な堎合の䞡方で、基本的なアルゎリズムは乗算ず加算の䞡方を実行したす。

これらの関数に異なる名前を付けるず、 mul!(C,A,B) = dgemm(C,A,B,1,0)ずmuladd!(C,A,B,α, β) = dgemm(C,A,B,α, β)たす。

私が芋る唯䞀の利点は、実際にメ゜ッドを分割し、 C = A*B堎合にif β==0呌び出しを保存する堎合です。

参考たでに、むンタヌフェむスをmatmul.jlに远加するために、29634で䜜業を開始したした。 名前ず眲名が決たるたでに完成させたいず思っおいたす:)

muladd!の利点は、デフォルトのα = β = true 元の提案httpsで述べたようにで3項のmuladd!(A, B, C) たたはmuladd!(C, A, B) を持぀こずができるこずです。 //github.com/JuliaLang/julia/issues/23919#issuecomment-402953987。 方法muladd!(A, B, C)に䌌おmuladdのためにNumber私はそれはあなたが既に知っおいる堎合は特に、より自然な名前だず思うので、S muladd 。

@andreasnoack以前の議論は、メ゜ッド名ではなく、メ゜ッドのシグネチャずキヌワヌド匕数よりも䜍眮匕数を優先するこずに関するもののようです。 muladd!ずいう名前に異議はありたすか  SparseArraysに5぀のmul!が存圚するこずもありたすが、䞋䜍互換性のあるラッパヌを定矩するこずは難しくありたせん。

mul!ずmuladd!䞡方を持぀こずは、前者がαずβデフォルト倀を持぀埌者である堎合、冗長に芋えたす。 さらに、 add郚分はBLASによっお正芏化されおいたす。 muladd!で信頌できる䞀般的な線圢代数アプリケヌションを思い付くこずができれば、それに぀いお聞きたいのですが、それ以倖の堎合は冗長性を避けたいず思いたす。

たた、私は匷く私たちは匷いれロプロパティおくこずを奜むだろうfalseの議論ずは別にmul! 。 IMOのβのれロ倀は、BLASの堎合ず同様に、珟圚の5぀の匕数mul!メ゜ッドの堎合ず同様に匷力である必芁がありたす。 ぀たり、この動䜜はβタむプではなく、 mul!結果である必芁がありたす。 代替案を扱うのは難しいでしょう。 䟋 mul!(Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, 1.0, 0.0) 〜できたした〜BLASを䜿甚できたせんでした。

BLASの動䜜を倉曎するこずはできたせんが、floatの匷いれロの動䜜が_requiring_するずいうこずは、すべおの実装でれロをチェックするためのブランチが必芁になるこずを意味したす。

muladd!信頌できる䞀般的な線圢代数アプリケヌションを思い付くこずができれば

@andreasnoackこれは、「_ three-argument_ muladd!申請」を意味しおいるず思いたす。そうしないず、5぀の匕数mul!を含めるこずに同意しないからです。

しかし、それでもmuladd!(A, B, C)が圹立぀䟋を思い぀くこずができたす。 たずえば、「スモヌルワヌルド」ネットワヌクを構築する堎合は、垯行列ずスパヌス行列の「遅延」合蚈があるず䟿利です。 次に、次のように蚘述できたす。

A :: SparseMatrixCSC
B :: BandedMatrix
x :: Vector  # input
y :: Vector  # output

# Compute `y .= (A .+ B) * x` efficiently:
fill!(y, 0)
muladd!(x, A, y)  # y .+= A * x
muladd!(x, B, y)  # y .+= B * x

ただし、䜿甚するために単玔にラップできるので、手動でtrue曞き蟌んでもかたいたせん。 安定した文曞化されたAPIずしお5぀の匕数の関数を持぀こずは、ここでの最も重芁な目暙です。

芁点に戻る

mul!ずmuladd!䞡方を持぀こずは、前者がαずβデフォルト倀を持぀埌者である堎合、冗長に芋えたす。

ただし、出力配列の「デフォルト倀」が適切に初期化された状態で、 mul!に関しおいく぀かの*実装されおいたす。 Baseや暙準ラむブラリにそのような「ショヌトカット」の䟋があるのではないかず思いたす。 mul!はmuladd!ショヌトカットにすぎたせんが、 mul!ずmuladd!䞡方を䜿甚するのは理にかなっおいるず思いたす。

falseのストロングれロプロパティをmul!説明ずは別にしおおくこずを匷くお勧めしたす。

最初に乗算加算の5぀の匕数バヌゞョンの名前に぀いお議論するこずに焊点を圓おるこずが建蚭的であるこずに同意したす mul!察muladd! 。

行列ず数倀を䞀般的に凊理するためにmuladdが必芁な䞀般的なナヌスケヌスを求めたずき、私はうたくいきたせんでした。 番号バヌゞョンは感嘆笊なしでmuladdになるので、私が尋ねたこずは実際には意味がありたせんでした。

あなたの䟋は次のように曞くこずができたす

mul!(y, A, x, 1, 1)
mul!(y, B, x, 1, 1)

だから私はただmuladd!の必芁性を芋おいたせん。 このケヌスが非垞に䞀般的で、 1, 1を曞くのが冗長すぎるず思うだけですか

ただし、出力配列の「デフォルト倀」が適切に初期化された状態で、 mul!に関しおいく぀かの*実装されおいたす。 Baseや暙準ラむブラリにそのような「ショヌトカット」の䟋があるのではないかず思いたす。

これはわかりたせん。 詳しく説明しおいただけたすか ここで話しおいるショヌトカットは䜕ですか

だから私はただmuladd!の必芁性を芋おいたせん。 このケヌスが非垞に䞀般的で、 1, 1を曞くのが冗長すぎるず思うだけですか

muladd!は、実際に䜕をするかに぀いおもより説明的だず思いたすただし、おそらくaddmul!である必芁がありたす。

muladd!ずいう名前に問題はありたせん。 第䞀に、私はこれのために機胜する必芁はないず思いたす、そしお第二に、 muladd! / addmul!を支持しおmul!を非掚奚にする䟡倀はないず思いたす。

このケヌスは非垞に䞀般的であるため、1、1を曞くのは冗長すぎるず思うだけですか

いいえ。パブリックAPIである限り、5぀の匕数関数を呌び出しおもたったく問題ありたせん。 私はちょうど3぀の匕数バヌゞョンだけが必芁な䟋を挙げようずしたしたそれがあなたの芁求だず思ったので。

ここで話しおいるショヌトカットは䜕ですか

https://github.com/JuliaLang/julia/blob/f068f21d6099632bd5543ad065d5de96943c9181/stdlib/LinearAlgebra/src/matmul.jl#L140 -L143

ここで定矩されおいる*は、 mul!ショヌトカットず芋なすこずができるず思いたす。 デフォルト倀の「ちょうど」 mul!です。 では、なぜmul! addmul!をデフォルト倀のmuladd! / addmul!しないのですか

同様の「ショヌトカット」ずしお定矩されおいるrmul!ずlmul!もありたす。

https://github.com/JuliaLang/julia/blob/f068f21d6099632bd5543ad065d5de96943c9181/stdlib/LinearAlgebra/src/triangular.jl#L478 -L479

mul!廃止

議論は新しいむンタヌフェヌスを远加するかどうかに぀いおだず思いたした。 新しいAPIを远加するためにmul!を非掚奚にする必芁がある堎合、それだけの䟡倀はないず思いたす。

私が考えるこずができる䞻な議論は次のずおりです。

  • 抂念的には、5匕数圢匏は単なる「乗算」以䞊のこずを行い、これをより明確に䌝えたす。
  • 次に、 mul!(C,A,B,1,1)たたはmul!(C,A,B,true,true)代わりにaddmul!(C, A, B)曞くこずができたす。

ここで定矩されおいる*は、 mul!ショヌトカットず芋なすこずができるず思いたす。 デフォルト倀の「ちょうど」 mul!です。 だから、なぜmulさせないでください デフォルト倀でmuladd! / addmul!なりたすか

*は行列を乗算するデフォルトの方法であり、ほずんどのナヌザヌがそれを行う方法だからです。 比范するず、 muladd!䜿甚量は*に近くなりたせん。 さらに、それは既存の挔算子ですが、 muladd! / addmul!は新しい関数になりたす。

rmul!ずlmul!は、通垞、アりトオブプレヌスのmul!メ゜ッドのデフォルト倀バヌゞョンではないため、このパタヌンに適合するずは思わないでください。

サむモンは、すぐ䞊の投皿で利点をうたく芁玄しおいたす。 問題は、名前倉曎の远加機胜 mul!非掚奚を意味するのいずれかを正圓化するのに十分なメリットがあるかどうかです。 それは私たちが同意しないずころです。 それだけの䟡倀はないず思いたす。

名前を倉曎する䟡倀がないず蚀うずき、APIが完党に公開されおいないこずを考慮したしたか ぀たり、それはJuliaのドキュメントにはないずいうこずです。

LazyArrays.jlおよび他のパッケヌゞはすでにそれを䜿甚しおいるので、盲目的にsemverをフォロヌするのは良くありたせん。 しかし、それでも、他の関数ほど公開されおいたせん。

mul!はLinearAlgebraから゚クスポヌトされ、広く䜿甚されおいるため、この時点で確実に非掚奚にする必芁がありたす。 A_mul_B!がmul!たたは少なくずも0.7より前に、関数の名前を倉曎する方がはるかに良い時期だったので、この議論がなかったのは残念です。

今のずころmul!を䜿甚しお、stdlibを個別に曎新できるずきにLinearAlgebra v2.0の名前を曎新するのはどうですか

LazyArrays.jlは、倚くの皮類の行列に察しお柔軟性がないため、 mul!䜿甚したせん StridedArrayオヌバヌラむドするず、コンパむラの速床䜎䞋のバグが発生したす。 フォヌムの代替構造を提䟛したす

y .= Mul(A, x)

私が芋぀けたものはより説明的です。 5぀の匕数のアナログは

y .= a .* Mul(A, x) .+ b .* y

mul!を非掚奚にし、LinearAlgebra.jlのLazyArrays.jlアプロヌチに移行するこずに賛成ですが、それは難しいケヌスになりたす。

LowRankApprox.jlはmul!を䜿甚したすが、LazyArrays.jlアプロヌチを䜿甚するように倉曎しお、コンパむラのバグを回避する可胜性がありたす。

OK。 提案は2぀しかないず思いたした。 しかし、どうやら倧たかに3぀の提案がありたすか

  1. 3匕数ず5匕数mul!
  2. 3匕数ず5匕数muladd!
  3. 3぀の匕数mul!ず5぀の匕数muladd!

 muladd!はaddmul!ず呌ばれる堎合がありたす

1ず3を比范しおいるず思っおいたした。 わかりたした。

3぀の匕数mul!はパブリックAPIであり、広く䜿甚されおいるため、2はたったくオプションではないず思いたす。 「APIが完党に公開されおいない」ずは、 5぀の匕数mul!が文曞化されおいないこずを意味したす。

はい、私の蚈画はmul!を保持するこずmul!ずaddmul!は異なる動䜜をするため、これは䟡倀があるず思いたす。぀たり、 addmul!(C, A, B, α, β)䞎えられるず、次のようになりたす。

mul!(C, A, B) = addmul!(C, A, B, 1, 0)
mul!(C, A, B, α) = addmul!(C, A, B, α, 0)
addmul!(C, A, B) = addmul!(C, A, B, 1, 1)
addmul!(C, A, B, α) = addmul!(C, A, B, α, 1)

ただし、実際にはこの方法で実装したくない堎合がありたす。たずえば、4匕数のmul!ずaddmul!別々に蚭定し、5匕数のaddmul!を定矩する方が簡単な堎合がありたす。

addmul!(C, A, B, α, β) = addmul!(C .= β .* C, A, B, α)

バンプ

ただし、実際にはこの方法で実際に実装したくない堎合がありたす。たずえば、4匕数のmulだけの方が簡単な堎合がありたす。 そしおaddmul 個別に、5匕数のaddmulを定矩しおください なので
addmul!(C, A, B, α, β) = addmul!(C .= β .* C, A, B, α)

すぐに最適にやっおみたせんか そのようにしないこずのポむントは、 Cの芁玠に䞀床だけアクセスする必芁があるずいうこずです。これは、倧きな行列の堎合は間違いなくより効率的です。 さらに、5匕数のaddmul!だけを定矩するのに察しお、4匕数のmul!ずaddmul!䞡方を別々に定矩するこずで、コヌドが長くなるずは信じられたせん。

参考たでに、LinearAlgebraの_generic_matmatmul!の実装を倉曎しお、LazyArraysで5぀の匕数を取るようにしたした https 

ここでは、経由で呌び出されたす

materialize!(MulAdd(α, A, b, β, c)) 

ただし、実際のコヌド tiled_blasmul! は、LinearAlgebraに簡単に倉換しお戻すこずができたす。

このプロセスをスピヌドアップするために䜕ができるでしょうか 私が取り組んでいるこずは、むンプレヌスmul + addを備えた統合行列乗算APIから本圓に恩恵を受けるでしょう

Strided.jlの最新バヌゞョンは、5぀の匕数mul!(C,A,B,α,β)もサポヌトするようになり、可胜な堎合はBLASにディスパッチし、それ以倖の堎合は独自のマルチスレッド実装を䜿甚したす。

@Jutho玠晎らしいパッケヌゞ 次のロヌドマップはありたすか 最終的にLinearAlgebraずマヌゞする蚈画はありたすか

これは私の意図ではありたせんでしたが、ある時点で芁求された堎合、私はそれに反察したせん。 ただし、䞀般的なmapreduce機胜での@generated関数の自由な䜿甚1぀だけですがは、Baseにはあたり適しおいない可胜性がありたす。

私の個人的なロヌドマップこれは䞻に、高レベルのパッケヌゞ、぀たり新しいバヌゞョンのTensorOperationsや、私が取り組んでいる他のパッケヌゞで䜿甚される䜎レベルのパッケヌゞです。 ただし、基本的な線圢代数をさらにサポヌトするこずをお勧めしたすたずえば、 normをStridedView珟圚、Julia Baseでのnorm実装がかなり遅くなりたす。 たた、時間があり、GPUの操䜜方法を孊ぶ堎合は、同様に䞀般的なmapreducekernelをGPUArrayに実装しおみおください。

これたでのコンセンサスは次のずおりだず思いたす。

  1. mul!(C, A, B)を維持する必芁がありたす
  2. むンプレヌス乗算には_some_5匕数関数が必芁です- C = αAB + βC远加したす

最初に5匕数関数の名前に焊点を圓お、埌で远加のAPIに぀いお説明するこずをお勧めしたす3匕数および4匕数addmul! 。 しかし、これはmul!を䜿甚しお_not_から取埗する「機胜」であるため、混合しないのは困難です。

@andreasnoackは、䞊蚘@simonbyrneのコメントによっお解決リネヌム廃止/に぀いおのあなたの関心事であるhttps://github.com/JuliaLang/julia/issues/23919#issuecomment -431046516 非掚奚の必芁はないず思いたす。

参考たでに、実装29634を終了したした。 LinearAlgebra粟通しおいる人がレビュヌしおいただければ幞いです。

すべおにmul!ずいう名前を付ける方が簡単で良いず思いたす。 たた、非掚奚を回避したす。 本圓に別の名前が必芁な堎合は、 muladd方が適しおいたす。

mul! APIに぀いお議論するずきに考慮すべき他の䜕か

scale!が消えお、0.6-> 0.7遷移に倢䞭になったずき、スカラヌ倍算ベクトル空間のプロパティずオブゞェクト自䜓の乗算代数のプロパティが非垞に異なっおいたので、少し悲しかったです。 。 それにもかかわらず、私はmul!アプロヌチを完党に受け入れおおり、スカラヌ乗算が可換でない堎合にrmul!(vector,scalar)ずlmul!(scalar,vector)できるこずを非垞に高く評䟡しおいたす。 しかし今、私は毎日、他の2぀のむンプレヌスベクトル空間挔算の非ゞュリアン名であるaxpy!ずその䞀般化axpby!悩たされおいたす。 これらもmul! / muladd! / addmul!に吞収される可胜性がありたす。 少し奇劙ですが、 A*Bの2぀の芁玠の1぀がすでにスカラヌである堎合、远加のスカラヌ芁玠αは必芁ありたせん。
しかし倚分それなら、

mul!(C, A, B, α, β)

ある可胜性もありたす

add!(Y, X, α, β)

axpby!を眮き換えたす。

@andreasnoack廃止/名前倉曎に関する懞念は、23919コメントの䞊の@simonbyrneのコメントによっお解決されたしたか 非掚奚の必芁はないず思いたす。

https://github.com/JuliaLang/julia/issues/23919#issuecomment-430952179の最埌の段萜を参照しおmul!を非掚奚にする必芁があるず思いたす。

@Jutho acp(b)y!名前をadd!するのは良い考えだず思いたす。

23919コメントの最埌の段萜を参照しおください。 新しい機胜を導入するだけの䟡倀はないず思いたす。

はい、私はそれを読み、5぀の匕数mul!は文曞化されおおらず、パブリックAPIの䞀郚ではないず返信したした。 したがっお、_技術的に_非掚奚にする必芁はありたせん。 https://github.com/JuliaLang/julia/issues/23919#issuecomment -430975159の最埌の段萜を参照しお

ここでは、1぀の眲名䟋 mul!(C, A, B) の文曞化によるパブリックAPIの宣蚀は、他の眲名䟋 mul!(C, A, B, α, β) には適甚されないず想定しおいたす。 そうでない堎合は、Juliaずそのstdlibが内郚を公開しすぎおいるず思いたす。 たずえば、これはPkg.add文曞化された眲名です

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/Pkg.jl#L76 -L79

䞀方、実際の定矩は

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/API.jl#L69 -L70

https://github.com/JuliaLang/julia/blob/0d713926f85dfa3e4e0962215b909b8e47e94f48/stdlib/Pkg/src/API.jl#L27 -L33

Pkg.add少なくずも1぀の眲名のドキュメントの存圚が、他の眲名がパブリックAPIであるこずを意味する堎合、Pkg.jlは、メゞャヌバヌゞョンをバンプせずに、実装の詳现のために動䜜を削陀できたせん。䟋 Pkg.add(...; mode = :develop)はPkg.develop(...)たす; Context!ぞのすべおのキヌワヌド匕数がサポヌトされおいたす実際には意図されおいる可胜性がありたす。

しかし、これはずにかく私の印象です。 mul!(C, A, B, α, β)はmul!(C, A, B)同じくらい公開されおいるず思いたすか

私たちはお互いを超えお話しおいるず思いたす。 私が蚀っおいるのは、私はただ別の機胜を導入する䟡倀があるずは思わないずいうこずです。 したがっお、私の前のコメントぞの私の参照。 これは、5぀の匕数mul!の非掚奚に関する説明ずは別のものです。

ただし、別の関数を远加するこずにした堎合は、5぀の匕数mul!を単に壊すのではなく、非掚奚にするのが最善だず思いたす。 もちろん、3぀の匕数mul!ほど䞀般的には䜿甚されおいたせんが、単に壊すのではなく、非掚奚にしないのはなぜですか

これは、5぀の匕数mul!の非掚奚に関する説明ずは別のものです。

コメントの最埌の段萜https://github.com/JuliaLang/julia/issues/23919#issuecomment-430952179の私の解釈は、@ simonbyrneがでした。 / 23919issuecomment -430809383は、新しい5぀の匕数関数ですが、_public API_を維持する堎合に比べお䟡倀が䜎いず考えられおいたす「名前の倉曎」ず「非掚奚」に぀いおお話したした。 そのため、5぀の匕数mul!が公開されおいるかどうかを怜蚎するこずが重芁だず思いたした。

しかし、あなたはたた、あなたが今蚀及しおいるものであるず私が思う「䜙分な機胜」を持぀こずの正圓化に぀いおも蚀及したした。 蚈算_C = AB_ず_C =αAB+βC_は十分に類䌌しおいるので、同じ名前で䞡方を説明できるず䞻匵しおいたすか 3぀の匕数mul!を䞀般化する他の方法がある可胜性があるため、私は実際には同意したせん。たずえば、_y =A₁A₂⋯Aₙx_https //github.com/JuliaLang/juliaのmul!(y, A₁, A₂, ..., Aₙ, x) / issues / 23919issuecomment -402953987

単に壊すのではなく、非掚奚にしおみたせんか

前のコメントで述べたように、5぀の匕数mul!非掚奚にするこずは、別の関数を導入する堎合に行うべき正しいこずであるこずに同意したす。 このコヌドは私のPR29634にすでに存圚したす。

C = ABずC =αAB+βCの蚈算は十分に類䌌しおいるので、同じ名前で䞡方を説明できるず䞻匵しおいたすか

はい、前者はβ=0の埌者であるためです。 muladd! / addmul!はC = αAB + βCより正確な名前であるず䞻匵するのは公正ですが、そこに到達するには、別の行列乗算関数 muladd! / addmul! たたはmul!名前を倉曎するず、今は䟡倀がないず思いたす。 もしこれが春に起こっおいたら、倉曎を怜蚎するのは簡単だったでしょう。

3぀の匕数のmulを䞀般化する他の方法がある可胜性があるので、私は実際には同意したせん

ゞュリアはたたたたαずβ匕数なしでむンプレヌス行列乗算メ゜ッドを定矩したしたが、行列乗算の䌝統は実際にはBLAS-3に基づいおおり、䞀般的な行列乗算関数はC = αAB + βC 。

mul!名前を倉曎

stdlibたたはダりンストリヌムナヌザヌモゞュヌル/コヌドで名前を倉曎するこずを意味したすか 前者の堎合は、29634でLinearAlgebraずSparseArraysの堎合すでに実行されおいるので、心配する必芁はないず思いたす。 埌者を意味するなら、私はそれが再び公の議論に垰着するず思いたす。

行列乗算の䌝統は、実際にはBLAS-3に基づいおいたす

しかし、ゞュリアはすでにBLASの呜名芏則から逞脱しおいたす。 それで、もっずわかりやすい名前を付けるのはいいこずではないでしょうか

stdlibたたはダりンストリヌムナヌザヌモゞュヌル/コヌドで名前を倉曎するこずを意味したすか

29634はmul!関数の名前を倉曎したせん。 新しい関数addmul!远加されたす。

しかし、ゞュリアはすでにBLASの呜名芏則から逞脱しおいたす。

ネヌミングに぀いお話しおいるのではありたせん。 少なくずも、Fortran 77には、関数名ずディスパッチの䞡方に関しおはないいく぀かの制限があるため、正確ではありたせん。 私は䜕が蚈算されおいるかに぀いお話しおいる。 BLAS-3の䞀般的な行列乗算関数はC = αAB + βCを蚈算し、Juliaではmul! fka A_mul_B! になっおいたす。

それで、もっずわかりやすい名前を付けるのはいいこずではないでしょうか

そうなるでしょう、そしお私はそれを数回蚀いたした。 問題は、基本的に同じこずを行う2぀の行列乗算関数が必芁になるほど良くないこずです。

29634はmul!関数の名前を倉曎したせん。 新しい関数addmul!远加されたす。

私が蚀いたかったのは、5぀の匕数mul!がaddmul!に名前が倉曎されたこずです。

問題は、基本的に同じこずを行う2぀の行列乗算関数が必芁になるほど良くないこずです。

基本的に同じかどうかは䞻芳的だず思いたす。 _C =αAB+βC_ず_Y =A₁A₂⋯AₙX_はどちらも_C = AB_の数孊的に有効な䞀般化だず思いたす。 _C =αAB+βC_が独自の䞀般化でない限り、議論は十分に匷力ではないず思いたす。 たた、BLAS APIを知っおいるかどうかにもよりたすが、それが䞀般的なJuliaナヌザヌの基本的な知識であるかどうかはわかりたせん。

たた、_C = AB_ず_C =αAB+βC_は、 Cが䜿甚されるかどうかずいう点で、蚈算䞊非垞に異なりたす。 前者の堎合は出力専甚パラメヌタ、埌者の堎合は入出力パラメヌタです。 この違いは芖芚的な手がかりに倀するず思いたす。 mul!(some_func(...), ...) 、 mul!が5぀の匕数圢匏である堎合、匕数の数を数える必芁がありたす括匧を䞀臎させる必芁があるため、関数呌び出しの結果である堎合は困難です。 some_funcが䜕らかの蚈算を行うのか、それずも単なる割り圓おを行うのかを確認したす。 addmul!堎合、 mul!(some_func(...), ...) some_funcは割り圓おのみを行うずすぐに予想できたす。

基本的に同じかどうかは䞻芳的だず思いたす。 C =αAB+βCずY =A₁A₂⋯AₙXはどちらもC = ABの数孊的に有効な䞀般化だず思いたす。 C =αAB+βCが独自の䞀般化でない限り、議論は十分に匷力ではないず思いたす。

これは䞀意の䞀般化ではないかもしれたせんが、ほが同じコストで蚈算できる䞀般化であり、他の線圢代数アルゎリズムを構築するための有甚なプリミティブを圢成したす。 倚くの堎合、さたざたな線圢代数関連のアルゎリズムを実装するずきにれロ以倖のベヌタ倀が必芁であり、垞にBLAS.gemm!にフォヌルバックする必芁がありたした。 あなたが蚀及したような他の䞀般化は、ずにかく䞭間の䞀時的なものなしでは䞀発で蚈算するこずができないので、むンプレヌスバヌゞョンははるかに有甚ではありたせん。 さらに、それらは基本的な操䜜ほど䞀般的には有甚ではありたせん。

たた、BLAS APIを知っおいるかどうかにもよりたすが、それが䞀般的なJuliaナヌザヌの基本的な知識であるかどうかはわかりたせん。

デフォルトの匕数α=1ずβ=0がただ存圚しおいる限り、3぀の匕数mul!は、BLASのバックグラりンドがなくおもJuliaナヌザヌが合理的に期埅するこずを実行したす。 より高床なオプションに぀いおは、任意の蚀語ず機胜を䜿甚する必芁があるため、マニュアルを参照する必芁がありたす。 さらに、この1回のmul!呌び出しは、 gemmだけでなく、 gemvずtrmv 奇劙なこずにαずBLAS APIのβパラメヌタおよびおそらく他の倚くのパラメヌタ。

私は、BLAS-3が蚈算の芳点から正しい䞀般化であり、非垞にうたく構成されおいるこずに同意したす。 同じ名前を䜿甚するこずを正圓化するのは「十分にナニヌク」ではないず思うずいう理由だけで、別の可胜な䞀般化を提起しおいたす。 https://github.com/JuliaLang/julia/issues/23919#issuecomment-442167056の最埌の段萜にあるoutput-onlyずinput-outputの匕数も参照しおください。 名前が違うずコヌドの読み取り/レビュヌが簡単になるず思いたす。

さらに、この単䞀のmul!呌び出しは、 gemmだけでなく、 gemvずtrmv 奇劙なこずにαずBLAS APIのβパラメヌタおよびおそらく他の倚くのパラメヌタ。

はい、すでに29634で実装されおおり、名前が決たったらそしおレビュヌを受けお準備ができおいたす

私はこの䌚話をフォロヌするのに苊劎しおいたす少し長くお広倧です...ごめんなさい、䞻芁な提案はmul!(C, A, B; α=true, β=false)ようなものですか

αずβのキヌワヌド匕数はテヌブルにないず思いたす。 たずえば、 @ andreasnoackは、 https //github.com/JuliaLang/julia/issues/23919#issuecomment-365762889でキヌワヌド匕数を华䞋したした。 @simonbyrneはhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-426881998でキヌワヌド匕数に぀いお蚀及したしたが、圌の最新の提案https://github.com/JuliaLang/julia/issues/23919#issuecomment-431046516は定䜍眮です匕数。

名前はただ決たっおいたせん぀たり、 mul! vs addmul! vs muladd! 。それが䞭心的なトピックだず思いたすたたは少なくずもそれが私の願いです。

通垞、この皮の論争をどのように解決したすか 投祚 トリアヌゞ

䞻芁な提案はmulC、A、B;α= true、β= falseのようなものですか

私はこれが奜きですが、クワヌグはありたせん。

キヌワヌドの事を芋たせんでした。 たた、Unicodeキヌワヌドを远加するこずも躊躇しおいたす。 これらのデフォルト倀を䜿甚した䜍眮匕数は問題ないず思いたす。 次の投祚に関しおは、私のものは普通のmul!です。 これはmul!䞀般化であり、新しい名前を必芁ずしないほど具䜓的で䟿利だず思いたす。

少なくずも珟時点ではデヌタを収集するために、投祚を行いたしょう。

_C =αAB+βC_のお気に入りの関数名は䜕ですか

  • +1 mul!
  • -1 addmul!
  • smile muladd!
  • tada䜕か他のもの

私には、 addmul!はAB + Cではなく(A+B)Cを説明しおいるようです。

最初はmul!に投祚し、次に操䜜を芋お、「乗算しおから加算するので、明らかにmuladd!ず呌ぶ必芁がありたす。今では呌び出すこずは考えられたせん。それがむンプレヌスであるずいう事実は、 !によっお明確に瀺され、スケヌリング郚分はキヌワヌド匕数に適しおいるようです。

乗算しおから加算するので、明らかにmuladd!ず呌ぶ必芁がありたす。

デフォルト倀β=trueを䜿甚する堎合のみですが、他の倀の堎合は、さらに䞀般的なものになりたす。 それでは、それをmul!ず呌ばないこずのポむントは䜕ですかデフォルト倀β=false以倖の倀も、より䞀般的なものを提䟛したす。 そしお、 muladd(x,y,z) = x*y + zず比范しお、匕数をどのように䞊べたすか やや混乱するでしょうね

muladd!は、そうでない堎合に説明的に聞こえるずいう欠点があるず思いたす。名前が付けられた説明は、スケヌリング郚分に぀いお蚀及するずscalemuladd!ようになりたす。

ですから、私はmul!を奜みたす。それは、期埅に぀ながらないほど説明がないからです。

そうは蚀っおも、私はLazyArrays.jl MulAddレむゞヌバヌゞョンを呌び出したす。

C  mul! の倀を䜿甚しない関数ず、それを䜿甚する関数を区別するのは良いこずなので、 mul!よりもmuladd!方が奜きです。  muladd! 。

  • 技術的には、行列の乗算です[AC] * [Bα; Iβ]たたは、以䞋のコメントを参照しおください、[αAβC] * [B; 私]
  • 〜スパヌス行列にはすでに5匕数のmul!があり、密行列の堎合も同じです〜新しい匕数ではありたせん

だから私はそれをmul!ず呌ぶこずに賛成だろう。

  • 技術的には、行列の乗算です[AC] * [Bα; Iβ]

... eltypeに可換乗算がある堎合

... eltypeが可換である堎合。

IIRC @andreasnoackゞュリアずの議論からわずか定矩gemm / gemvずy <- A * x * α + y * βそれが最も理にかなっおいるため。

@haampieそれはよく知っおいたす 29634で逆に実装したした。

これは限られた助けですが、

       C = α*A*B + β*C

これは、操䜜を衚珟するために思い぀くこずができる最善の方法です。したがっお、マクロ<strong i="8">@call</strong> C = α*A*B + β*Cたたは<strong i="10">@call_specialized</strong> ...など、これらの線に沿ったものが自然なむンタヌフェむスになりたす。これも同様の状況です。 次に、基になる関数を䜕でも呌び出すこずができたす。

@dlfivefiftyによる@ mschauerLazyArrays.jlには、構文のように5぀の匕数mul!を呌び出すための優れた構文がありたすその他。

最初に関数ベヌスのAPIを確立し、パッケヌゞの䜜成者が特殊なマトリックスのためにAPIのオヌバヌロヌドを開始できるようにする必芁があるず思いたす。 その埌、ゞュリアコミュニティはそれを呌び出すための砂糖の実隓を開始できたす。

デフォルト倀β=trueを䜿甚する堎合のみですが、他の倀の堎合は、さらに䞀般的なものになりたす。 では、それをmul!ず呌ばないこずのポむントは䜕ですかデフォルト倀β=false以倖の倀も、より䞀般的なものを提䟛したす。 そしお、 muladd(x,y,z) = x*y + zず比范しお、匕数をどのように䞊べたすか やや混乱するでしょうね

確かにそこにはある皋床のスケヌリングがありたすが、操䜜の「骚」は明らかに乗算ず加算です。 muladd眲名に䞀臎するmuladd!(A, B, C, α=true, β=false)でも問題ありたせん。 もちろん、文曞化する必芁がありたすが、それは蚀うたでもありたせん。 muladdが最初に添加剀の郚分を取りたいず思うのですが、船はその郚分で航海したした。

そしお、 muladd(x,y,z) = x*y + zず比范しお、匕数をどのように䞊べたすか やや混乱するでしょうね

これが、私がmuladd!よりもaddmul!を奜む理由です。 匕数の順序がスカラヌmuladdずは関係がないこずを確認できたす。 私はmul!よりもmuladd!方が奜きですが

ここでのFWIWは、これたでの議論の芁玄です。 私は䞭立を目指したしたが、私はプロmuladd! / addmul!なので、それを芚えおおいおください...

䞻な䞍䞀臎は、_C = AB_ず_C =αAB+βC_が埌者に新しい名前を付けるのに十分異なるかどうかです。

圌らは十分に䌌おいるので...

  1. それはBLAS-3であり、うたく構成可胜です。 したがっお、_C =αAB+βC_は_C = AB_の明らかな䞀般化ですhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-441246606、https://github.com/JuliaLang/julia/issues/ 23919issuecomment-441312375など

  2. _ " muladd!は、そうでない堎合に説明的に聞こえるずいう欠点がありたす。説明的な名前は、スケヌリング郚分に぀いお蚀及するずscalemuladd!ようになりたす。" _ --- https://github.com/ JuliaLang / julia / issues / 23919issuecomment -441819470

  3. _ "技術的には行列の乗算です[AC] * [Bα;Iβ]" _ --- https://github.com/JuliaLang/julia/issues/23919#issuecomment -441825009

圌らは十分に異なっおいるので...

  1. _C =αAB+βC_は乗算以䞊ですhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430809383、https://github.com/JuliaLang/julia/issues/23919#issuecomment-427075792、 https://github.com/JuliaLang/julia/issues/23919#issuecomment-441813176など。

  2. Y = A₁ A₂ ⋯ Aₙ Xようなmul!他の䞀般化がある可胜性がありたすhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-402953987など

  3. 入出力パラメヌタヌ匕数の数に基づいおCのデヌタを䜿甚する関数があるず混乱したすhttps://github.com/JuliaLang/julia/issues/23919#issuecomment -441267056、https//github.com/JuliaLang/julia/issues/23919#issuecomment-441824982

mul!が優れおいるもう1぀の理由は...

  1. スパヌス行列にはすでにそれがありたす。 したがっお、䞋䜍互換性に適しおいたす。 反論 5぀の匕数mul!は文曞化されおいないため、パブリックAPIず芋なす必芁はありたせん。

そしお、なぜmuladd! / addmul!が優れおいるのか...

  1. mul!ずmuladd! / addmul!別々に3぀たたは4぀の匕数の「䟿利な関数」を䜿甚できたすhttps://github.com/JuliaLang/julia/issues / 23919issuecomment-402953987、https//github.com/JuliaLang/julia/issues/23919#issuecomment-431046516など。 反論 mul!(y, A, x, 1, 1)曞くこずは、 mul!(y, A, x) https://github.com/JuliaLang/julia/issues/23919#issuecomment-430674934などず比范しおそれほど冗長ではありたせん。

客芳的な芁玄をありがずう@tkf

muladdの眲名ず䞀臎するようにmuladdA、B、C、α= true、β= falseでも問題ありたせん。

mulladd!ずいう関数の堎合、デフォルトがβ=trueになるこずを願っおいたす。 それでも、 muladdから決定されるこの匕数の順序は、 mul!(C,A,B)に関しお非垞に混乱するず思いたす。

私は間違っおいるかもしれたせんが、ほずんどの人/アプリケヌション/高氎準コヌド乗算挔算子*だけではただ満足しおいないにはmul!が必芁だず思いたす。 βCずβ=1  true などを混圚させる機胜は、行列乗算甚のBLAS APIが有効であるこずを知っおいる人々によっお、䜎レベルのコヌドで䜿甚されたす。この。 これらの人々は、 mul!䞋でこの機胜を探すず思いたす。これは、 gemm 、 gemv 、...ぞの確立されたJuliaむンタヌフェむスです。新しい名前を远加したす混乱したす反察の匕数の順序は䟡倀がないようです。 私は利益を芋るこずができたせんか

これらの人々は、 mul!䞋でこの機胜を探すず思いたす。これは、 gemm 、 gemv 、...ぞの確立されたJuliaむンタヌフェむスです。新しい名前を远加したす混乱したす反察の匕数の順序は䟡倀がないようです。 私は利益を芋るこずができたせんか

mul! docstringでmuladd!に蚀及できるので、発芋可胜性は倧きな問題ではないず思いたす。 BLASを十分に理解しおいる人は、APIを探す堎所を知っおいるでしょう。

䜍眮匕数ずキヌワヌド匕数に぀いおここではただ説明しおいたせんが、 α察角行列ずするC = αAB + βCは、スカラヌαず同じくらい効率的か぀簡単に実装できるず思いたす。 このような拡匵では、キヌワヌド匕数では䞍可胜なαの型でディスパッチできる必芁がありたす。

たた、非可換eltypeの堎合、 muladd!(α', B', A', β', C') 仮想匕数の順序を呌び出すこずにより、 C = ABα + Cβを効率的に蚈算するこずができたす。 レむゞヌラッパヌAdjoint(α)およびAdjoint(β)ディスパッチできる必芁がある堎合がありたす。 私はゞュリアで非可換数を個人的に䜿甚しないので、これはおそらく非垞に仮説的です。

このmultiply-add関数は、ラむブラリ実装者のような熟緎したプログラマヌ向けの䜎レベルAPIであるずいう@Juthoの指摘に同意したす。 このAPIでは拡匵性が優先床が高く、䜍眮的な議論が進むべき道だず思いたす。

キヌワヌド匕数を回避するためのもう1぀の匕数は、 @ andreasnoackがhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-365762889の前に蚀ったこずです。

αずβの名前も、BLASを知らない限り、あたり盎感的ではありたせん。

実際の䜿甚回数@tkfは、必ず、私の議論はかなりあるβ != 0のそれよりも小さくなりたすβ == 0 、およびそれを必芁ずする人には、これはもう少し䞀般的な芋぀けるために驚かれるこずはありたせんmul!䞋での動䜜。 したがっお、特に匕数の順序がめちゃくちゃになっおいるので少なくずもmuladd!で、これを新しい名前で分離するこずのメリットはわかりたせん。 それが新しい方法でなければならない堎合、私はaddmul!に察するあなたの議論にも共感したす。

それを必芁ずする人は、 mul!䞋でこの少し䞀般的な振る舞いを芋぀けおも驚くこずはありたせん。

私はこの点に同意したす。

したがっお、これを新しい名前で分離するこずのメリットはわかりたせん。

䜕か害が芋られない限り、他の人々が利益を芋おいるので、それは䞖界的な利益だず思いたす。

特に匕数の順序がめちゃくちゃになっおいるので少なくずもmuladd!で

私はあなたがこれを害ずしお数えるだろうず思いたす、そしお私はポむントを埗たす。 muladd! / addmul!他のメリットがより重芁だず思うだけです。

私はあなたがこれを害ずしお数えるだろうず思いたす、そしお私はポむントを埗たす。 muladd/ addmulには他にもメリットがあるず思いたす。 より重芁です。

これは、 mul!が、αずβぞの完党なアクセスを蚱可しないこずによっお制限されおいる堎合でも、乗算に関連するいく぀かのBLAS操䜜ぞの単䞀の゚ントリポむントであるずいう事実ずずもに、確かに害です。 そしお今muladd!では、匕数によっお簡単にキャプチャできる実際、BLAS APIの匕数によっおキャプチャされる芁求された操䜜のわずかな違いに応じお、2぀の異なる゚ントリポむントがありたす。 。 そもそも、BLAS APIぞのフルアクセスを提䟛しなかったのはゞュリアの間違いだったず思いたす@tkfを修正しおくれおありがずう。 それは叀い恐ろしいFortran呜名芏則にもかかわらず、私はこれらの人がなぜ圌らがこのように物事をしおいるのか知っおいたず思いたす。 しかし、同様に、この操䜜ファミリヌ぀たり、αずβによっおパラメヌタヌ化された2パラメヌタヌの操䜜ファミリヌは、BLASの堎合ず同様に、単䞀の゚ントリポむントに属しおいるず思いたす。

私の芋解で最も有効な反論は、 Cの元のデヌタにアクセスするかどうかの違いです。 しかし、ゞュリアがれロの結果を保蚌する方法ずしおfalse乗算を採甚しおいるずいう事実を考えるず、他の芁玠がNaN 、これも凊理されるず思いたす。 しかし、おそらくこの事実はよりよく䌝達/文曞化する必芁があり私が文曞を読んでからしばらく経ちたした、私も最近それに぀いお孊びたした。 そのため、KrylovKit.jlでは、任意のベクトルのようなナヌザヌタむプをれロで初期化するために、 fill!メ゜ッドの存圚が必芁です。しかし、代わりにrmul!(x,false)にするこずができるこずがわかりたした。したがっお、 fill!が実装されおいるこずを匷制する必芁はありたせん。

muladd/ addmulには他にもメリットがあるず思いたす。 より重芁です。

では、質問を逆にしたしょう。新しい方法を持぀こずのこれらの他の利点は䜕ですか もう䞀床芁玄を読みたしたが、コメントしたばかりのCにアクセスするポむントしかわかりたせん。

私は今朝劻に、手術の呜名に関しおゞュリアコミュニティで2ヶ月の長い䌚話があったず蚀いたした。 圌女はそれを「フレッド」ず呌ぶこずを提案した。 -頭字語も深い意味もありたせん。良い名前です。 圌女に代わっおこれを出すだけです。

圌女が感嘆笊を付けおくれお良かったです 😄

たず、念のため、私の懞念はほずんどコヌドの可読性にのみ起因し、曞き蟌み可胜性や発芋可胜性には起因しないこずを明確にしおおきたす。 あなたは䞀床コヌドを曞きたすが、䜕床も読みたす。

新しい方法を持぀こずのこれらの他の利点は䜕ですか

あなたがコメントしたように、私は出力察入出力パラメヌタの匕数が最も重芁だず思いたす。 しかし、これが_C =αAB+βC_が_C = AB_ず異なるず思う理由の1぀にすぎたせん。 たた、前者の衚珟が埌者の厳密な「スヌパヌセット」であるずいう意味で異なるずいう単玔な事実は、コヌド内で明確な芖芚的衚瀺が必芁だず思いたす。 別の名前は、䞭玚プログラマヌたたは少し焊点の定たらない䞊玚プログラマヌがコヌドをスキミングし、 mul!よりも奇劙なものを䜿甚しおいるこずに気付くのに圹立ちたす。

投祚をもう䞀床確認mul!からmuladd!です。 前回芋たずきはmul!が勝っおいたした。 圌らが移動する前にここにそれを蚘録したしょう笑い

  • mul! 6
  • addmul! 2
  • muladd! 8
  • 他の䜕か1

もう少し真剣に、私はただこのデヌタがmul!瀺しおいないか、 muladd!が他よりも明確であるず思いたす。  addmul!が少数掟であるこずを瀺しおいたすがsob :)

行き詰たったような気がしたす。 どうすれば先に進みたすか

代わりにgemm!ず呌んでください。

ゞェムず呌んでください 代わりに

これが冗談だず​​いいのですが...行列*ベクトルにgemm!(α, A::Matrix, x::Vector, β, y::Vector) = gemv!(α, A, x, β, y)を提案しおいない限り。

PRをマヌゞしお改善し、他のPRにmuladd!を远加するかどうかを心配できるように、今のずころスパヌス行列ですでに存圚するmul!むンタヌフェむスを残しおおくこずができたすか 

たぶん、ここの誰にずっおもすでに明らかですが、私は投祚がそうではないこずを匷調したかっただけです

  • mul! vs muladd!

だが

  • mul! vs mul!およびmuladd! 

぀たり、1぀ではなく2぀の突然倉異乗算関数を持っおいたす。

mul!を支持しお投皿したずきはい぀でも、投祚がmul!から mul!ずmuladd! に移動したようだったので、もう投皿しないこずにしたした。

しかし、私は質問がありたすか 珟圚の倚数決で、同時にmul!(C,A,B)ずmuladd!(A,B,C,α=true,β=true) 、 axpy!ずaxpby!を眮き換えるPRを準備したい堎合よりゞュリアンな名前add! 、 add!(y, x, α=true, β=true)たたはadd!(x, y, α=true, β=true) わかりやすくするために、 yは倉曎されおいたす。 たたは、他の䜕か

明らかでない堎合、 muladd!(A,B,C)は、倉曎された匕数が最初に実行されるずいう芏則に違反したす。

すでに存圚するmul!むンタヌフェヌスを残しおいただけたせんか

@jebejこの「䞋䜍互換性」の議論は広く議論されおいるず思いたす。 それでも、それは誰も玍埗させたせん䞖論調査を芋るず、それは私だけではありたせん。

他のPRにmuladd!を远加するかどうか心配ですか

パブリックAPIを壊すこずは悪いこずです。 したがっお、 mul!ず蚀うず、氞久にmul!たすただし、理論的には、LinearAlgebraはメゞャヌバヌゞョンをバンプしおAPIを砎壊する可胜性がありたす。

axpy!ずaxpby!をよりゞュリアンな名前add!に眮き換えるPRを準備したいのですが、それがadd!(y, x, α=true, β=true)たたはadd!(x, y, α=true, β=true)

@Juthoありがずう、それは玠晎らしいこずです multiply-add APIの呌び出しシグネチャを決定したら、匕数の順序を遞択するのは簡単だず思いたす。

muladd!(A,B,C)は、倉曎された匕数が最初に実行されるずいう芏則に違反したす。

@simonbyrneしかしhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-426881998ですでに述べたように、 lmul!ずldiv!最初以倖の匕数を倉曎したす。 したがっお、 muladd!(A,B,C,α,β)を遞択から陀倖する必芁はなく、この眲名のマむナス点ずしお数える必芁があるず思いたす。

ただし、「テキスト泚文」APIを䜿甚する堎合は、 muladd!(α, A, B, β, C)を䜿甚するず思いたす。

ちなみに、投祚の結果でわからないのは、 muladd!ずaddmul!の非察称性です。 C = βC + αABず曞くず、 addmul!方が自然に芋えるず思いたす。

@tkfそれはあなたが最初に行う操䜜に぀いおです。 私にずっおaddmul!は、 (A+B)Cように、最初に加算を行っおから乗算するこずを提案しおいたす。 もちろんそれは䞻芳的です。 しかし、良い名前は盎感に蚎えるはずです。

ああ、その点はわかりたす。

これはただ行き詰たっおいるので、私の提案では、関数定矩で構成される䜿甚パタヌンがありたす2番目は@callexprになりたす

@callexpr(C .= β*C + α*A*B) = implementation(C, β, α, A, B)
@callexpr(C .= β*C + A*B) = implementation(C, β, true, A, B)

そしお倚分もっずディスパッチしやすいフォヌム2番目は@callnameで行く

function @callname(β*C + A*B)(C::Number, β::Number, A::Number, B::Number)
     β*C + A*B
end

ず呌び出し

@callexpr(A .= 2*C + A*B)
@callexpr(2*3 + 3*2)

たた、 callexpr代数挔算を䞀意の関数名にマングルする方法を心配するたたは知る必芁はありたせん匕数蚘号に䟝存せず、挔算ず挔算の順序のみに䟝存したす。
私は実装に぀いお少し考えたした、そしおそれはうたくいくはずです。

@mschauerそれは興味深い方向だず思いたす。 新しい号を開くこずはできたすか 提案しおいるAPIは、他の倚くの問題を解決できたす。 解決できる問題の単䞀のむンスタンスを解決するよりも、慎重な蚭蚈プロセスを経る必芁があるず思いたす。

だから、1.1の機胜フリヌズが来週になるずいう噂を聞いた。 次のマむナヌリリヌスは「たった」4か月先ですが、1.1でリリヌスできれば本圓に嬉しいです...

ずにかく、PRをマヌゞする前に、呌び出しの眲名匕数ずキヌワヌドの順序かどうかも決定する必芁がありたす。

それでは、もう䞀床投祚しおみたしょうそれは玠晎らしい刺激物であるこずがわかったので。

_C =ABα+Cβ_にmuladd!を䜿甚する堎合、お気に入りの通話眲名は䜕ですか

  • +1 muladd!(C, A, B, α, β)
  • -1 muladd!(A, B, C, α, β)
  • smile muladd!(C, A, B; α, β) + 1のようですが、キヌワヌドargumentsbs付き
  • tada muladd!(A, B, C; α, β) -1ず同様ですが、キヌワヌド匕数付き
  • 混乱 muladd!(A, B, α, C, β)
  • heart䜕か他のもの

他のキヌワヌド匕数名​​を念頭に眮いおいる堎合は、 αずβを䜿甚しお投祚し、どの名前が優れおいるかに぀いおコメントしおください。

名前を決定しおいないので、 mul!に぀いおも決定する必芁がありたす。

_C =ABα+Cβ_にmul!を䜿甚する堎合、お気に入りの通話眲名は䜕ですか

  • +1 mul!(C, A, B, α, β)
  • -1 mul!(A, B, C, α, β)
  • smile mul!(C, A, B; α, β) + 1のようですが、キヌワヌド匕数付き
  • tada mul!(A, B, C; α, β) これは䞍可胜です
  • 混乱 mul!(A, B, α, C, β)
  • heart䜕か他のもの

泚既存のAPI mul!(C, A, B)は倉曎しおいたせん

泚既存のAPI mul!(C, A, B)は倉曎したせん

私はこの事実に十分な泚意を払っおいたせんでした—私たちはすでにmul!を持っおいたす、そしおこれはそれが意味するこずです

mul!(Y, A, B) -> Y

行列-行列たたは行列-ベクトルの積A*Bを蚈算し、結果をYに栌玍しお、既存のY倀を䞊曞きしたす。 Yは、 AたたはBいずれかで゚むリアス化しおはならないこずに泚意しおください。

それを考えるず、次のように拡匵するのは非垞に自然なこずのようです。

mul!(Y, A, B) -> Y
mul!(Y, A, B, α) -> Y
mul!(Y, A, B, α, β) -> Y

行列-行列たたは行列-ベクトル積A*Bを蚈算し、結果をYに栌玍しお、既存のY倀を䞊曞きしたす。 Yは、 AたたはBいずれかで゚むリアス化しおはならないこずに泚意しおください。 スカラヌ倀αが指定されおいる堎合、 A*B代わりにα*A*Bが蚈算されたす。 スカラヌ倀βが指定されおいる堎合、代わりにα*A*B + β*Yが蚈算されたす。 同じ゚むリアシング制限がこれらのバリアントに適甚されたす。

ただし、これには倧きな懞念があるず思いたす。少なくずもmul!(Y, A, B, C, D)がA*B*C*DをYに蚈算するのA*B*C*D自然なこずのようですが、その䞀般的な抂念は非垞にひどく衝突したすmul!(Y, A, B, α, β)コンピュヌティングα*A*B + β*C 。 さらに、 A*B*C*DをY蚈算するこずは、䞭間の割り圓おを避けお効率的に実行するこずが有甚で可胜であるず思われるので、その意味をブロックしたくありたせん。 。

mul!他の自然な䞀般化を念頭に眮いお、ここに別の考えがありたす

mul!(Y, α, A, B) # Y .= α*A*B

これは、 args掛け合わせお、 outを蚈算しお曞き蟌む、 mul!(out, args...)の䞀般的なモデルに適合したす。 αが特別な堎合ではなく、スカラヌであるこずに察凊するためにディスパッチに䟝存しおいたす。これは、乗算しおいるもう1぀のこずです。 αがスカラヌで、 A 、 B 、 Yが行列の堎合、これを非垞に効率的に行うためにBLASにディスパッチできたす。 それ以倖の堎合は、䞀般的な実装を行うこずができたす。

さらに、非可換フィヌルドクォヌタニオンなどを䜿甚しおいる堎合は、 αによるスケヌリングがどちら偎で発生するかを制埡できたす。 mul!(Y, A, B, α)はαでスケヌリングしたす。巊ではなく右

mul!(Y, A, B, α) # Y .= A*B*α

はい、クォヌタニオンに察しおBLASを呌び出すこずはできたせんが、それは䞀般的であり、おそらくそれでもかなり効率的に行うこずができたすおそらく、䜕らかの方法でBLAS呌び出しに倉換するこずさえできたす。

Y .= α*A*Bに察するそのアプロヌチを想定するず、次の質問は次のようになりたす。 Yスケヌリングずむンクリメント

mul!((β, Y), α, A, B) # Y .= β*Y .+ α*A*B

少し奇劙ですが、動䜜したす。 たた、非可換フィヌルドでは、次のように、右偎のYにβを掛けるように䟝頌できたす。

mul!((Y, β), α, A, B) # Y .= Y*β .+ α*A*B

非可換分野での完党な䞀般性では、次のように巊右䞡方でスケヌリングできたす。

mul!((β₁, Y, β₂), α₁, A, B, α₂) # Y .= β₁*Y*β₂ + α₁*A*B*α₂

もちろん、これは少し奇劙で、これに察するBLAS操䜜はありたせんが、GEMMの䞀般化であり、倚くのこずを衚珟でき、厄介なif / elseを実行するこずなくBLAS操䜜に簡単にディスパッチできたす。ブランチ。

基になるAPI呌び出しずしお@StefanKarpinskiの提案が本圓に奜き

@affine! Y = β₁*Y*β₂ + α₁*A*B*α₂

基瀎ずなる関数は、 @ StefanKarpinskiが提案するようなものになりたす。

しかし、ここでさらに進む必芁がありたす。 そのためのAPIずゞェネリック関数を䜜成すれば、誰かがそれを効率的に実行するJuliaラむブラリを䜜成するず本圓に思いたす。したがっお、ここでBLASに固執するべきではないこずに同意したす。 MatrixChainMultiply.jlのようなものは、すでに耇数の行列蚈算甚のDSLを構築しおおり、DiffEqはアフィン挔算子匏を䜿甚しお独自のこずを行っおいたす。 Baseにアフィン匏の衚珟が1぀しかない堎合は、すべおの䜜業を同じものに定矩できたす。

@dlfivefiftyは以前に怠惰な線圢代数を調べたしたが、それは本圓にここで埩掻する必芁があるず思いたす。 ブロヌドキャストの遅延衚珟を構築するこずは、芁玠ごずの操䜜を抜象配列および代替の蚈算ハヌドりェアで機胜させるために重芁でした。 線圢代数にも同じこずが必芁です。 線圢代数匏の衚珟により、Julia BLASからその堎で新しいBLASカヌネルを定矩したり、方皋匏をGPU / TPUに転送したりできたす。

本質的に、科孊蚈算におけるすべおの蚈算は、芁玠ごずの線圢代数挔算に芁玄されるため、䞡方の高レベルの蚘述を持぀こずは、メタプログラミングしお新しい蚭蚈を探玢するためのツヌルを構築するのに圹立぀ようです。

この提案に぀いおもっず考える必芁がありたすが、今のずころ、䞀時的なものなしでA*B*Cを蚈算したくないず思うずコメントしたす。 䞀時的なものを避けるために、倚くの算術挔算で支払う必芁があるように私には思えたす。

䞀時的なものなしでA*B*Cを蚈算したいずは思わない。

ただし、 mul!堎合、すでに出力配列がありたす。 それが圹立぀かどうかはわかりたせん。 いずれにせよ、それは実装の詳现のようです。 API mul!(Y, A, B, C...)は、蚈算したいものを衚珟し、実装がそれを行うための最良の方法を遞択できるようにしたす。これがここでの䞀般的な目暙でした。

基になるAPI呌び出しずしお@StefanKarpinskiの提案が本圓に奜き

@ChrisRackauckas 怠惰、必芁な蚈算を蚘述し、ある皮の最適化パスに、最適化の方法を知っおいる特定の代数パタヌンに䞀臎する郚分を遞択させるなど、倖郚パッケヌゞで調査できるこずず調査する必芁があるこずを考えたす。このようにmul!を䜿甚するこずは、このレベルで必芁な、䞀般的でありながら理解しやすい操䜜のように思えたす。

mul!(Y, α, A, B)に぀いおは、実際の議論はないこずに泚意しおください。他に䜕を意味するので、 Y .= α*A*B意味する必芁がありたす。 したがっお、私にずっおここでの唯䞀の未解決の質問は、行列ず巊および/たたは右のスカラヌを持぀タプルを䜿甚するこずが、出力配列をむンクリメントおよびスケヌリングするこずを衚珟するための合理的な方法であるかどうかです。 䞀般的なケヌスは次のずおりです。

  1. mul!(Y::Matrx, args...)  Y .= *(args...)
  2. mul!((β, Y)::{Number, Matrix}, args...)  Y .= β*Y + *(args...)
  3. mul!((Y, β)::{Matrix, Number}, args...)  Y .= Y*β + *(args...)
  4. mul!((β₁, Y, β₂)::{Number, Matrix, Number}, args...)  Y .= β₁*Y*β₂ + *(args...)

最初の匕数には他に䜕も蚱可されたせん。 これは、オプションでスケヌリングず組み合わせお、出力配列に䞊曞きたたは环積するこずが理にかなっおいる他の操䜜のより䞀般的な芏則ずしお採甚できたす。

mul!(out, args...)ずGEMMのようなむンタヌフェヌスを「マヌゞ」するこずは私には思い浮かびたせん

しかし、私の心配は、オヌバヌロヌドむンタヌフェむスずしお䜿いやすいかどうかです。 ネストされたタプルに察しお適切に機胜するには、型システムに䟝存する必芁がありたす。 ネストされたタプルは、Juliaの型システムのフラットタプルず同じように機胜したすか 「 Tuple{Tuple{A1,B1},C1,D1} Tuple{A1,B1,C1,D1}がTuple{A2,B2,C2,D2}よりも具䜓的である堎合、 Tuple{Tuple{A1,B1},C1,D1}はTuple{Tuple{A2,B2},C2,D2}よりも具䜓的である」のようなものが圓おはたるのではないかず思いたす。 そうしないず、オヌバヌロヌドAPIずしお䜿甚するのが難しいでしょう。

耇玠行列の再解釈ハックを䜿甚するには、スカラヌ型をディスパッチする必芁があるこずに泚意しおくださいこれはPR29634からのものなので、関数名に泚意を払わないでください。

https://github.com/JuliaLang/julia/blob/fae1a7a3ae646c7ea1c08​​982976b57096fb0ae8d/stdlib/LinearAlgebra/src/matmul.jl#L157 -L169

もう1぀の懞念は、これが蚈算グラプグれキュヌタのむンタヌフェむスに倚少制限があるこずです。 multiply-addむンタヌフェヌスの䞻な目的は、ラむブラリの実装者が効率的に実装できる小さな再利甚可胜な蚈算カヌネルを定矩できるようにするオヌバヌロヌドAPIを提䟛するこずだず思いたす。 これは、_C =ABα_のみを実装でき、たずえば_αAB_は実装できないこずを意味したすhttps://github.com/JuliaLang/julia/pull/29634#issuecomment-443103667を参照。 非可換eltypeに察しお_α₁ABα₂_をサポヌトするには、䞀時配列たたは算術挔算の数を増やす必芁がありたす。 1人のナヌザヌがどちらを望んでいるかは明確ではなく、理想的にはこれを構成可胜にする必芁がありたす。 この時点で、実行メカニズムから分離された蚈算グラフ衚珟が必芁です。 これは、倖郚パッケヌゞLazyArrays.jl、MappedArrays.jlなどで調べる方がよいず思いたす。 ただし、ある時点でほずんどのナヌスケヌスをカバヌする実装戊略を芋぀けるこずができれば、メむンの゚ントリポむントずしおmul!を䜿甚するこずは理にかなっおいたす。 これが実際にmuladd!を支持するもう1぀の理由だず思いたす。 将来の呌び出しAPI甚にスペヌスを割り圓おたす。

私はこの提案に぀いおもっず考える必芁があるだろうけど、今のずころ、私はちょうど私があなたが䞀時的になしA B Cを蚈算したいずは思わないこずをコメントしたす。 䞀時的なものを避けるために、倚くの算術挔算で支払う必芁があるように私には思えたす。

確かに、任意の数のテン゜ルの収瞮を蚌明できたす。党䜓を評䟡する最も効率的な方法は、垞にペアワむズ収瞮を䜿甚するこずです。 したがっお、いく぀かの行列を乗算するこずは、その特殊なケヌスにすぎたせん。ペアごずに乗算する必芁がありたすもちろん、最良の順序は重芁な問題です。 そのため、 mul!(Y,X1,X2,X3...)はそれほど有甚なプリミティブではないず思いたす。 そしお最終的には、それがmul!だず私は思いたす。これは、開発者が特定のタむプに察しおオヌバヌロヌドできる基本的な操䜜です。 次に、マクロを䜿甚するなど、より高レベルの構造を䜿甚しお、より耇雑な操䜜を蚘述できたす。たずえば、蚈算グラフを䜜成したす。これは、最終的にmul!などのプリミティブ操䜜を呌び出すこずによっお評䟡されたす。 もちろん、そのプリミティブは、 @ StefanKarpinskiが蚀及しおいる非可換のようなケヌスを含めるのに十分䞀般的である可胜性がありたす。

行列の乗算/テン゜ルの瞮玄が含たれない限り、プリミティブ挔算の芳点から考えるこずはそれほど有甚ではなく、攟送のようにすべおを融合するこずが有益である可胜性があるこずは事実です。

䞀般に、Baseにデフォルトの遅延衚珟/蚈算グラフタむプがあるずよいこずに同意したすが、 mul!がそれを構築する方法ではないず思いたす。

@tkf 

しかし、私の心配は、オヌバヌロヌドむンタヌフェむスずしお䜿いやすいかどうかです。 ネストされたタプルに察しお適切に機胜するには、型システムに䟝存する必芁がありたす。 ネストされたタプルは、Juliaの型システムのフラットタプルず同じように機胜したすか

はい、私たちは皆その面で良いです。 ネストがどこに入るのかはわかりたせんが、タプルでいく぀かのものを枡すこずは、すべおを即時匕数ずしお枡すのず同じくらい効率的です。たったく同じ方法で実装されたす。

これは、_C =ABα_のみを実装でき、たずえば_αAB_は実装できないこずを意味したす。

私は混乱しおいたす...あなたはmul!(C, A, B, α)ずmul!(C, α, A, B)を曞くこずができたす。 mul!(C, α₁, A, α₂, B, α₃)曞くこずもできたす。 これは、これたでに提案された䞭で最も柔軟な汎甚行列乗算APIのようです。

もう1぀の懞念は、これが蚈算グラプグれキュヌタのむンタヌフェむスに倚少制限があるこずです。 multiply-addむンタヌフェヌスの䞻な目的は、ラむブラリの実装者が効率的に実装できる小さな再利甚可胜な蚈算カヌネルを定矩できるようにするオヌバヌロヌドAPIを提䟛するこずだず思いたす。

この時点で、実行メカニズムから分離された蚈算グラフ衚珟が必芁です。

それは事実かもしれたせんが、これはそのための堎所ではありたせん。倖郚パッケヌゞで開発するこずができ、開発する必芁がありたす。 この特定の問題を解決するために必芁なのは、BLAS操䜜にディスパッチできるものを䞀般化する行列乗算APIだけです。これは、これが行うこずずほが同じです。

@Jutho

したがっお、いく぀かの行列を乗算するこずは、その特殊なケヌスにすぎたせん。ペアごずに乗算する必芁がありたすもちろん、最良の順序は重芁な問題です。 そのため、 mul!(Y,X1,X2,X3...)はそれほど有甚なプリミティブではないず思いたす。

mul!挔算を䜿甚するず、実装で乗算の順序を遞択できたす。これは䟿利なプロパティです。 実際、それを実行できる可胜性があるため、 *操䜜を最初にn項ずしお解析したした。同じ理由が、 mul!を䜿甚しおいる堎合は、さらに圓おはたりたす。 、おそらくパフォヌマンスに十分気を配っおいたす。

䞀般的に、 mul!提案に賛成か反察かはわかりたせん。

ネストがどこに来るのかわかりたせんが、タプルでいく぀かのものを枡すこずは、それらすべおを即時の匕数ずしお枡すのず同じくらい効率的です

珟圚のLinearAlgebraでさえやや壊れやすいので、効率に぀いおは心配しおいたせんでしたが、ディスパッチずメ゜ッドのあいたいさを心配しおいたしたこれは、型システムに぀いおの理解が䞍足しおいるためかもしれたせん。時々驚かされたす。 メ゜ッドの解決はすべおの䜍眮匕数のタプルタむプを亀差させるこずによっお行われるず思ったので、ネストされたタプルに぀いお蚀及しおいたした。 それはあなたに平らなタプルを䞎えたす。 最初の匕数でタプルを䜿甚する堎合、ネストされたタプルがありたす。

これは、_C =ABα_のみを実装でき、たずえば_αAB_は実装できないこずを意味したす。

私は混乱しおいたす...あなたはmul!(C, A, B, α)ずmul!(C, α, A, B)を曞くこずができたす。

「_C =ABα_は_C = AB_ず、_αAB_のような他の候補は行列タむプのすべおの組み合わせで効率的に実装できるわけではありたせん」ず蚀いたいのです。 効率ずは、O時間の耇雑さが倧きいこずを意味したす。これが実際に圓おはたるかどうかは定かではありたせんが、少なくずもスパヌス行列の堎合、他の2぀のオプションはありたせん。

この時点で、実行メカニズムから分離された蚈算グラフ衚珟が必芁です。

それは事実かもしれたせんが、これはそのための堎所ではありたせん。倖郚パッケヌゞで開発するこずができ、開発する必芁がありたす。

それがたさに私のポむントです。 このAPIを、そのような䜿甚法の最小限の構成芁玠ず芋なすこずをお勧めしたすもちろん、それがすべおの目的ではありたせん。 vararg mul!実装ず蚭蚈は、人々が倖郚パッケヌゞの蚭蚈空間を調査した埌に行うこずができたす。

珟圚のmul!でさえ、型のディスパッチはすでに「壊れおいたす」。 SubArrayやAdjointなどの構成可胜な配列型を操䜜するために必芁なあいたいさのオヌバヌラむドの組み合わせが増えおいたす。

解決策は特性を䜿甚するこずであり、LazyArrays.jlには特性を備えたmul!の抂念実蚌バヌゞョンがありたす。

しかし、これはAPIずいうよりも実装に関する議論です。 しかし、タプルを䜿甚しお甚語をグルヌプ化するのは間違っおいるず感じたす。これは、型システムの目的ではありたせんか その堎合、LazyArrays.jl゜リュヌションに到達したす。

マル 操䜜により、実装は乗算の順序を遞択できたす。これは䟿利なプロパティです。 確かに、それを実行できる可胜性があるため、最初に*操䜜をn項ずしお解析し、同じ理由がmulにも圓おはたりたす。 それを䜿甚しおいる堎合は、おそらくパフォヌマンスに十分気を配っおいるので。

*がn aryずしお解析されるこずは非垞に䟿利です。 TensorOperations.jlでこれを䜿甚しお、 @tensoroptマクロを実装したす。これにより、実際に収瞮順序が最適化されたす。 n aryバヌゞョンのmul!有甚性が䜎いず思うのは、効率の芳点から、結果を配眮するための事前に割り圓おられた堎所を提䟛するこずにほずんど意味がないためです。配列は関数内で割り圓おおからgcする必芁がありたす。 実際、TensorOperations.jlでは、倧芏暡な䞀時的な割り圓おが、Juliaのgcのパフォヌマンスが非垞に悪い堎所の1぀であるこずに気付いた人が䜕人かいたすgc時間が50になるこずがよくありたす。

したがっお、私が正しく理解しおいれば、 @ tkfによっおも提唱されおmul!を真にプリミティブな挔算に制限したす。2぀の行列を3番目の行列に乗算し、堎合によっおはスカラヌ係数を䜿甚したす。 はい、非可換代数に察しおこれを行う最も䞀般的な方法を考えるこずができたすが、今のずころ、圓面の必芁性は、ゞュリアのmul! BLASgemm、gemv、...によっお提䟛される機胜ぞの䟿利なアクセスであるず思いたす。

タプルを䜿甚した提案は嫌いではありたせんが、混乱が生じる可胜性がありたす。
ケヌス4からケヌス2/3に制限するず、デフォルト倀β₁ = 1ずβ₂ = 1 たたは実際にはtrue を意味するようです。 しかし、どちらも指定されおいない堎合は、突然β₁ = β₂ = 0  false を意味したす。 確かに、 mul!((Y,), args...)ではなくmul!(Y, args...)ず曞くので、構文は少し異なりたす。 結局、それはドキュメントの問題なので、私はこれを指摘したかっただけです。

芁玄するず、私はこの構文に実際に反察しおいるわけではありたせんが、これは導入されおいる新しいタむプのパラダむムであり、おそらく他の堎所でも埓う必芁がありたす。 私が反察しおいるのは、これを任意の数の行列の乗算に䞀般化したいずいうこずです。これは、䞊で論じたように、の利点がわかりたせん。

@dlfivefifty しかし、これはAPIずいうよりも実装に関する議論です。 しかし、タプルを䜿甚しお甚語をグルヌプ化するのは間違っおいるず感じたす。これは、型システムの目的ではありたせんか その堎合、LazyArrays.jl゜リュヌションに到達したす。

ただし、ここでは完党なレむゞヌ配列を䜿甚する぀もりはありたせん。そのためのLazyArrayはすでに存圚したす。 䞀方、スケヌリングYを衚珟する方法が必芁です。 タプルを䜿甚するこずは、その少量の構造を衚珟するための単玔で軜量なアプロヌチのように思えたす。 他に䜕か提案はありたすか β₁ずβ₂にlscaleやrscaleキヌワヌドを蚭定するこずもできたすが、それ以䞊の゚レガントさは感じられず、それをディスパッチしたす。これは重芁ではありたせんが、持っおおくず䟿利です。

@Jutho したがっお、私が正しく理解しおいれば、 @ tkfによっおも提唱されおmul!を真にプリミティブな挔算に制限したす。2぀の行列を3番目の行列に乗算し、おそらくスカラヌ係数を䜿甚したす。 はい、非可換代数に察しおこれを行う最も䞀般的な方法を考えるこずができたすが、今のずころ、圓面の必芁性は、ゞュリアのmul! BLASgemm、gemv、...によっお提䟛される機胜ぞの䟿利なアクセスであるず思いたす。

mul!の操䜜の小さなサブセット、おそらく有効なBLAS呌び出しに構造的に察応するものだけを定矩するだけで問題ありたせん。 それは次のようになりたす。

# gemm: alpha = 1.0, beta = 0.0
mul!(Y::Matrix, A::Matrix, B::Matrix) # gemm! Y, A

# gemm: alpha = α, beta = 0.0 (these all do the same thing for BLAS types)
mul!(Y::Matrix, α::Number, A::Matrix, B::Matrix)
mul!(Y::Matrix, A::Matrix, α::Number, B::Matrix)
mul!(Y::Matrix, A::Matrix, B::Matrix, α::Number)

# gemm: alpha = α, beta = β (these all do the same thing for BLAS types)
mul!((β::Number, Y::Matrix), α::Number, A::Matrix, B::Matrix)
mul!((β::Number, Y::Matrix), A::Matrix, α::Number, B::Matrix)
mul!((β::Number, Y::Matrix), A::Matrix, B::Matrix, α::Number)
mul!((Y::Matrix, β::Number), α::Number, A::Matrix, B::Matrix)
mul!((Y::Matrix, β::Number), A::Matrix, α::Number, B::Matrix)
mul!((Y::Matrix, β::Number), A::Matrix, B::Matrix, α::Number)

# gemm: alpha = α, beta = β₁*β₂ (these all do the same thing for BLAS types)
mul!((β₁::Number, Y::Matrix, β₂::Number), α::Number, A::Matrix, B::Matrix)
mul!((β₁::Number, Y::Matrix, β₂::Number), A::Matrix, α::Number, B::Matrix)
mul!((β₁::Number, Y::Matrix, β₂::Number), A::Matrix, B::Matrix, α::Number)

䜕のために なぜBLAS操䜜の衚珟方法にそれほど倚くのバリ゚ヌションを蚱可するのですか

  1. それは人々が圌らの意図を衚珟するこずを可胜にするので—意図が巊たたは右たたは䞡方で乗算するこずであるならば、なぜ人々がそれを衚珟しお正しい実装を遞択するこずを蚱可したせんか

  2. 非可換芁玠タむプに察しおも正しいこずを行う䞀般的なフォヌルバックを持぀こずができたす。

この問題の芁点は、gemmを含むむンプレヌス行列乗算を䞀般化するこずです。 gemmよりも䞀般的です。 それ以倖の堎合は、 gemm!を曞き続けおみたせんか

ただし、ここでは完党なレむゞヌ配列を䜿甚する぀もりはありたせん。

「完党なレむゞヌ配列」ず蚀っおいるのではなく、コンパむル時に最終的に削陀されるBroadcastedず同じ意味でレむゞヌを提案しおいたす。 基本的に、関数の怠惰なアプリケヌションを衚すためにAppliedを远加し、タプルコンテキストを含たないを䜿甚する代わりに、次のようなものを䜜成したす。

materialize!(applied(+, applied(*, α, A, B), applied(*, β, C)))

これは、攟送の.*衚蚘のように砂糖でコヌティングしお読みやすくするこずができたすが、タプルベヌスの提案ずは異なり、これは䜕が必芁かをすぐに明確にするず思いたす。

@StefanKarpinskiは、前に述べたように、

mul!((β₁::Number, Y::Matrix, β₂::Number), α₁::Number, A::Matrix, α₂::Number, B::Matrix, α₃::Number)

そしお、そのすべおの瞮小バヌゞョン、぀たり、5぀のスカラヌ匕数のすべおが存圚しない可胜性がある堎合、それは2 ^ 5 = 32の異なる可胜性です。 そしお、これはさたざたな行列たたはベクトルのすべおの可胜性ず組み合わされたす。

攟送のようなアプロヌチがより実珟可胜であるずいう@dlfivefiftyに同意したす。

はい、私はいく぀かのオプションを省略しおいるこずに気づきたしたが、32のメ゜ッドは私にはそれほどクレむゞヌではないようです。結局、それらを手で曞く必芁はありたせん。 materialize!(applied(+, applied(*, α, A, B), applied(*, β, C)))蚘述できる「ブロヌドキャストのようなシステム」たたは遅延評䟡システムを远加するこずは、はるかに倧きな远加であり、この問題の範囲倖のgemm!盎接電話をかけ続けるこずを蚱可する傟向がありたす。

はい、それはおそらく本圓です。 デフォルトを簡単に提䟛するために、スカラヌ匕数を埌ろに眮く方が簡単だず思いたした。 しかし、いく぀かの@evalメタプログラミングを䜿甚しお、32の定矩すべおを簡単に生成できる堎合、それは同様に優れおいたす。 ご存知のずおり、 mulはgemm!だけでなく、 gemvずtrmmなどにもなりたす。

それは単なるBLASラッパヌではないこずを付け加えおおきたす。 stdlibには、他にも玔粋なJuliaに特化したメ゜ッドがありたす。 たた、これをオヌバヌロヌドAPIずしお䜿甚するこずも重芁です。パッケヌゞの䜜成者は、特別な行列タむプに察しおmul!を定矩できたす。

これが私のスタンスだず思いたす。

  1. mul!(C, A, B, a, b)はすでにSparseArrays.jlに存圚するため、今すぐサポヌトするこずもできたす。
  2. マトリックスタむプでのディスパッチは適切にスケヌリングされないため、他に䜕もするべきではありたせん。 BandedMatrices.jl、BlockArrays.jl、LowRankApprox.jlなどのメンテナヌずしお。経隓からそれを述べるこずができたす。
  3. 特性ベヌスの蚭蚈は適切に拡匵できたすが、蚭蚈パタヌンがすでに確立されおいるため、オヌルむンしおAppliedようなブロヌドキャストを行うのが最善です。 これはJulia2.0たで埅たなければならず、私のニヌズに合ったプロトタむプがLazyArrays.jlで開発され続けおいたす。

あなたがの曖昧さ回避の難しさだず思いたすか@dlfivefifty mul!((Y, β), α, A, B) APIは、のように等しく、 mul!(Y, A, B, α, β)  Transposeなどのマトリックスラッパヌを考慮するず、難易床が高くなりたす

  1. mul!(C, A, B, a, b)はすでにSparseArrays.jlに存圚するため、今すぐサポヌトするこずもできたす。

誰かがmul!(C, A, B, a, b)がC .= b*C + a*A*Bを意味するこずを完党に考えずに決定したずいう事実は、これを倍増する正圓な理由ではないこずを匷調したす。 mul!が*むンプレヌスバヌゞョンである堎合、 mul!(out, args...)がout .= *(args...)以倖の意味をどのように意味するのかわかりたせん。 率盎に蚀っお、これは、歎史的な偶然によっおのみ存圚する、よく考えられおいない、䞀貫性のないAPIの混乱であるシステムになっおしたう方法です。 mul!関数はSparseArraysから゚クスポヌトされおおらず、その特定のメ゜ッドは文曞化されおいないため、これは、関数がなかったために远加されたず思われる、思いがけないメ゜ッドを定着させる最も簡単な理由です。公開しおいたせん その間違いを元に戻し、代わりにmul!メ゜ッドを削陀/名前倉曎するこずを提案したす。

この議論の残りの郚分から、すべおの利害関係者が暙準ラむブラリの倖で特性や怠惰でもっず凝ったこずをしたいので、他に䜕もすべきではないように思えたす。 物を削陀するのはい぀でもいいので、私はそれで倧䞈倫です。

この議論の残りの郚分から、すべおの利害関係者が暙準ラむブラリの倖で特性や怠惰でもっず凝ったこずをしたいので、他に䜕もすべきではないように思えたす。 物を削陀するのはい぀でもいいので、私はそれで倧䞈倫です。

あなたは少しうんざりしおいるようです、それは理解できたす。 しかし、結論は真実ではないず思いたす。 珟圚の提案がスケヌラブルな方法で実装でき、パッケヌゞ開発者が独自のマトリックスおよびベクトルタむプ@tkfで蚀及の定矩をオヌバヌロヌドするのに䟿利であるず確信しおいる堎合、それは玠晎らしい方法です。フォワヌド。

特に、パッケヌゞ開発者は以䞋を実装するだけでよいず思いたす。

mul!((β₁, Y::MyVecOrMat, β₂), α₁, A::MyMat, α₂, B:: MyVecOrMat, α₃)

そしお倚分、䟋えば、

mul!((β₁, Y::MyVecOrMat, β₂), α₁, A::Adjoint{<:MyMat}, α₂, B:: MyVecOrMat, α₃)
...

Julia Baseずいうより、LinearAlgebra暙準ラむブラリがすべおのデフォルト倀などを凊理したす。

パッケヌゞ開発者は以䞋を実装するだけでよいず思いたす。

mul!((β₁, Y::MyVecOrMat, β₂), α₁, A::MyMat, α₂, B:: MyVecOrMat, α₃)

文曞化するこずをお勧めしたす

mul!((Y, β), A, B, α)

オヌバヌロヌドされる眲名ずしお。 これは、 α他の堎所によっお、O時間の倧きな耇雑さが倉わるためです。 https://github.com/JuliaLang/julia/pull/29634#issuecomment-443103667を参照しお

@StefanKarpinskiのアプロヌチに぀いお私が気に入っおいるこずの1぀は、時間蚈算量を倉曎せずに、 A _some_行列タむプたずえば、 Adjoint{_,<:SparseMatrixCSC} に察しおmul!((Y, β), α::Diagonal, A, B)特殊なメ゜ッドを実装できるこずです。 。 これは私のアプリケヌションにずっお重芁です。もちろん、この方法を䜿甚するには、特に特殊なメ゜ッドの存圚を照䌚する方法に぀いお、APIでさらに議論する必芁がありたす。 それでも、APIを拡匵する機䌚を持぀こずは玠晎らしいこずです。

誰かがメ゜ッドのあいたいさに぀いおの私の心配を明らかにした堎合、私はすべおタプルごずのアプロヌチになりたす。

これは、αの他の堎所が倧きなO時間蚈算量を倉曎するためです。

これは特にスパヌス行列ですか 特に密行列の堎合は特にそうではありたせん。 リンク先の実装では、 αがAずB間にある堎合を瀺しおいたすか

パッケヌゞ開発者は実装するだけでよいず思いたす...

これは非垞に単玔化されおいたす。 BlockArrays.jlのPseudoBlockMatrixように、ストラむド行列のように動䜜する行列があるずしたす。 gemm!を完党にサポヌトするには、 PseudoBlockMatrixすべおの順列を1自䜓、2 StridedMatrix 、3 Adjoint自䜓でオヌバヌラむドする必芁がありたす。 、4 Transposeのそれ自䜓、5 AdjointのStridedMatrix 、6 TransposeのStridedMatrix 、そしおおそらく他の人。 これはすでに6 ^ 3 = 216の異なる組み合わせです。 次に、 trmm!をサポヌトする必芁があり、 UpperTriangular 、 UnitUpperTriangular 、それらの随䌎、それらの転眮などで同じこずを行う必芁がありたす。 次に、 gsmm!ずSymmetricおよびHermitian 。

しかし、倚くのアプリケヌションでは、マトリックスだけでなく、それらのサブビュヌも凊理する必芁がありたす。特に、ブロックを凊理するブロックマトリックスの堎合はそうです。 次に、䞊蚘の6぀の組み合わせずずもに、マトリックスのビュヌのすべおのパヌミュレヌションを远加する必芁がありたす。

これで、非垞に耇雑な共甚䜓型であるStridedMatrixを含む、䜕千ものオヌバヌラむドがありたす。 これはコンパむラにずっおは倚すぎるため、 using時間は数秒ではなく数分になりたす。

この時点で、珟圚のmul! 、ひいおは提案されおいるmul!拡匵機胜には蚭蚈䞊の欠陥があるため、パッケヌゞ開発者は気にしないでください。 幞い、LazyArrays.jlは、特性を䜿甚した䞀時的な回避策を提䟛したす。

ですから、 @ StefanKarpinskiは、より実質的な再蚭蚈が行われるたで、物事をそのたたにしおおくこずに同意したす。蚭蚈に欠陥のあるものに劎力を費やすこずは、誰にずっおも時間の無駄です。

@ dlfivefifty 、私はスカラヌ匕数がどのように凊理されるかに぀いおのみ蚀及しおいたした。 もちろん、珟圚mul!(C,A,B)すでに存圚するさたざたなマトリックスタむプの耇雑さはすべお残りたす。

これは、αの他の堎所が倧きなO時間蚈算量を倉曎するためです。

これは特にスパヌス行列ですか 特に密行列の堎合は特にそうではありたせん。 リンク先の実装では、 αがAずB間にある堎合を瀺しおいたすか

@Jutho䞀般的に、 αを最も内偎のルヌプ䜍眮に配眮するこずはできないず思いたす。 たずえば、この堎合、 α₁*A*B*α₃はサポヌトできたすが、 A*α₂*Bはサポヌトできたせん。

https://github.com/JuliaLang/julia/blob/11c5680d5620b0b64420055e8474a2b8cf757010/stdlib/LinearAlgebra/src/matmul.jl#L661 -L670

私は、少なくずも考えるα₁たたはα₂でα₁*A*α₂*B*α₃しなければなら1挞近的時間蚈算量の増加を避けるために。

@dlfivefiftyしかし、LazyArrays.jlでさえ、ディスパッチするためにいく぀かのプリミティブ関数が必芁ですよね 私の理解では、それは「ディスパッチ地獄」を解決したすが、人々が実装しなければならない蚈算「カヌネル」の数を枛らすこずはありたせん。

いいえ、 Broadcasted 「プリミティブ」がないのず同じように、「プリミティブ」はありたせん。 しかし、珟時点では、「カヌネル」の問題は解決されおいたせん。 次のステップは、 ApplyStyle怠惰なAppliedタむプを䜿甚するように再蚭蚈するこずだず思いたす。 次に、順序が重芁ではない方法で、BLASのような操䜜を認識するためのMulAddStyleが存圚する可胜性がありたす。

materialize!たたはcopyto!をプリミティブず呌びたす。 少なくずも、それはブロヌドキャストメカニズムの構成芁玠です。 同様に、LazyArrays.jlは、ある時点で、その遅延衚珟をルヌプのある関数に、たたはccallを倖郚ラむブラリに䞋げる必芁があるず思いたす。 そのような関数の名前がmul!だずしたら、それは悪いこずでしょうか

これは非垞に単玔化されおいたす。 BlockArrays.jlのPseudoBlockMatrixなど、ストラむド行列のように動䜜する行列があるずしたす。 gemmを完党にサポヌトするために PseudoBlockMatrixのすべおの順列を、1それ自䜓、2StridedMatrix、3それ自䜓の随䌎、4それ自䜓の転眮、5StridedMatrixの随䌎、6StridedMatrixの転眮、および堎合によっおは他のものでオヌバヌラむドする必芁がありたす。 。 これはすでに6 ^ 3 = 216の異なる組み合わせです。 次に、trmmをサポヌトしたいず思いたす そしお、UpperTriangular、UnitUpperTriangular、それらの随䌎、それらの転眮などでも同じこずをしなければなりたせん。 それならgsmm 察称および゚ルミヌトで。
しかし、倚くのアプリケヌションでは、マトリックスだけでなく、それらのサブビュヌも凊理する必芁がありたす。特に、ブロックを凊理するブロックマトリックスの堎合はそうです。 次に、䞊蚘の6぀の組み合わせずずもに、マトリックスのビュヌのすべおのパヌミュレヌションを远加する必芁がありたす。
これで、非垞に耇雑な共甚䜓型であるStridedMatrixを含む、䜕千ものオヌバヌラむドがありたす。 これはコンパむラにずっおは倚すぎるため、䜿甚時間は数秒ではなく数分になりたす。

私は確かに、珟圚のStridedArray型の共甚䜓が䞻芁な蚭蚈䞊の欠陥であるこずに同意したす。 ある時点でこれを修正するあなたの詊みを支持したした。

Strided.jlでは、関係するすべおの行列が独自のカスタム型(Abstract)StridedViewである堎合にのみ、 mul!実装したす。A、B、Cの型に混合がある堎合は垞に、Juliaに任せたす。 Base / LinearAlgebraがこれを凊理したす。 もちろん、これは@stridedマクロ環境で䜿甚され、可胜なすべおのBaseタむプをStridedViewタむプに倉換しようずしたす。 ここで、 StridedViewは、サブビュヌ、転眮ず随䌎、および特定の圢状倉曎をすべお同じパラメトリックタむプで衚すこずができたす。 党䜓ずしお、完党な乗算コヌドは玄100行です。
https://github.com/Jutho/Strided.jl/blob/master/src/abstractstridedview.jl#L46 -L147
BLASが適甚されない堎合のネむティブのJuliaフォヌルバックは、そのパッケヌゞによっお提䟛されるより䞀般的なmapreducedim!機胜を䜿甚しお実装され、 LinearAlgebraものよりも効率的です。 しかし、それはマルチスレッドでもありたす。

挞近的な時間蚈算量の増加を避けるために、 α₁*A*α₂*B*α₃少なくずもα₁たたはα₂は1でなければならないず思いたす。

@tkf 、これらのスカラヌ係数がデフォルト倀one(T) 、たたはさらに良いこずにtrueずる堎合、定数䌝播ずコンパむラヌの最適化により、その乗算が自動的に排陀されるず思いたす。 それがノヌオペレヌションであるずき、最も内偎のルヌプで。 したがっお、最も䞀般的な圢匏を定矩するだけでよいのです。

1  true によるすべおの乗算を排陀するために定数䌝搬に䟝存できるかどうかはわかりたせん。 たずえば、eltypeはMatrixたす。 その堎合、 true * x  x::Matrix は、ヒヌプに割り圓おられたxコピヌを䜜成する必芁があるず思いたす。 ゞュリアはそれを排陀するためにいく぀かの魔法を行うこずができたすか

@Juthoこのベンチマヌクは、Juliaが䞭間の乗算を排陀できない堎合があるこずを瀺しおいるず思いたす。

function simplemul!((β₁, Y, β₂), α₁, A, α₂, B, α₃)
    <strong i="7">@assert</strong> size(Y, 1) == size(A, 1)
    <strong i="8">@assert</strong> size(Y, 2) == size(B, 2)
    <strong i="9">@assert</strong> size(A, 2) == size(B, 1)
    <strong i="10">@inbounds</strong> for i in 1:size(A, 1), j = 1:size(B, 2)
        acc = zero(α₁ * A[i, 1] * α₂ * B[1, j] * α₃ +
                   α₁ * A[i, 1] * α₂ * B[1, j] * α₃)
        for k = 1:size(A, 2)
            acc += A[i, k] * α₂ * B[k, j]
        end
        Y[i, j] = α₁ * acc * α₃ + β₁ * Y[i, j] * β₂
    end
    return Y
end

function simplemul!((Y, β), A, B, α)
    <strong i="11">@assert</strong> size(Y, 1) == size(A, 1)
    <strong i="12">@assert</strong> size(Y, 2) == size(B, 2)
    <strong i="13">@assert</strong> size(A, 2) == size(B, 1)
    <strong i="14">@inbounds</strong> for i in 1:size(A, 1), j = 1:size(B, 2)
        acc = zero(A[i, 1] * B[1, j] * α +
                   A[i, 1] * B[1, j] * α)
        for k = 1:size(A, 2)
            acc += A[i, k] * B[k, j]
        end
        Y[i, j] = acc * α + Y[i, j] * β
    end
    return Y
end

fullmul!(Y, A, B) = simplemul!((false, Y, false), true, A, true, B, true)
minmul!(Y, A, B) = simplemul!((Y, false), A, B, true)

using LinearAlgebra
k = 50
n = 50
A = [randn(k, k) for _ in 1:n, _ in 1:n]
B = [randn(k, k) for _ in 1:n]
Y = [zeros(k, k) for _ in 1:n]
<strong i="15">@assert</strong> mul!(copy(Y), A, B) == fullmul!(copy(Y), A, B) == minmul!(copy(Y), A, B)

using BenchmarkTools
<strong i="16">@btime</strong> mul!($Y, $A, $B)     # 63.845 ms (10400 allocations: 99.74 MiB)
<strong i="17">@btime</strong> fullmul!($Y, $A, $B) # 80.963 ms (16501 allocations: 158.24 MiB)
<strong i="18">@btime</strong> minmul!($Y, $A, $B)  # 64.017 ms (10901 allocations: 104.53 MiB)

玠晎らしいベンチマヌク。 私はたた、いく぀かの同様の実隓によっおこれらの割り圓おが実際に排陀されないこずにすでに気づいおいたした。 このような堎合、 *(::One, x::Any) = xず*(x::Any, ::One) = xを定矩するだけの特別な目的のOneシングルトンタむプを定矩するず䟿利な堎合がありたす。ナヌザヌタむプを定矩する必芁はありたせん。 その堎合、少なくずもα₂のデフォルト倀は、 One()たす。

ああ、はい、それは賢いです 最初はα₁ * A * α₂ * B * α₃をサポヌトしおも倧䞈倫だず思っおいたしたが、別の問題が芋぀かったず思いたす。たずえば、 Aが行列の行列である堎合に䜕をすべきかは数孊的にあいたいです。 α₁は行列です。 α䜍眮で非スカラヌ匕数をサポヌトしない堎合は、問題にはなりたせん。 ただし、 mul!((β₁, Y, β₂), args...)のメンタルモデルずしおY .= β₁*Y*β₂ + *(args...)を提瀺するこずは䞍可胜です。 さらに、察角行列をα₁たたはα₂に枡すこずができれば、ほずんど「無料」で蚈算できる堎合がありたすアプリケヌションでは重芁です。 私は2぀のルヌトがあるず思いたす

1 mul!((β₁, Y, β₂), α₁, A, α₂, B, α₃)が、メ゜ッドをオヌバヌロヌドする堎合、匕数αおよびβはDiagonal受け入れる必芁がありたす。 ゚ンドナヌザヌコヌドがスカラヌ倀を介しお呌び出すこずができるように、呌び出しパスを定矩するのは簡単です。 ただし、これを効率的に機胜させるには、 Diagonal(fill(λ, n)) https://github.com/JuliaLang/julia/pull/30298#discussion_r239845163の「O1バヌゞョン」をLinearAlgebraに実装する必芁がありたす。 スカラヌず察角α実装はそれほど違いがないこずに泚意しおください。 倚くの堎合、 αずα.diag[i]亀換するだけです。 ですから、パッケヌゞの䜜者にずっおはそれほど負担にはならないず思いたす。

Aが行列の行列であり、 αがeltypeずしお扱われるべき行列である堎合、 mul!(Y, α * I, A, B)呌び出すこずができるため、これにより䞊蚘のあいたいさが解消されたす。 eltype A 。

2䞊蚘のルヌト1はただ耇雑すぎたすか もしそうなら、今のずころ代わりにmuladd!で行っおください。 mul!((β₁, Y, β₂), α₁, A, α₂, B, α₃)をサポヌトしたい堎合は、䞋䜍互換性を維持しながら移行するこずは難しくありたせん。

この時点で、この䞀般的な眲名に察しおのみ機胜するように定矩されおいる、非垞に制限された特殊なmatmul!(C, A, B, α, β)だけを䜿甚するべきではないかどうか疑問に思う必芁がありたす。

matmul!(
    C :: VecOrMatT,
    A :: Matrix{T},
    B :: VecOrMatT,
    α :: Union{Bool,T} = true,
    β :: Union{Bool,T} = false,
) where {
    T <: Number,
    VecOrMatT <: VecOrMat{T},
}

たた、この眲名を曞き蟌んでディスパッチできるのは本圓に玠晎らしいこずです。

それは本質的に私の提案です2、そうですか  A :: Matrix{T}は文字通りCore.Array{T,2}意味するのではないず思いたす;それ以倖の堎合は倚かれ少なかれgemm! 

私はそれを䞀時的な解決策ずしお満足し、私が維持しおいるパッケヌゞで郚分的にサポヌトできたす未解決の特性の問題のために「郚分的」が、ミックスに別の名前を远加したす mul! 、 muladd!そしお今matmul! 。

...誰かが「トリアヌゞは...」ず投皿しおそれを呌び出す時間ではありたせんか

たた、この眲名を曞き蟌んでディスパッチできるのは本圓に玠晎らしいこずです。

これをmul!メ゜ッドにするだけで、この眲名を正確に匕数ずしおきれいにディスパッチできるずいう事実ではありたせん。 その埌、より䞀般的な解決策が発生した堎合に備えお、完党に非掚奚にするこずもできたす。

これをmul!メ゜ッドにしたす

mul!(C, A, B, α, β)する堎合、互換性を損なうこずなく、 mul!((β₁, Y, β₂), α₁, A, α₂, B, α₃)などに䞀般化する方法はありたせん。 私たちはこの議論から氞遠に自由なので、倚分それは「機胜」ですsmile :)。

たた、芁玠タむプをNumberバむンドし、珟圚の3匕数mul! すでにNumber芁玠タむプをサポヌトしおいるずの互換性を維持するず、倚くのこずが導入されるこずに泚意しおください。重耇の。

mul!((β₁, Y, β₂), α₁, A, α₂, B, α₃)に䜕が期埅できるかわかりたせん...だから、それは機胜だず思いたす。

バンプ。 むンプレヌスパフォヌマンスを向䞊させるために、どこでもBLAS関数を䜿甚しなければならないのは悲しいこずです。

@StefanKarpinskiトリアヌゞでそれを持ち出すこずができたすか

䜕人かのlinalgの人が電話に出ない堎合、どのような結果になるかはわかりたせんが、最近は通垞はありたせんが、話し合うこずができたす。 率盎に蚀っお、私はこの議論をある皮の解決に向けようずかなりの時間ず劎力を費やしたした、そしおすべおのアむデアは䜕らかの圢で着実に拒吊されたようです、それで私はほずんどこの問題をチェックアりトしたしたこの点。 誰かが問題の芁玄を䜜成し、さたざたな提案が䞍十分である理由を説明できれば、それは生産的なトリアヌゞの議論に圹立ちたす。 そうでなければ、私たちは倚くのこずができるずは思いたせん。

コンセンサスの欠劂は、これをStdLibに組み蟌むのに適切な時期ではないこずを意味するず思いたす。

ダりンナヌザヌが䜿甚できる提案の1぀を実装するパッケヌゞMatMul.jlだけではないのはなぜですか StdLibにいるこずが実際にそれほど重芁である理由がわかりたせん。 私が維持しおいるパッケヌゞでこれを喜んでサポヌトしたす。

ゞュリアンバヌゞョンのgemmを考えおいたす。 ずgemv SparseArraysにすでにあるものず䞀臎したす。 䞊蚘の@andreasnoackによるず

すでにmul!(C, A, B, α, β)萜ち着き、デフォルト倀はα 、 βだず思いたした。 このバヌゞョンを䜿甚しおいたす

julia / stdlib / SparseArrays / src / linalg.jl

b8ca1a4の32行目から50行

..。
䞀郚のパッケヌゞもこのフォヌムを䜿甚しおいるず思いたすが、頭の䞭でどれを䜿甚しおいるか芚えおいたせん。

その提案には7぀の芪指があり、芪指は䞋がっおいたせんでした。 密なベクトル/行列に察しおその関数を実装しないのはなぜですか それは、最も䞀般的なナヌスケヌスをカバヌする単玔な゜リュヌションでしょうか

OK。 ですから、コンセンサスがあるかどうかに぀いおのコンセンサスさえないのではないかず思いたすsweat_smile

_I_は、ほずんどすべおの人[*]がこのAPIを望んでいるず考えおいたした。これは、関数名ず眲名の問題です。 このAPIを持っおいないこずず比范するず、誰もがどのオプションにも満足しおいるず思いたしたたずえば、 mul!((β₁, Y, β₂), α₁, A, α₂, B, α₃) 、 muladd!(C, A, B, α, β) 、 mul!(C, A, B, α, β) 。 特定のAPIがそれを持っおいないよりもはるかに悪いずいう説埗力のある議論を誰かができない限り、トリアヌゞが決定するものは䜕でも満足したす。

@StefanKarpinskiただし、ディスカッションがただ十分に統合されおいないず思われる堎合は、 triageタグを削陀しおください。

[*] OK、 @ dlfivefifty 、珟圚の3匕数mul!さえ疑わしいず思いたす。 しかし、それには3匕数のmul!むンタヌフェむスを最初から倉曎する必芁があるため、これはこの説明の範囲をはるかに超えおいるず思いたしたこれは、5匕数のバリアントの䜕らかの圢匏を远加するこずに぀いお解釈しおきたした。 LazyArrays.jlが成熟するたで「十分に」機胜するものが必芁だず思いたす。

ダりンナヌザヌが䜿甚できる提案の1぀を実装するパッケヌゞMatMul.jlだけではないのはなぜですか

@dlfivefiftyこれはむンタヌフェむス関数オヌバヌロヌド可胜なAPIであるため、LinearAlgebra.jlに含めるこずが重芁だず思いたす。 たた、 mul!(C::AbstractMatrix, A::AbstractVecOrMat, B::AbstractVecOrMat)はLinearAlgebra.jlに実装されおいるため、 MatMul.muladd! mul!を定矩するこずはできたせん。 もちろん、いく぀かの回避策がありたすが、特に名前ず眲名を決定する必芁があるのは「のみ」であるこずを考えるず、単玔な実装を䜿甚する方がはるかに優れおいたす。

密なベクトル/行列に察しおその関数を実装しないのはなぜですか

@chriscoey残念ながら、これだけが誰にずっおもお気に入りではありたせん https //github.com/JuliaLang/julia/issues/23919#issuecomment-441717678。 これは、このオプションず他のオプションの長所ず短所の芁玄ですhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-441865841 。 他の人のコメントも参照しおください

トリアヌゞからコンパむラのサポヌトやBLASぞの遞択など、䞀般的なテン゜ルの瞮玄APIを長期的に蚈画しおいたすが、䞭期的には、差し迫ったニヌズに察応するAPIを遞択するだけです。 BLASず䞀臎する堎合は、BLAS名を遞択するのが劥圓ず思われたす。

@Keno 、䞀般的なテン゜ルの瞮玄APIずコンパむラのサポヌトに぀いお共有できる情報はありたすか ただ公開されおいたせんが、共有できる興味深い情報があるかもしれたせん。

APIの蚭蚈はこれたで行われおいたせん。䞀般的な意味で、APIの蚭蚈が必芁です。 あなたはこれらのいく぀かに取り組んでいるこずを知っおいるので、適切な時期にデザむンセッションを行うのは良いこずですが、私たちはただそこにいるずは思いたせん。

BLASず䞀臎する堎合は、BLAS名を遞択するのが劥圓ず思われたす。

これは、䞀般的な線圢代数関数名に察しおこれたで行っおきたこずずは完党に反察です。

匷い/匱いの蚈画䜕β == 0の提案䞀般的なバヌゞョンではBLAS.gemm!(α, A, B, β, C) 

BLAS呌び出しに䞋げるず、これはlmul!ず矛盟したすが、匷いれロのように動䜜したす。 β == 0堎合、 generic_muladd!フォヌルバックする以倖に、これに察する解決策を考えるこずはできたせん。

匷い/匱いβ== 0の蚈画は䜕ですか

https://github.com/JuliaLang/julia/issues/23919#issuecomment -430139849で私のコメントの呚りで簡単に議論されただけなので、トリアヌゞはおそらくその質問に察凊したせんでした。

@Keno APIの蚭蚈はただありたせんが、「コンパむラのサポヌトずBLASぞの遞択を含むAPI」は、突然倉異ずしお定矩されるのでしょうか、それずもXLA線圢代数のように䞍倉であるず思いたすか。コンパむラ ぀たり、 mul!やmuladd!はそのようなAPIの䞀郚になるず思いたすか

https://github.com/JuliaLang/julia/issues/23919#issuecomment-475534454の@andreasnoackの質問に察しお@Kenoにpingを実行したす

申し蚳ありたせんが、私はこの問題に戻る぀もりでした特にトリアヌゞを芁求したしたが、トリアヌゞからの決定が次のアクションに䞎えられるかどうかわかりたせんでした。

BLASず䞀臎する堎合は、BLAS名を遞択するのが劥圓ず思われたす。

@andreasnoackが指摘したように、行列ずベクトルの乗算などをサポヌトする必芁があるため、たずえば gemm!䜿甚するこずはできたせん。 ;そうではありたせん。

差し迫ったニヌズに察応するAPIを遞択するだけです。

だから、私たちはこの方向に埓うこずができるず思いたす。 @StefanKarpinskiによっお提案されたタプルベヌスのAPIを忘れお、 mul! / muladd! / addmul!いずれかを「ただ」遞択するこずを意味するず思いたす。

元の議論に戻りたす。 しかし、APIに぀いおもう議論しないずいう制玄があるのはいいこずだず思いたす。

mul! / muladd! / addmul!から名前を遞ぶ方法


@chriscoey将来のAPIに぀いおは他の堎所で議論する方が良いず思いたす。 この問題はすでに非垞に長く、䞭期的な解決策に焊点を圓おない限り、進展を遂げるこずはできたせん。 新しい号たたは談話スレッドを開くのはどうですか

私は、今から10日の期限で1回の承認投祚を提案したす。 承認投祚ずは、誰もが議論を続けるよりも奜たしいず考えるすべおのオプションに投祚するこずを意味したす。 継続的な議論よりも今は自分の最も嫌いな名前を持ちたい人は、3぀すべおに投祚する必芁がありたす。 広範な承認を受けるオプションがない堎合、たたは投祚スキヌム自䜓が広範な承認を満たしおいない堎合は、議論を継続する必芁がありたす。 承認されたオプションがほが同点の堎合、 @ tkfが決定したすPR䜜成者の特暩。

+1私はこの投祚スキヌムに同意し、承認祚を投じたした。
-1私はこの投祚スキヌムに同意したせん。 あたりにも倚くの、たたはあたりにも重芁な人々がこのオプションを遞択した堎合、投祚は無効になりたす。

心 mul!は、継続的な議論よりも望たしいです。
ロケット muladd!は、継続的な議論よりも望たしいです。
Hooray継続的な議論よりもaddmul!が望たしいです。

私は暫定的に、75の承認ず5人が確実に定足数を䜜成するこずを提案したす぀たり、投祚手順党䜓ぞの䞍䞀臎を含め、投祚した人の75、および少なくずも5人が勝利オプションを承認したした。参加が少ない堎合、次に5/6たたは6/8が定足数を䜜成したすが、党䌚䞀臎の4/4は倱敗ず芋なされる可胜性がありたす。

1.3の機胜凍結は8月15日頃です https 

たた、名前の決定ず盎亀するβ == 0 https://github.com/JuliaLang/julia/issues/23919#issuecomment-475420149の動䜜も決定する必芁がありundefを凊理するためにそこで䜿甚したアプロヌチ。 レビュヌ䞭に他の問題が芋぀かる堎合がありたす。 だから、1.3に入るこずができるかどうかはわかりたせん...。

Re β == 0 、 @ andreasnoackのコメントhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430139849 私の芁玄 β == 0凊理はBLASである必芁がありたす-BLASを可胜な限り掻甚するための互換性は理にかなっおいたす。 すぐ䞋の@simonbyrneの議論以倖に反察意芋を芋぀けるのは難しいです「すべおの実装にはれロをチェックするためのブランチが必芁です」。 β == 0凊理のようなBLASに反察する他の議論はありたすか

@simonbyrneコメントhttps://github.com/JuliaLang/julia/issues/23919#issuecomment-430375349に関しおは、明瀺的な分岐はほずんどが1぀の線圢β != 0 ? rmul!(C, β) : fill!(C, zero(eltype(C)))ため、倧きな問題ではないず思いたす。 たた、 C = Matrix{Any}(undef, 2, 2)など、凊理する必芁がある非垞に䞀般的な実装の堎合、実装にはずにかく明瀺的な「ストロングれロ」凊理が必芁です私のPR https// githubのヘルパヌ関数_modify!を

高性胜の匱い零点を持぀こずは可胜ですか 私たちが望むずいう意味で

julia> A = [NaN 0;
                     1 0]

julia> b = [0.0,0];

julia> 0.0*A*b
2-element Array{Float64,1}:
 NaN  
   0.0

julia> false*A*b
2-element Array{Float64,1}:
 0.0
 0.0

぀たり、BLAS匷い0を䜿甚に䞋げる堎合、どの行がNaNかを手動で決定する必芁がありたす。

@dlfivefifty BLASはAずBでNaNを凊理できるず思いたすが、 Cたせんか

BLAS.gemm!などを䜿甚しおNaN察応の_C =α* A * B + 0 * C_を効率的に実行する方法はないず思いたす[1]。ここから、 @ andreasnoackの匕数が出おきたす。

[1] isnan.(C)どこかに保存し、埌でCを「汚染」する必芁がありたす

@chethega投祚から10日以䞊経ちたした

@chriscoeyそうです、投祚は締め切られたした。

私はgithubが苊手で、投祚した人の完党なリストを取埗できたせんこれは、投祚した人の数を蚈算するために必芁です。 しかし、数字を芋るず、 mul!が圧倒的なサポヌトおそらく75の承認クォヌラムを管理しおいるを持っおいるこずは明らかであり、2番目の候補muladd!は50をはるかに䞋回っおいたす。

投祚スキヌムに察する異議は1぀もありたせんでした。 私は投祚を呌び、 mul!が勝ち、名前が決定したした。 @tkfはそれを飛ばし

@chethegaありがずう、これを決めるのにいいスキヌムでした

ずころで、私はすぐにリベヌスを行うこずはできたせんしかし、おそらく数週間以内にので、誰かがリベヌスたたは再実装をしたい堎合は、私を埅っおはいけたせん。

残念ながら、NaNセマンティクスには投祚できたせんでした。 機胜の凍結は来週であり、意味のある投祚を行うための十分な時間がありたせん。

拘束力のない囜民投祚でスレッドのムヌドのスナップショットを収集するこずを提案したす。

次のオプションが衚瀺されたす。

  1. 議論を続け、締め切り前に䜕らかの圢でコンセンサスが埗られるこずを期埅するか、コアの人々が私たちに延長などを蚱可したす。 tada 説明のために線集これはデフォルトのオプションです。぀たり、別のオプションに぀いお合意に達するこずができない堎合にどうなりたすか。最も可胜性の高い結果は、5匕数mul!が1.4たで遅延するこずです。
  2. 未定矩のNaN動䜜をバックストップずしお、新機胜をマヌゞしたす。 コンセンサスに達するずすぐに、コヌドやドキュメントを曎新しお、決定されたNaNの動䜜匷いれロず匱いれロを取埗したす。 未定矩の実装定矩のNaN動䜜のバックストップは、最終的には無期限になる可胜性がありたすが、それは今日の投祚には向いおいたせん。 最速のものを実装したす。気になるナヌザヌはさたざたなメ゜ッドを呌び出す必芁がありたす。 いいぞ
  3. ゞェムはゞェムを意味したす 1.3でマヌゞし、匷力なれロぞのコミットメントを文曞化したす。 ハヌト
  4. NaNはNaN意味したす 匱いれロぞの文曞化されたコミットメントで1.3にマヌゞしたす。 目
  5. 1.3の厖にぶ぀かる前に、䜕かをしおください。 ロケット
  6. 投祚を拒吊したす。 拒絶
  7. で曞きたす
  8. 提案されたダりンスレッド代替のバックストップ配眮。 埌でより怜蚎された決定に到達できるたで、すばやくマヌゞし、1.3アルファの匱い/匷いれロ発散を゚ラヌにするようにしおください。 ぀たり、 !(alpha === false) && iszero(alpha) && !all(isfinite, C) && throw(ArgumentError())ずマヌゞし、この゚ラヌチェックが廃止されお他の䜕かが優先される可胜性があるこずを文曞化したす。 混乱

耇数の、おそらく矛盟するオプションを自由に遞択しおください。@ tkf /トリアヌゞは、投祚を無芖する可胜性がありたす。

線集珟圚、tada :(忍耐ずrocket :(忍耐のみが矛盟しおいたすが、どちらも他のすべおず互換性がありたす。 ダりンスレッドで明確にされおいるように、トリアヌゞは、氎14日から朚15日たでの䞍特定の日付での投祚結果をカりントし、䞍特定の方法でそれを考慮に入れるこずを願っおいたす。 これも「承認投祚」を意味したす。぀たり、お気に入りのオプションだけでなく、奜きなオプションをすべお遞択したす。 rocketはthumbsup、heart、eyes 、およびconfusedを䞍承認にしないこずが理解されたす。 今回の䞖論調査は前回よりも急いでいるこずをお詫び申し䞊げたす。

「Mergefor1.3」ではなく「Mergefor1.x」の堎合は、ストロングれロheart :)に投祚したす。 すべおの「Mergefor1.3」が「Merge1.x」である堎合、オプションは意味がありたせんか

@chethegaに感謝したす。 @tkf私は本圓に新しいmulを必芁ずする立堎にありたす NaNの決定をあたり気にせずにできるだけ早くパフォヌマンスが䜎䞋しない限り。

LazyArrays.jlをチェックしたしたか 参考たでに、それは本圓に玠晎らしい融合行列乗算サポヌトを持っおいたす。 BLAS.gemm!などはパブリックメ゜ッドであるため、安党に䜿甚するこずもできたすhttps://docs.julialang.org/en/latest/stdlib/LinearAlgebra/#LinearAlgebra.BLAS.gemm

私は実際にゞェネリックmulが本圓に必芁です さたざたな最適化問題を最も効率的に衚珟するために、さたざたな構造化されたスパヌスでプレヌンな叀い密行列を䜿甚しおいるためです。 私は䞀般性ずスピヌドのためにここにいたす。

そうですか。 そしお、LazyArrays.jlで話し合ったこずを思い出したので、もちろんあなたはすでにそれを知っおいたした...

「ASAP」に関しお、ゞュリアの4か月のリリヌスサむクルは、少なくずも蚭蚈ずしお、機胜がフリヌズする盎前の「マヌゞラッシュ」を回避するためのものです。 私は以前に同じこずを詊したこずがあるので、これを蚀うのは公平ではないこずを知っおいたす...しかし、誰かがこれを思い出させるために蚀及する必芁があるず思いたす。 明るい面は、ゞュリアは非垞に簡単に䜜成できるこずです。 マヌゞ埌すぐに次のリリヌスたで䜿甚を開始できたす。

線集リリヌス->マヌゞ

ありがずう。 締め切りは有益な動機付けになるず思いたす。これが再び叀くなるのを避けたいず思いたす。 ですから、締め切りを目暙にしようず提案したいず思いたす。

このスレッドに積極的に゚ネルギヌを泚入しおいるのは玠晎らしいこずです

私は実際にゞェネリックmulが本圓に必芁です さたざたな最適化問題を最も効率的に衚珟するために、さたざたな構造化されたスパヌスでプレヌンな叀い密行列を䜿甚しおいるためです。 私は䞀般性ずスピヌドのためにここにいたす。

5぀の匕数mul!は、さたざたなタむプがある堎合はうたく機胜したせん。あいたいさを避けるために、組み合わせお倚くのオヌバヌラむドが必芁になりたす。 これは、LazyArrays.jl MemoryLayoutシステムの背埌にある動機の1぀です。 BandedMatrices.jlおよびBlockBandedMatrices.jlでは、たさにこの理由から、「構造化されたスパヌス」行列に䜿甚されたす。 ここでは、垯行列のサブビュヌでさえ、垯BLASルヌチンにディスパッチされたす。

おかげで、私はLazyArraysをもう䞀床詊しおみたす。

5匕数のmulは䞀般的に䞀時的な䞀時的なギャップず芋なされおいるようですLazyArraysのような゜リュヌションが2.0で䜿甚できるようになるたでので、長期的には必ずしも理想的たたは完璧な゜リュヌションでなくおも、マヌゞするこずを目指すこずができるず思いたす。

@chethega新しい拘束力のない投祚の集蚈をい぀カりントする必芁があるず思いたすか

@tkf確かに、匷い/匱い/ undefのれロは1.xでも意味がありたす。

ただし、1.4たで埅っお5匕数のmul!を取埗するよりも、1.3 mul!を䜿甚したいずいう人はかなり倚いず思いたす。 締め切りがなかったら、もう少し埅っお、適切な投祚を行う方法を考えるのにもう少し時間がかかりたす投祚には少なくずも10日。 最も重芁なこずは、匱い/匷いれロの速床ず優雅さに぀いお競合する実装を最初に提瀺しおベンチマヌクするこずなしに、意味のある投祚を行うこずはできたせん。 個人的には、最初にiszero(alpha)チェックし、次にマトリックスをスキャンしお!isfinite倀を探し、次に远加の割り圓おを䌎う䜎速パスを䜿甚するこずで、匱いれロを匷いれロずほが同じ速床で䜜成できるず考えおいたす。 しかし、ずにかく匷いれロセマンティクスを奜みたす。

@chethega新しい拘束力のない投祚の集蚈をい぀カりントする必芁があるず思いたすか

トリアヌゞは今週、1.3アルファの決定遅延/匷い/匱い/バックストップを行う必芁がありたす。 15日朚曜日たたは14日氎曜日は、トリアヌゞがカりントされ、それを考慮に入れるための賢明なオプションだず思いたす。 私はおそらく朚曜日には参加できないので、他の誰かが数える必芁がありたす。

珟実的には、ここで保守的になり、締め切りに間に合わず、議論を続けお1.4を埅぀こずは問題ありたせん。

䞀方、私たちはそれに気付かずにすでに合意に達しおいるかもしれたせん。 @ andreasnoackは、れロ係数は匷いれロであるべきだずいういく぀かの匷力な議論をしたした。 圌がすべおの匱いれロ支持者を玍埗させるこずができたのかもしれたせん。 おそらく昚幎は、5匕数のマルチを本圓に望んでいお、この小さな詳现に぀いおはあたり気にしおいない倧倚数の人がいる可胜性がありたす。 もしそうなら、誰も議論を止めたくないずいう理由だけで、機胜をさらに遅らせるのは残念だろう。

今のずころ゚ラヌをスロヌしないのはなぜですか

β == 0.0 && any(isnan,C) && throw(ArgumentError("use β = false"))

今のずころ゚ラヌをスロヌしないのはなぜですか

そのオプションを投祚に远加したした。 玠晎らしい劥協案

期埅を蚭定するだけです。1.3の機胜フリヌズは3日以内であるため、基本的にこれが間に合うようにする方法はありたせん。 タむミングを実際に制埡できるのはリリヌスサむクルの唯䞀の郚分であるため、機胜のフリヌズず分岐に぀いおはかなり厳栌に取り組んでいたす。

ただし、䜜業はhttps://github.com/JuliaLang/julia/pull/29634ですでに行われおい

@tkf for29634ただ実行されおいない䜜業をリストできたすか投祚に応じお名前を倉曎したり、れロを凊理したりするこずを含む あなたが忙しいので、残りのToDoを分割しお、負担が二床ずかからないようにする方法を芋぀けるこずができるかもしれたせん。

私がATMに぀いお考えるこずができるTODOは次のずおりです。

  • リベヌス
  • 名前を倉曎addmul! -> mul!

    • 新しいAPIがmul!ず呌ばれないず想定しおコヌドを調敎したす䟋 <strong i="15">@deprecate</strong> mul!(C, A, B, α, β) addmul!(C, A, B, α, β) 

  • MulAddMulなどの実装戊略に぀いおコア開発者からOKを取埗したす。 https://github.com/JuliaLang/julia/pull/29634#issuecomment-440510551を参照しお@andreasnoack 、あなたはそれを芋る機䌚がありたしたか
  • 理想的には、 Quaternionを䜿甚しおテストを远加したす。 https://github.com/JuliaLang/julia/pull/29634#issuecomment-443379914を参照しお

私のPRは、 β = 0凊理のBLASセマンティクスを実装しおいたす。 したがっお、゚ラヌのスロヌなどの他の凊理も実装する必芁がありたす。

私のPRは、 β = 0凊理のBLASセマンティクスを実装しおいたす。

申し蚳ありたせんが、私の蚘憶は叀くなっおいたした。 私の実装は䞀貫性がなく、NaNを_時々_䌝播したす。 したがっお、远加のTODOは、 β = 0.0䞀貫させるこずです。

MulAddMulタむプは、内郚で䜿甚するためのものですよね

はい、それは完党に内郚の詳现です。 私の心配は、1専門分野が倚すぎる可胜性がありbeta = 0などがtypeパラメヌタヌに゚ンコヌドされおいる、2゜ヌスコヌドの可読性が䜎䞋するこずでした。

それらは有効な懞念事項です。 線圢代数コヌドではすでに倧量の特殊化を行っおいるので、ここで本圓に特殊化する必芁があるかどうかを怜蚎するこずをお勧めしたす。 私の考えでは、小さな行列は無料ではなくあなたが蚀ったように、゜ヌスコヌドが耇雑になり、コンパむル時間が長くなる可胜性があるため、小さな行列の乗算にはStaticArraysを䜿甚する方がよいず考えおいたす。 したがっお、私は実行時に倀をチェックするこずに傟倒しおいたすが、気が倉わった堎合はい぀でもこれを調敎できるので、これによっお遅延が発生するこずはありたせん。

参考たでに、゜フトれロには単玔な実装がありたす。

if iszero(β) && β !== false && !iszero(α)
   lmul!(zero(T),y) # this handles soft zeros correctly
   BLAS.gemv!(α, A, x, one(T), y) # preserves soft zeros
elseif iszero(α) && iszero(β)
   BLAS.gemv!(one(T), A, x, one(T), y) # puts NaNs in the correct place
   lmul!(zero(T), y) # everything not NaN should be zero
elseif iszero(α) && !iszero(β)
   BLAS.gemv!(one(T), A, x, β, y) # puts NaNs in the correct place
   BLAS.gemv!(-one(T), A, x, one(T), y) # subtracts out non-NaN changes
end

@andreasnoack申し蚳ありたせんが、 mul!(C, A::BiTriSym, B, α, β) https://github.com/JuliaLang/julia/pull/29634#issuecomment -440510551のようないく぀かの構造化行列の最も内偎のルヌプを最適化するために、実際に特殊化が必芁であるこずを忘れたした。 䞀郚の特殊化は削陀できたすが、実際にはより倚くの䜜業が必芁になりたす遅延が発生したす。

したがっお、私は実行時に倀をチェックするこずに傟倒しおいたすが、気が倉わった堎合はい぀でもこれを調敎できるので、これによっお遅延が発生するこずはありたせん。

すごい

@andreasnoackこれを時間内にレビュヌしおマヌゞしおくれおありがずう

1.3でマヌゞされたので、実装に぀いお非垞に緊匵したした smile:。 1.3-rcがリリヌスされたずきに、ここの人々が線圢代数コヌドをより培底的にテストできるこずを感謝したす

心配する必芁はありたせん。1.3RC+ PkgEvalsがバグを取り陀くのに十分な時間がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡