과학 소프트웨어는 얼마나 최적화해야합니까?


13

상당한 계산 리소스가 필요한 응용 프로그램의 경우 과학적 결과를 제공하거나 합리적인 시간에 "획기적인"달성을 위해서는 고성능이 중요한 요소가 될 수 있습니다.

소프트웨어 개발자가 애플리케이션 최적화에 얼마나 많은 시간과 노력을 투자해야합니까? 사용 된 주요 기준은 무엇입니까?


과학자들이 작성하는 프로그램은 종종 매우 오랫동안 실행 됩니다 (예 : 시뮬레이션). 프로그래머 시간과 컴퓨터 실행 시간이 비슷할 수 있습니다. 이것은 오늘날의 "일반적인"프로그래머 작업과는 매우 다릅니다. 컴퓨팅 초기와 마찬가지로 시뮬레이션을 더 빠르게하고 더 빠르게 완료하고 작업을 더 빨리 완료하기 위해 약간의 노력과 프로그래머 시간을 투자하는 것이 좋습니다.
Szabolcs 2019

답변:


15

대부분의 경우 알고리즘 개선은 최적화 개선보다 더 큰 차이를 만듭니다. 알고리즘은 또한 저수준 최적화보다 이식성이 뛰어납니다. 필자의 조언은 캐시 재사용을위한 메모리 레이아웃, 과도한 복사 또는 통신 방지, 파일 시스템을 깔끔하게 처리하고 부동 소수점 커널이 벡터화에 충분한 세분성을 갖도록하는 일반적인 모범 사례를 따르는 것입니다. 때때로 이것은 충분히 큰 "피크"에 도달하기에 충분합니다 (이 작업의 경우).

중요하다고 생각하거나 프로파일 링을 통해 중요하다고 생각되는 작업에 대한 성능 모델을 항상 스케치하십시오. 그런 다음 성능 모델을 사용하여 고도로 조정 된 구현이 제공 할 수있는 것을 추정 할 수 있습니다. 속도 향상이 그만한 가치가 있다고 판단한 경우 (다른 작업에 비해) 최적화를 수행하십시오.

아마도 가장 어려운 과제는 API를 변경하지 않고도 나중에 최적화 할 수 있도록 높은 수준의 중요하고 (많은 코드가 이러한 선택에 의존한다는 의미에서) 인터페이스 및 데이터 구조를 설계하는 것입니다. 특정 최적화 및 일반적인 지침과 달리 경험을 제외하고 이것을 가르치는 방법을 모르겠습니다. 성능에 민감한 오픈 소스 소프트웨어를 사용하면 도움이됩니다. API 결정과 마찬가지로 문제 공간을 이해하는 것이 중요합니다.


1
최근에 나는 분석의 제한 단계의 런타임에서 10,000 (우리의 가장 큰 사건의 경우) 개선 시간을 얻었습니다. 시간과 공간에서 O (n ^ 2) 인 알고리즘을 하나의 O (n log n으로 대체하면됩니다. ) 둘다. 그것은 또 다른 의존성과 약간의 복잡성을 의미한다고 생각하지만 때로는 가치가 있습니다 ...
dmckee --- ex-moderator kitten

1
속도에 영향을 미치는 요소 (비교적 요소)는 비교 한 내용을 명확하게 참조 할 가치가 없습니다. 부적절한 알고리즘을 기반으로 잘못된 구현을 비교 한 다음 변경하면 상대적으로 큰 이득을 기대하는 것은 당연하지 않습니다.
Allan P. Engsig-Karup

1
@Allan : 한 번의 변경으로 얻을 수있는 요소는 10,000 개 였으며, 분명히 잘못 선택된 구현이었습니다. 이전 코드는 시간 복잡성만큼 불필요한 공간으로 인해 크게 손상되었습니다. 캐싱 성능은 끔찍했습니다. 그러나 그것이 핵심이 아닌가?
dmckee --- 전 운영자 고양이

8

"최적화"를 어떻게 정의 하시겠습니까? 더 나은 알고리즘 또는 계산 모델 개발에서 수동 튜닝 어셈블러 사용에 이르기까지 전체 스펙트럼이 있습니다.

내 의견과 경험에 따르면, 낮은 컴퓨터 성능은 중간 컴퓨터 어딘가에 있습니다. 알고리즘이 반드시 새로운 것은 아니며 기본 아키텍처에 대한 이해가 반드시 구체적 일 필요는 없습니다. 예 :

  • 아키텍처가 SIMD를 지원한다는 것을 알고 있다면 계산을 재구성하여 짧은 벡터로 작업을 작성할 수 있습니다.
  • 아키텍처가 멀티 코어 컴퓨터라는 것을 알고 있다면 계산 작업을 서로 방해하지 않는 개별 하위 작업으로 분류하고 병렬로 실행하십시오 (하위 작업의 DAG 생각). ,
  • 기본 아키텍처에 GPU가있는 경우 데이터를 잠금 단계로 행진하는 스레드 그룹으로 계산을 재구성 할 수있는 방법을 생각하십시오.
  • 기타...

