3

우리 모두 단일 프로세서 용 코드를 작성합니다. 우리 모두가 멀티 프로세서에서 코드를 작성할 수 있을지 궁금합니다.병렬 코드로 전환

이 전환을 위해 우리는 무엇이 필요합니까 (소프트웨어 도구, 로직, 알고리즘)?

편집 : 제 생각에 우리는 실제 삶의 해결책 (알고리즘)을 컴퓨터 언어로 변환해야 할 것과 같은 방식으로 병렬로 많은 작업을 수행합니다. OOP 코딩이 절차 적 코딩을 위해했던 것처럼. OOP는 절차 적 코딩보다 실제 코딩 스타일입니다. 그래서 나는 그런 종류의 해결책을 원합니다.

답변

0

단순한 대답은 없으며 여러면에서 복잡한 대답조차도 현재 부적절하거나 불완전합니다. dev 라이브러리 및 도구에 대한 지침, 지침 자료, 현재 연구 프로젝트에 대한 지침 및이 영역의 문제 또는 다른 내용에 대해 더 구체적으로 대답 할 수 있다면 더 나은 답변을 얻을 수있을 것입니다.

+0

우리는 많은 작업을 병렬로 수행 할 때와 마찬가지로 실제 생활 솔루션 (알고리즘)을 컴퓨터 언어로 변환해야합니다. OOP가 절차 적 코딩을 위해 코딩 한 것처럼. OOP는 절차 적 코딩보다 실제 코딩 스타일입니다. 그래서 나는 그런 종류의 해결책을 원합니다. –

4

가장 중요한 요구 사항은 병렬 처리를 지원하는 기본 구문 또는 병렬 코드를 자동으로 생성 할 수있는 좋은 언어라고 생각합니다. 그 설명에 맞는 언어가 꽤 있지만, 그 중 어느 것도 주류 용으로는 충분히 인기가 없습니다. 즉, 차례로 여러 가지에 의해 발생합니다 : 자신의 성격으로

  1. 을 다음 언어로 오늘의 명령형 언어에서 매우 다른, 및 그 열심히 배우고 (또는 적어도 그렇게 보이는)한다.
  2. 이들은 도구와 라이브러리가 부족하여 "실제"프로젝트에서 사용할 수 없게 만듭니다. 물론

, 그것은 더 많은 인기를한다면 더 많은 사람들이 그것을 배울 기꺼이하고 탈옥 꽤 어렵다 사이클의 종류, 그래서 더 많은 지원이있을 것입니다. 나는 우리가 할 수있는 모든 것이 희망이라고 생각합니다. :)

무거운 병렬 처리를 염두에두고 설계된 언어의 예로 Erlang이 있는데, 실제로 상용 프로젝트에서 사용됩니다.

3

대단위 동시 프로그래밍의 경우 - 컴파일러에서 도움이되지 않는 한 우리는 알고리즘에 대해 많이 알고 있습니다. (Don Knuth가 말한 것조차도 그렇습니다). 이 가능한 미래를 엿볼 수있는 Erlang에 대해 읽어보십시오.

4

우리가 필요로하는 것은 고도의 동시 알고리즘을위한 자연스러운 추상화입니다. 액터 (Erlang 생각 : thinkers)는이 방향으로 나아가고 있지만, 모든 사람들에게 맞는 해결책은 아닙니다. fork/join 또는 map/reduce와 같은 좀 더 구체적인 추상화는 일반적인 문제에 더 쉽게 적용 할 수 있습니다.

이러한 동시성 추상화의 모든 트릭은 함수 스타일 프로그래밍이 필요하다는 것입니다. 병행 성은 공유 된 가변 상태와 잘 맞지 않습니다. 그들이 말했듯이 "자물쇠는 유해한 것으로 간주됩니다". 대부분의 개발자는 엄격한 필수 배경에서 왔기 때문에 비공유 연속성 전달 방식으로 전환하는 것은 종종 매우 어려울 수 있습니다.

덧붙여 말하자면 동시성 추상화와 관련하여 Clojure는이 방향에서 매우 흥미로운 기능을 가지고 있습니다. 그것은 일종의 액터를 가질뿐만 아니라 전역 적 원자 참조 메커니즘과 함께 트랜잭션 메모리 모델 (데이터베이스라고 생각하십시오)을 정의합니다. 이 두 기능을 사용하면 동시 운영이 잠금 또는 경쟁 조건에 대해 걱정할 필요없이 "변경 가능한"상태를 공유 할 수 있습니다.

결국 교육에 나옵니다. 동시성 추상화에 필요한 이론적 인 작업 중 많은 부분이 이미 완료되었습니다.이를 받아 들일 필요가 있습니다.불행하게도 Erlang과 Haskell이 증명했듯이 때로는 최고의 아이디어가 극단적 인 프린지 인구로 추방됩니다. Scala와 Clojure와 같은 노력이 기존의 지원이 잘 된 플랫폼 (JVM)에 몰래 들어가기 때문에 고급 추상화를 주류로 가져 오는 데 성공할 수 있기를 바랍니다.

0

가장 중요한 요구 사항은 문제를 서로 독립적으로 해결할 수있는 작은 문제로 나눌 수 있어야한다는 것입니다. 어떻게 할 것인지를 결정한 후에는 다른 모든 것들에 대해 생각하고 구현의 추가 질문을하기가 더 쉽습니다 (예 : "내 계산 부분은 다른 부분에 따라 달라집니다 - 어떻게 완료 될 때까지 기다려야합니까?").) 당신이 연구하거나 여기에 대해 물어볼 수있는 구체적이고 구체적인 것들이됩니다.

3

인기 있거나 인기를 얻고있는 여러 도구/언어가 있습니다. FORTRAN, C 또는 C++를 사용하는 경우 OpenMP (구현하기에는 그리 어렵지 않음) 또는 Message Passing Interface (MPI) 라이브러리 (강력하고 빠른 속도뿐만 아니라 복잡하고 어려움)를 사용할 수 있습니다. OpenMP는 전 처리기 지시문을 사용하여 병렬화 할 수있는 영역, 특히 루프를 표시합니다. MPI는 프로세스간에 데이터를주고받는 메시지를 사용합니다. 가장 큰 어려움은 병목 현상을 피하고 프로세스를 대기 상태로 유지하지 않고 모든 것을 동기화하는 것입니다. 그러나 나는 MPI가 확실히 탈출구에 있다고 말하고 싶다. 과학/고성능 컴퓨팅 커뮤니티에서 속도 향상이 추가 개발 시간의 가치가 거의 없음이 분명 해졌습니다.

위로 및 오는 언어에 대해서는 Fortress을 확인하십시오. 아직 설계 중이지만 목표는 FORTRAN보다 과학적 컴퓨팅을 위해 더 쉽게 언어를 작성하는 것입니다. 프로그램은 매우 높은 수준의 수학적 구문으로 지정됩니다. 또한 병렬 처리는 암시 적입니다. 프로그래머는 일련의 작업을해야합니다. 또한 Sun에 의해 옹호되고 Java 기반이기 때문에 휴대용이 가능합니다.

0

Java 용 이제 병렬 Java 라이브러리 또는 DPJ (결정형 병렬 Java!)를 볼 수 있습니다. 코드에서 병렬 처리를 추출하는 데 큰 도움이됩니다!