과학 컴퓨팅의 최신 C ++?


22

과학 컴퓨팅에서 C ++ 현대 기능 (이동 의미론, STL, 반복자, 게으른 평가 등)의 사용을 구체적으로 다루는 서적, 기사 또는 블로그 게시물 또는 일반적으로 게시되는 자료를 찾고 있습니다. 당신은 어떤 제안 할 수 있습니까?

이러한 새로운 기능으로 효율적인 코드를보다 쉽게 ​​작성할 수 있다고 생각하지만 실제 예제는 찾지 못했습니다. 내가 읽은 대부분의 참조는 C ++의 일반적인 용도에 관한 것이며 과학 컴퓨팅의 예는 포함하지 않습니다. 그래서 나는 C ++ 현대적인 기능을 사용하는 과학 컴퓨팅 코드의 예제 (생산 코드 예제 일 필요는 없으며 교육적 예제와 같은 수치 레시피 수준 일 필요는 없습니다)를 찾고 있습니다.

이 기능을 사용하는 라이브러리에 대해서는 묻지 않습니다. 과학 컴퓨팅에서 이러한 기능을 어떻게 활용할 수 있는지 설명하는 기사 / 책 / 등에 대해 묻고 있습니다.


2
오늘날 (20 년 전) 모범 사례로 이해되고있는 의미에서 "현대"또는 구체적으로 C ++ 11 / 14의 의미에서 "현대"에 대해 질문하고 있습니까?
Kirill

2
@ 키릴 나는 둘 다 같아요. 대부분 C ++ 11/14를 사용하지만 모범 사례를 따르는 것입니다.
becko

답변:


11

최신 C ++ 구문을 사용하는 라이브러리의 두 가지 예 :

  • 고유 라이브러리와 아르마딜로 라이브러리 (선형 대수)는 여러 현대 C ++ 구문을 사용합니다. 예를 들어, 두 표현식 템플릿을 사용하여 산술 표현식을 단순화하고 때로는 일부 임시를 제거 할 수 있습니다.

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf(Armadillo의 표현 템플릿에 대한 설명)

  • CGAL 라이브러리 (계산 기하학)는 많은 최신 C ++ 기능을 사용합니다 (템플릿 및 전문화를 많이 사용함).

http://www.cgal.org

노트 :

현대적인 C ++ 구문은 매우 우아하고 사용하기가 매우 재미있을 수 있습니다. 강점과 약점 둘 다 : 그것들을 사용할 때, 몇 개의 템플릿 / 전문화 / 람다 레이어를 추가하여 결국 프로그램의 효과적인 코드보다 더 많은 "관리"를 얻는 유혹을 느낍니다 (즉, 당신의 프로그램은 해결책을 설명하는 것보다 문제에 대해 더 많이 이야기합니다.) 올바른 균형을 찾는 것은 매우 미묘합니다. 결론 : 다음과 같이 측정 하여 코드에서 "신호 / 잡음"비율의 진화를 추적해야합니다 .

  • 프로그램에 몇 줄의 코드가 있습니까?
  • 몇 개의 클래스 / 템플릿?
  • 시간을 실행 ?
  • 메모리 소비?

처음 두 개를 증가시키는 모든 것은 비용 으로 간주 될 수 있습니다 (프로그램을 이해하고 유지하기가 더 어려워 질 수 있기 때문에), 마지막 두 개를 감소시키는 것은 모두 이익 입니다.

예를 들어, 추상화 (가상 클래스 또는 템플릿)를 도입하면 코드를 인수 화하고 프로그램을 더 간단하게 ( gain ) 만들 수 있지만 한 번만 파생되거나 인스턴스화 되지 않으면 관련 이득이 없는 비용 이 발생합니다. 나중에 프로그램의 진화에서 이득이 올 수 있기 때문에 미묘하다. 따라서 "황금의 법칙"은 없다.

프로그래머의 안락함 또한 비용 / 이득 균형에서 고려해야 할 중요한 요소입니다. 템플릿이 너무 많으면 컴파일 시간이 크게 증가하고 오류 메시지를 구문 분석하기가 어려워집니다.

참조

C ++ 템플릿을 사용하는 일반 및 메타 프로그래밍은 어느 정도까지 컴퓨팅 과학에 유용합니까?


2
아르마딜로와 아이겐도 마찬가지입니다.
dr.blochwave

예, 당신 말이 맞습니다 (방금 Armadillo의 문서에서 확인했습니다. 익숙하지 않습니다). 게시물을 수정하고 있습니다.
BrunoLevy

1
더 긴 컴파일 시간은 언급 할만한 또 다른 비용입니다.
Kirill

@ 키릴, 네 좋은 지적 (그것을 언급하기 위해 게시물을 편집), 감사합니다.
BrunoLevy

10

Deal.II를 살펴볼 것을 제안합니다. STL, 자체 반복자, 공유 포인터 등을 사용합니다.

