Очень немногие разработчики научного программного обеспечения понимают хорошие принципы проектирования, поэтому я прошу прощения, если этот ответ будет несколько затуманенным. С точки зрения разработки программного обеспечения цель научного разработчика программного обеспечения состоит в том, чтобы разработать решение, которое удовлетворяет ряду ограничений, которые часто противоречат друг другу .
Вот несколько типичных примеров этих ограничений, которые могут быть применены к дизайну вашей библиотеки разреженных матриц:
- Завершено за один месяц
- Работает правильно на вашем ноутбуке и нескольких рабочих станциях
- Работает эффективно
Ученые постепенно обращают больше внимания на некоторые другие общие требования от разработки программного обеспечения:
- Документация (руководство пользователя, учебник, комментирование кода)
- Ремонтопригодность (контроль версий, тестирование, модульная конструкция)
- Возможность повторного использования (модульная конструкция, «гибкость»)
Вам может понадобиться более или менее одно из этих требований. Если вы пытаетесь выиграть приз Гордона Белла за результативность, тогда важны даже доли процента, и лишь немногие судьи будут оценивать качество вашего кода (при условии, что вы сможете убедить их, что это правильно). Если вы пытаетесь оправдать выполнение этого кода на общем ресурсе, таком как кластер или суперкомпьютер, вам часто приходится отстаивать претензии по поводу производительности вашего кода, но они редко бывают очень строгими. Если вы пытаетесь опубликовать в журнале статью, в которой рассказывается о повышении производительности вашего подхода, то вам нужно быть на законных основаниях быстрее, чем ваши конкуренты, а производительность в 20% - это компромисс, который я бы с удовольствием сделал для лучшей ремонтопригодности и повторного использования.
Возвращаясь к вашему вопросу, «хороший дизайн», предоставленный достаточно времени для разработки, никогда не должен жертвовать производительностью. Если цель состоит в том, чтобы сделать код, который выполняется как можно быстрее, код должен быть разработан с учетом этих ограничений. Вы можете использовать такие методы, как генерация кода, встроенная сборка, или воспользоваться хорошо настроенными библиотеками, чтобы помочь вам решить вашу проблему.
Но что, если вам не хватает времени на разработку? Что достаточно хорошо? Ну, это зависит, и никто не сможет дать вам хороший ответ на этот вопрос без дополнительного контекста.
FWIW: Если вы действительно заинтересованы в написании высокопроизводительных ядер с разреженной матрицей, вам следует сравнить их с оптимизированной установкой PETSc и работать с их командой, если вы победите их, они будут рады включить настроенные ядра в библиотеку.