Дуже мало розробників наукового програмного забезпечення розуміють хороші принципи дизайну, тому я прошу вибачення, якщо ця відповідь трохи завмерла. З точки зору інженерії програмного забезпечення, мета наукового розробника програмного забезпечення - розробити рішення, яке задовольняє набір обмежень, які часто суперечать один одному .
Ось кілька типових прикладів цих обмежень, які можуть бути застосовані до дизайну вашої розрідженої матричної бібліотеки:
- Завершено за один місяць
- Працює правильно на своєму ноутбуці та декількох робочих станціях
- Працює ефективно
Вчені поступово приділяють більше уваги деяким іншим загальним вимогам з інженерії програмного забезпечення:
- Документація (керівництво користувача, підручник, коментування коду)
- Ремонтопридатність (контроль версій, тестування, модульний дизайн)
- Багаторазовість (модульна конструкція, "гнучкість")
Можливо, вам знадобиться більше або менше однієї з цих вимог. Якщо ви намагаєтеся виграти приз Gordon Bell за продуктивність, то навіть частки відсотків є релевантними, і мало хто з суддів буде оцінювати якість вашого коду (поки ви зможете переконати їх у правильності). Якщо ви намагаєтеся виправдати запуск цього коду на спільному ресурсі, такому як кластер або суперкомп'ютер, часто доводиться захищати претензії щодо продуктивності вашого коду, але вони рідко є дуже жорсткими. Якщо ви намагаєтесь опублікувати документ у журналі, що описує підвищення продуктивності вашого підходу, тоді вам потрібно законно бути швидшими, ніж ваші конкуренти, і 20% продуктивність - це компроміс, який я з радістю зробив би для кращої ремонтоздатності та використання.
Повертаючись до свого питання, "хороший дизайн", забезпечений достатньо часу на розробку, ніколи не повинен погіршувати продуктивність. Якщо мета полягає в тому, щоб зробити код, який працює якомога швидше, код повинен бути розроблений на основі цих обмежень. Ви можете використовувати методи, такі як генерація коду, вбудована вбудована програма, або скористатися високоналагодженими бібліотеками, щоб допомогти вирішити вашу проблему.
Але що робити, якщо у вас недостатньо часу на розробку? Що достатньо добре? Ну, це залежить, і ніхто не зможе дати вам гарну відповідь на це питання без більшого контексту.
FWIW: Якщо вам дійсно цікаво писати високоефективні розрізнені матричні ядра, вам слід порівнювати оптимізовану установку PETSc і працювати зі своєю командою, якщо ви їх б'єте, вони будуть раді включити налаштовані ядра до бібліотеки.