Ist es sicher, die Elemente eines unitialisierten Arrays mit CUBLAS / CUSPARSE-Operationen auf 0 zu setzen?
-
13-12-2019 - |
Frage
Wenn z.B.akkumuliert man die Ergebnisse verschiedener Matrix-Vektor-Multiplikationen (was man in BLAS auch dann macht, wenn es nur ein akkumulierendes Element gibt), beginnt man formal mit einem Nullvektor.Es gibt jedoch keine Overhead-freie Möglichkeit, ein Array von Nullen direkt im CUDA-Gerätespeicher zuzuweisen (oder gibt es das?), also ist die Lösung, die mir in den Sinn kommt, einfach ein Array mit beliebigen Zahlen zu nehmen und, anstatt es auf 0 zu initialisieren, einen Wert zu übergeben beta = 0.
zum ersten Aufruf von cublas<t>gemv
oder cusparse<t>csrmv
.Immerhin, wenn es diesen Parameter hat "warum nicht verwenden".
Ist das
- eine gute Idee?Oder ist der Fall β = 1 so optimiert, dass insgesamt eine bessere Leistung erzielt wird, um ein Array auf 0 zu initialisieren und dann einen Aufruf zu verwenden
cusparseDcsrmv(..., 1., zeroes_array)
? - sicher?Naïvely sollten Gleitkommazahlen als Darstellungen von ℝ Elementen erfüllen x ⋅ 0 = 0 ∀ x, aber diese naïve Behandlung ist natürlich oft ziemlich tödlich, wenn es um Gleitkommazahlen geht.Ich bin mir ziemlich sicher, dass es is sicher, wenn das Array zuvor für einige andere Operationen mit demselben Datentyp verwendet wurde, bei denen sich das Ergebnis gut verhielt, aber ist es auch sicher für einen vereinheitlichten Block von frisch zugewiesenem Gerätespeicher?
Ich interessiere mich hauptsächlich für den spärlichen Fall, da für dichte Matrizen die O( n2) die Komplexität der Multiplikation macht es unnötig, zu viel über die Leistung des O( n ) zuordnung des Vektors.
Lösung
Dies sollte absolut sicher sein und wird die ganze Zeit durchgeführt;jedes Paket, das sich nicht korrekt verhält, wenn β=0 ist, hätte einen ernsthaften Fehler.
Insbesondere in der Cusparse-Dokumentation für csrmv heißt es: "Wenn beta Null ist, muss y keine gültige Eingabe sein", und LAPACK sagt etwas Ähnliches für * gemv ("Wenn BETA als Null angegeben wird, muss Y bei der Eingabe nicht gesetzt werden").)
Bei Optimierungen kann es vorkommen, dass beta = 1 und beta = 0 für jede Implementierung bestimmte optimierte Codepfade haben, dies jedoch möglicherweise nicht;wahrscheinlich, wenn man es nicht tut, tut es auch nicht.