과학적 소프트웨어 개발자는 훌륭한 디자인 원칙을 이해하는 사람이 거의 없으므로이 답변이 조금 오래 걸리면 사과드립니다. 소프트웨어 엔지니어링 관점에서 과학 소프트웨어 개발자의 목표는 종종 상충 되는 일련의 제약 조건을 만족시키는 솔루션을 설계하는 것입니다 .
희소 행렬 라이브러리의 설계에 적용될 수있는 이러한 제약 조건의 전형적인 예는 다음과 같습니다.
- 한 달 안에 완료
- 랩톱 및 여러 워크 스테이션에서 올바르게 실행
- 효율적으로 실행
과학자들은 점차 소프트웨어 엔지니어링의 다른 일반적인 요구 사항에 더 많은 관심을 기울이고 있습니다.
- 설명서 (사용 설명서, 자습서, 코드 주석)
- 유지 보수성 (버전 제어, 테스트, 모듈 식 설계)
- 재사용 성 (모듈 식 디자인, "유연성")
이러한 요구 사항 중 하나 이상이 필요할 수 있습니다. 퍼포먼스로 Gordon Bell 상을 수상하려는 경우 몇 퍼센트도 관련이 있으며 코드의 품질을 평가할 판사 중 소수만이 심사 위원이 옳다고 확신 할 수 있습니다. 클러스터 또는 수퍼 컴퓨터와 같은 공유 리소스에서이 코드를 실행하는 것을 정당화하려는 경우 코드 성능에 대한 주장을 방어해야하는 경우가 많지만 그다지 엄격하지는 않습니다. 접근 방식의 성능 향상을 설명하는 논문을 저널에 게시하려는 경우 경쟁사보다 합법적으로 더 빨라야하며 20 % 성능은 유지 관리 성 및 재사용 성을 높이기 위해 기꺼이 절충해야합니다.
충분한 개발 시간이 주어진 "좋은 디자인"은 성능에 영향을 미치지 않아야합니다. 코드를 최대한 빨리 실행하는 것이 목표라면 이러한 제약 조건을 중심으로 코드를 설계해야합니다. 코드 생성, 인라인 어셈블리와 같은 기술을 사용하거나 튜닝 된 라이브러리를 활용하여 문제를 해결하는 데 도움이 될 수 있습니다.
그러나 개발 시간이 충분하지 않으면 어떻게해야합니까? 충분 해요? 글쎄, 그것은 달려 있고, 아무도 당신에게 더 많은 상황 없이이 질문에 대한 좋은 대답을 줄 수는 없습니다.
FWIW : 고성능 희소 행렬 커널 작성에 관심이있는 경우 최적화 된 PETSc 설치와 비교하고 구타하는 경우 팀과 협력해야합니다. 조정 된 커널을 라이브러리에 통합 할 수 있습니다.