Ist es sicher, die Elemente eines unitialisierten Arrays mit CUBLAS / CUSPARSE-Operationen auf 0 zu setzen?

StackOverflow https://stackoverflow.com//questions/9684519

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top