Nur sehr wenige wissenschaftliche Softwareentwickler verstehen gute Designprinzipien, daher entschuldige ich mich, wenn diese Antwort etwas langwierig ist. Aus Sicht der Softwareentwicklung ist es das Ziel des wissenschaftlichen Softwareentwicklers, eine Lösung zu entwerfen, die eine Reihe von Einschränkungen erfüllt, die häufig in Konflikt stehen .
Im Folgenden sind einige typische Beispiele für diese Einschränkungen aufgeführt, die möglicherweise auf den Entwurf Ihrer Bibliothek mit spärlicher Matrix angewendet werden:
- Fertig in einem Monat
- Läuft korrekt auf Ihrem Laptop und mehreren Workstations
- Läuft effizient
Die Wissenschaftler konzentrieren sich zunehmend auf einige andere allgemeine Anforderungen aus dem Software-Engineering:
- Dokumentation (Benutzerhandbuch, Tutorial, Codekommentar)
- Wartbarkeit (Versionskontrolle, Testen, modularer Aufbau)
- Wiederverwendbarkeit (modularer Aufbau, "Flexibilität")
Möglicherweise benötigen Sie mehr oder weniger einer dieser Anforderungen. Wenn Sie versuchen, einen Gordon-Bell-Preis für Leistung zu gewinnen, sind auch Bruchteile eines Prozents relevant, und nur wenige der Juroren bewerten die Qualität Ihres Codes (solange Sie sie davon überzeugen können, ist es richtig). Wenn Sie versuchen, die Ausführung dieses Codes auf einer gemeinsam genutzten Ressource wie einem Cluster oder einem Supercomputer zu rechtfertigen, müssen Sie häufig Ansprüche bezüglich der Leistung Ihres Codes verteidigen, diese sind jedoch selten sehr streng. Wenn Sie versuchen, eine Veröffentlichung in einem Journal zu veröffentlichen, in der die Leistungssteigerungen Ihres Ansatzes beschrieben werden, müssen Sie zu Recht schneller als Ihre Konkurrenten sein, und 20% Leistung sind ein Kompromiss, den ich gerne für eine bessere Wartbarkeit und Wiederverwendbarkeit eingehen würde.
Wenn Sie auf Ihre Frage zurückkommen, sollte "gutes Design", das genügend Entwicklungszeit hat, niemals die Leistung beeinträchtigen. Wenn das Ziel darin besteht, Code so schnell wie möglich auszuführen, sollte der Code unter Berücksichtigung dieser Einschränkungen entworfen werden. Sie können Techniken wie Codegenerierung und Inline-Assemblierung verwenden oder hoch optimierte Bibliotheken verwenden, um Ihr Problem zu lösen.
Aber was ist, wenn Sie nicht genug Entwicklungszeit haben? Was ist gut genug? Nun, es kommt darauf an, und niemand wird in der Lage sein, Ihnen eine gute Antwort auf diese Frage zu geben, ohne mehr Kontext.
FWIW: Wenn Sie wirklich daran interessiert sind, Hochleistungs-Kernel mit spärlicher Matrix zu schreiben, sollten Sie sich mit einer optimierten PETSc-Installation vergleichen und mit ihrem Team zusammenarbeiten, wenn Sie sie schlagen. Sie würden gerne optimierte Kernel in die Bibliothek integrieren.