다양한 선형 솔버는 설계 방식으로 인해 다양한 매트릭스를 사용할 수 있습니다. 나는 이동 의미론을 전혀 사용하지 않았지만 그것이 존재하지 않는다는 것을 의미하지는 않습니다. 여기 링크가 있습니다.


또한 OpenFOAM- 템플릿을 상당히 광범위하게 사용합니다.
tpg2114

1
deal.II는 이동 의미론을 사용하지 않습니다 (C ++ 11 언어 기능을 사용하지 않기 때문에-이전 컴파일러의 BOOST를 대체하는 C ++ 11 라이브러리 기능을 사용합니다). 그러나 원래 질문에 나온 모든 것을 포함하여 거의 모든 다른 C ++ 언어 기능을 사용합니다.
Wolfgang Bangerth

큰 라이브러리를 자세히 보면 쉽지 않은 것 같습니다.
Michael

7

HPX의 라이브러리는 C의 범위를 많이 사용하게 ++ (11)는 이동 생성자와 같은 기능도 완벽하게 구현 될 것을 목표로 N4409 (병렬 처리를위한 C ++ 확장을위한 작업 초안, 기술 사양).

그들은 과학 계산 속도를 높이기 위해 라이브러리를 사용하는 많은 예제를 포함하는 사이트 에 출판물 의 목록을 가지고 있습니다 . 라이브러리에 대한 흥미로운 토론이 있으며이 CppCast 에피소드 에서 최신 C ++을 사용합니다 .


scicomp.se에 오신 것을 환영합니다! 과학적 계산을 위해이 라이브러리에 대해 설명하는 링크를 추가하거나 기사 / 책 / 블로그 게시물을 인용하는 경우, 귀하의 답변을 기쁘게 생각합니다!
hardmath

5

Scientific and Engineering C ++ : Barton과 Nackmann의 고급 기술과 예제를 사용한 소개를 살펴 보는 것이 좋습니다 .

이 책이 1994 년에 출판되었다는 사실은 "현대 기술"에 대한 귀하의 기준을 위반 한 것으로 보입니다. 그러나 Barton과 Nackmann은 당시 C ++ 템플릿으로 가능한 것의 최첨단에 있었고 우수한 성능을 달성하기 위해 고안 한 혁신적인 기술이 여전히 최신 C ++ 클래스 라이브러리에서 사용되었습니다.


4

deal.ii (여기서 이미 제안되어 있음) 외에도 템플릿 메타 프로그래밍, 반복자 범위, 스마트 포인터 등과 같은 고급 C ++ 기능을 광범위하게 사용 하는 Dune 라이브러리를 살펴볼 수도 있습니다 . Joachim Schöberl 의 최근 사전 인쇄본 에는 NGSolve에서 유한 요소 메소드의 구현을 단순화하기위한 람다 함수와 같은 C ++ 11 기능의 사용에 대한 의견이 있습니다. 후원또한 uBLAS, Graph 등과 같은 과학 프로그래밍과 관련된 라이브러리가 있습니다. 대부분의 라이브러리에서 최신 C ++ 사용법의 좋은 예를 찾을 수 있습니다. 그러나 고급 / 현대 C ++ 사용에 대한 나쁜 예가 발생할 수도 있습니다. 어떤 경우에는 코드 / 문서를 읽는 동안 TMP와 같은 고급 기술을 보여주기 위해 때로는 일이 크게 과장되었다는 느낌이 들었습니다. 모든 잠재적 응용 프로그램의 99 %에 대해 더 간단한 구현도 일.


3

Pitt-Francis & Whiteley의 "C ++의 과학 컴퓨팅 안내서"라는 책은 Amazon을 통해 또는 출판사로부터 e-Book으로 제공하는 이러한 종류 (STL, 반복자 등의 사용)에 정확하게 답변하기 위해 작성되었습니다 .

공개- 저자 와 동일한 연구 그룹 에서 일하지만 여전히 이것이 좋은 자료라고 생각합니다!


1

필자는이 책이 저에게있어 완벽하다고 생각합니다. 현대 C ++ 발견 : Peter Gottschling의 과학자, 엔지니어 및 프로그래머를위한 집중 교육 과정 (C ++ 심층 교육), 특히 프로그래밍 원칙 및 연습 사용과 함께 사용하는 경우 C ++ 2 판 Bjarne Stroustrup. C ++ 자신의 발명가. 둘 다 견실 한 접지를 제공해야합니다.


0

블레이즈 라이브러리 선형 대수는 추론 및 후행 반환 형식의 형태로 C ++ (14)를 많이 사용한다. 사용중인 다른 최신 C ++ 기능은 constexpr, 별칭 템플릿 및 SFINAE 식을 사용한 수많은 템플릿 메타 프로그래밍입니다.

예를 들어 벡터와 행렬에 이니셜 라이저 목록을 사용할 수도 있습니다.

blaze::DynamicVector<int> x{ 4, -1, 3 };

자세한 내용은 시작 페이지를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.