SIMD, 병렬 처리 및 GPU와 같은 위의 모든 기능은 많은 저수준 지식 없이도 액세스 할 수 있지만,이를 쉽게 활용할 수있는 알고리즘의 장점 만 제공합니다.


4

나는 지금까지 제시된 모든 답변에 동의합니다 ... 코드 최적화의 간과 한 가지 측면 인 품질 기대를 다루고 싶습니다.

코드 최적화 문제는 일반적으로 사용자가 더 큰 문제를 해결하려고 시도하고 사용자의 요구 / 예상을 충족시키기에 코드가 부족한 경우에 발생합니다. 코드 최적화에 투자해야하는 시간은이 기대를 충족시키기위한 요구에 달려 있습니다. 경쟁 우위에 대한 중요한 요구가있는 경우 (예 : 다른 사람보다 먼저 뜨거운 주제에 대한 연구 마무리 및 게시) 상당한 시간을 투자 할 가치가 있습니다.

물론 얼마나 많은 시간을 투자해야하는지, 얼마나 빨리 필요한지, 코드를 얼마나 이식 할 수 있는지에 달려 있습니다. 종종이 두 가지 요구가 서로 상충되므로 최적화를 시작하기 전에 어느 것이 더 중요한지를 결정해야합니다. 이식성이 좋을수록 코드의 높은 수준의 설계 변경 (알고리즘 / 데이터 구조)에 더 의존해야합니다. 코드가 더 빨리 수행되기를 원하는 경우 특정 머신에 특정한 낮은 수준의 최적화 (예 : 코드 / 컴파일러 / 런타임 최적화)로 조정해야합니다.


4

실행 속도를 얻는 데 많은 인 월 지출 (그리고 항상 신화적인 :-) 지출에 대한 (비용) 분석을해야합니다. 이 소프트웨어를 몇 번이나 사용할지, 그리고 얼마나 많은 사람들이 이득을 평가할 수 있는지 알아 내야합니다.

경험과 마찬가지로 경험상 유명한 80/20 규칙이 있습니다. 언젠가는 몇 퍼센트 (또는 적은)의 러닝 타임을 얻기 위해 점점 더 많은 시간을 소비하지 않습니다. 그러나 분석해야합니다.

그리고 위의 포스터에 진심으로 동의합니다 .API를 잘 생각하고 많은 변경이 필요하지 않으며 코드를 이식 가능하고 유지 관리 할 수 ​​있는지 확인하십시오 (작성한 알고리즘을 다시 분석해야한다는 점을 생각하십시오) 10 년 전에 최적화 됨). 그리고 좋은 프로그래밍 실습과 표준 라이브러리를 사용하십시오. 누군가가 이미 응용 프로그램에 가장 효율적인 알고리즘에 대해 생각한 것은 합리적입니다.

도널드 크 누스 (Donald Knuth)를 인용하자면 : "조기 최적화는 모든 악의 근원"입니다. 따라서 코드를 프로파일 링하십시오.


파레토 원칙 (80/20) 규칙을 언급하고 있습니까? 그렇다면 속도 저하의 80 %를 생성하는 코드의 20 %에 최적화 노력을 집중해야한다는 의미입니까? 아니면 20 %의 속도 향상을 기대할 수 있다면 최적화 할 가치가 없다는 것을 의미합니까?
Paul

아니요, 정확히 80/20이 아닌 일종의 원칙으로 만 사용했습니다. 때때로, 당신은 더 이상 노력할 가치가없는 몇 퍼센트 만 얻기 위해 많은 노력을 기울일 것입니다.
GertVdE

3

몇 가지 추가 조언 :

  1. 작동중인 프로그램을 최적화하기 전에 코드의 무결성을 유지하는 데 도움이되는 일련의 테스트 사례가 있는지 확인하십시오. 더 이상 잘못된 결과를 얻는 데 아무런 의미가 없습니다.
  2. 최적화로 코드를 읽을 수 없게 만드는 경우 최소한 주석 형식으로 원본 버전을 유지하지만 컴파일 타임과 런타임에 대체 버전으로 선택하는 것이 좋습니다. 문제와 기계가 발전함에 따라 최적화 요구 사항이 변경 될 수 있으며, 원래 코드는 5 년 후에 수행 할 최적화의 시작점이 될 수 있습니다.
  3. 최적화 된 버전이 최소한의 영향을 미치는 것으로 판명되었지만 코드의 가독성, 보편성이 떨어지거나 안정성이 떨어지면 원래 버전으로 돌아갑니다. 당신은 당신이 얻는 것보다 더 많은 것을 잃습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.