16

요즘 멀티 코어 및 멀티 프로세싱 하드웨어의 중요성을 고려할 때 사람들이 실제로 병렬 코드를 작성하는 방법을 파악하려고합니다. 필자는 Linux에서 기본이며 Windows에서 사용할 수있는 pthread (POSIX 스레드)가 지배적 인 패러다임처럼 보입니다. HPC 사람들은 OpenMP 나 MPI를 사용하는 경향이 있지만 StackOverflow에는 이러한 것들이 많이 보이지 않습니다. 아니면 휴대용 표준이 아닌 Java 스레딩, Windows 스레딩 API 등에 의존합니까? 귀하의 의견으로는 병렬 프로그래밍을 수행하는 가장 좋은 방법은 무엇입니까?

아니면 Erlang, CUDA, RapidMind, CodePlay, Oz, 심지어 오래된 Occam과 같은 이국적인 것들을 사용하고 있습니까?

설명 : Linux, 다양한 유닉스, 다양한 호스트 아키텍처 등의 플랫폼에 적용 할 수있는 솔루션을 찾고 있습니다. Windows는 지원하기 좋은 드문 경우입니다. 따라서 C #과 .net은 너무 좁습니다. CLR은 멋진 기술이지만 Linux 호스트 용으로 CLR을 출시하여 JVM, Python, Erlang 또는 다른 휴대용 언어처럼 보급 될 수 있습니다.

C ++ 또는 JVM 기반 : JVM은 성능을 숨기는 경향이 있으므로 C ++ 일 것입니다.

MPI : HPC 사람들조차도이 도구를 사용하기가 어렵다고 생각하지만 128000 프로세서에서 실행하는 경우지도 / 축소가 적용되지 않는 문제에 대한 유일한 확장 가능한 솔루션입니다. 메시지 전달은 아주 훌륭하지만, 로컬 메모리 / AMP, 공유 메모리 / SMP, 분산 런타임 환경에 맞게 확장 할 수있는 유일한 프로그래밍 스타일이기 때문에 훌륭한 프로그래밍 방식입니다.

흥미로운 새로운 경쟁자는CAPI. 그러나 나는 아직 그것에 대해 어떤 실제적인 경험을 할 시간이 없다고 생각한다.

전반적으로, 내가 알지 못했던 많은 흥미로운 Microsoft 프로젝트가 있고, 실제로 Windows API 또는 pthread가 가장 일반적인 구현이라고 생각됩니다.


  • 어쩌면 당신은 질문을 다시 말해야 할 것입니다.의견에 기초한그래서 폐쇄 될 수 있습니다. - Carlos Heuberger
  • 나는 그것이 ... 9 년 전에 그것을 물어 보았을 때 합리적으로 보였지만 지금은 stackoverflow에서 지배적 인 유형의 실마리가있는 질문으로는 이해가되지 않는다고 생각합니다. - jakobengblom2

20 답변


10

MPI는 대부분의 것만 큼 힘들지는 않습니다. 요즘에는 다중 패러다임 방식이 병렬 및 분산 응용 프로그램에 가장 적합하다고 생각합니다. 보다 세분화 된 병렬 처리를 위해 노드에서 MPI를 사용하여 노드 통신 및 동기화, OpenMP 또는 PThreads를 사용하십시오. 각 머신마다 MPI, 각 코어에 대해 OpenMP 또는 PThreads를 생각하십시오. 가까운 장래에 각 코어에 대해 새로운 MPI Proc를 생성하는 것보다 조금 더 확장 된 것처럼 보일 것입니다.

현재 듀얼 또는 쿼드 코어의 경우, 각 코어에 대한 proc을 생성하는 데 많은 오버 헤드가 발생하지는 않지만, 캐시 및 다이 메모리가 그만큼 확장되지 않는 시스템 당 더 많은 코어에 접근함에 따라, 공유 메모리 모델을 사용하는 것이 더 적절할 것입니다.


  • 멀티 패러다임이 HPC가 실제로가는 방식이기 때문에 투표했습니다. - tgamblin
  • NUMA로 알맞은 메모리 성능을 얻으려면 배열이 스레드 (OpenMP 또는 기타)와 동일한 레이아웃을 가진 소켓을 통해 분산되어야합니다. libnuma (비싼)를 명시 적으로 사용하지 않고 많은 메모리를 할당하면 실제 계산에서 스레드와 동일한 선호도를 갖는 스레드로 오류를주의해야합니다. 반대로 OpenMP와 같은 시스템에서는 보장하기가 매우 어렵지만 MPI는 자연스럽게 친화력을 설정하고 로컬 메모리를 가져옵니다. 크기가 큰 공유 메모리 머신에서도 OpenMP보다 MPI의 확장 성이 더 좋습니다. - Jed

6

나는 권하고 싶다.OpenMP. Microsoft는이를 Visual C ++ 2005 컴파일러에 포함 시켰으므로 잘 지원되므로 / omp 지시문을 사용하여 컴파일하는 것 외에는 다른 작업을 수행 할 필요가 없습니다.

사용하기 쉽지만, 분명히 모든 것을 당신을 위해하지는 않지만, 그렇다고해서는 안됩니다. 나는 일반적으로 어떤 혼전없이 루프를 병렬로 실행하는데 사용한다. 내 자신을 굴리는 경향이있는 복잡한 일들을 위해 (예를 들어 나는 오래 전부터 코드를 잘라내어 붙여 넣고 수정할 수있다.)

시도해 볼 수 있습니다.Cilk ++보기 좋고 전자 책이있다."멀티 코어 소프트웨어 혁명을 살아남는 방법".

이 두 종류의 시스템은 직렬 코드를 병렬 처리하려고합니다. 즉 for 루프를 사용하면 모든 코어에서 가능한 한 쉬운 방법으로 동시에 실행할 수 있습니다. 그들은 범용 스레드 라이브러리가되는 경향이 없습니다. (예 :연구 논문(pdf)는 openMP에 구현 된 다양한 유형의 스레드 풀의 성능을 설명하고 yield 및 sleep이라는 두 가지 새로운 작업을 추가해야한다고 제안했습니다. 나는 그들이 OpenMP의 요점을 놓치고 있다고 생각한다)

OpenMP에 대해 언급했듯이 C #이나 .NET이 아닌 네이티브 C ++에 대해 이야기하고 있다고 가정합니다.

또한 HPC 사람들 (내가이 영역의 전문가라고 생각하는 사람)이 OpenMP 또는 MPI를 사용하고있는 것처럼 보이는 경우, 이것이 SO 독자가 아닌, 사용 중이어야하는 것입니다!


  • C #이나 .net은 휴대용이 아니기 때문에 일종의 외면입니다. 제 세계에서 모든 코드는 Linux, Windows, Solaris, AIX 사이에서 이식해야하며 모든 종류의 플랫폼에서 실행되어야합니다. 필자는 종종 임베디드 Power Arch / Linux를 코딩합니다. - jakobengblom2

4

우리는병렬 확장마이크로 소프트는 아직 출시되지 않았지만 확실히 잠재력을 보여주고있다.


3

나는 사용했다.에이스개발자가 모든 플랫폼에서 POSIX (또는 Windows) 스타일의 스레딩을 사용할 수 있도록합니다.


2

병렬 FX 라이브러리 (PFX)- Microsoft Research와 Microsoft의 CLR 팀 간의 공동 작업으로 개발 된 관리되는 동시성 라이브러리로 .NET Framework의 향후 개정판에 포함됩니다. 병렬 LINQ (PLINQ)와 작업 병렬 라이브러리 (TPL)의 두 부분으로 구성됩니다. 또한 동시 작업의 실행을 동기화하고 조정하는 데 사용되는 일련의 데이터 구조 인 CDS (Coordination Data Structures) 세트로 구성됩니다. 이 도서관은 2007 년 11 월 29 일에 CTP로 배포되었으며 2007 년 12 월과 2008 년 6 월에 다시 새로 고침되었습니다.

별로 경험은 아니지만 ...


2

여기서의 대답은 "실제로 사용하는"것에 대한 통계적으로 대표적인 대답이 될 수 없다는 점에 유의하십시오. 이미 많은 "X is nice"답변을 보았습니다.

개인적으로 많은 프로젝트에서 Windows 스레드를 사용했습니다. 널리 사용되는 다른 API는 pthread입니다. HPC 앞에서는 MPI를 사용하는 사람들이 여전히 심각하게 생각하고 있습니다.<subjective>저는 C ++의 모든 우아함과 Javascript의 성능을 결합 시켰습니다. 괜찮은 대안이 없기 때문에 살아남습니다. 한쪽에는 NUMA 기계를, 다른 한쪽에는 Google 스타일의지도 축소를 사용하면 편리합니다.</subjective>


  • MapReduce가 MPI와 동일한 문제를 해결하지 못하기 때문에 투표를 취소했습니다. 데이터 집약적 인 컴퓨팅 기술인 MapReduce와 대규모 과학적 컴퓨팅 인 MPI는 큰 차이가 있습니다. NUMA가 큰 요소이지만 전체 시스템이 아닙니다. - tgamblin
  • 성능이 MapReduce를 MPI보다 선호하는 이유입니까? 그건보기 드문 점입니다. - Jonathan Dursi
  • @ 조나단 : 다릅니다. MapReduce는 상당히 높은 대기 시간에도 불구하고 성능 / $에서 상당히 잘 수행됩니다. 핵심 코어이므로 NUMA 시스템의 성능을 이길 수 없습니다. 그것이 MPI가 압박 될 이유입니다. MR과 경쟁하기에는 너무 비싸고 NUMA 기계와 경쟁하기에는 너무 느립니다. - MSalters

2

데이터 병렬 하스켈GHC> 6.6을 사용하면 알고리즘을 쉽게 병렬 처리 할 수있는 인상적인 기능을 제공합니다.Control.Parallel. 전략.


1

.Net 용으로 나는 큰 성공을 거두었 다.RetLang. JVM의 경우,규모중대하다.


1

어때?오픈 CL?


1

환경에 따라 크게 다릅니다.

오래된 palin에 대해서는 아무것도 POSIX를 능가하지 못합니다.

C ++에는 무료로 BOOST.ORG의 아주 훌륭한 스레딩 라이브러리가 있습니다.

Java는 네이티브 java 스레딩 만 사용합니다.

또한 응용 프로그램을 클라이언트 및 서버 프로세스로 나누고 비동기 메시징을 사용하여 통신하는 것과 같은 스레딩 이외의 다른 병렬 처리 방법을 살펴볼 수도 있습니다. 제대로 수행하면 수십 개의 서버에서 수천 명의 사용자까지 확장 할 수 있습니다.

또한 Windows MFC, Gnome 또는 Qt 윈도우 환경을 사용하는 경우 자동으로 멀티 스레드 환경에있게됩니다. Apache ISS 또는 J2EE를 사용하는 경우 응용 프로그램이 다중 스레드 다중 프로세스 환경에서 이미 실행 중입니다.


1

필자가 작성한 동시 프로그램의 대부분은거기 있니?이 언어는 기본적으로 언어에서 병렬 처리를 완벽하게 지원합니다. 좋은 장점 중 하나는 병렬 코드가 Ada 컴파일러가있는 모든 시스템에 이식 가능한 것입니다. 특별한 도서관은 필요하지 않습니다.


0

PLINQ +1

Win32 Threads, Threadpool and Fibers, Sync Objects


0

나는 시간 경과에 따라 이들을 다룬 동시성 링크 블로그를 유지하고있다.

http://concurrency.tumblr.com


0

나는 단지 자바를 알고 있으며, 멀티 쓰레딩 지원은 저에게 잘되었습니다.


0

나는 단순성, 이식성 및 유연성 때문에 주로 OpenMP를 많이 사용했습니다. 전능 한 C ++ / Cli를 지원합니다. :)


0

나는 MPI를 아주 좋아한다. 그것은 당신에게 기억 계층 구조에 대해 생각하도록 강요하지만, 내 경험상, 그런 것들에 대해 생각하는 것은 고성능을 위해서 중요합니다. 대부분의 경우 MPI는 도메인 별 병렬 객체 (예 : 선형 및 비선형 방정식을 푸는 PETSc) 뒤에 숨어있을 수 있습니다.


0

pycuda ... 아무 것도 25000 활성 스레드처럼 :) [스코어 보드와 함께 예정된 워프]. cuda 2에는 스트림 지원이있어 어떤 스트림이 가져올 지 확신 할 수 없습니다. CUDA Matlab 확장은 깔끔하게 보입니다.명왕성그리고 오는 MIT의 PetaBricks.

파이썬의 스레딩은 부족합니다. MPI 등은 복잡하고 클러스터가 없지만 그들이 구축 한 것을 성취한다고 가정합니다. 내가 스레드 아파트 (아마도 좋은 일이)에 도착하기 전에 나는 C #프로그래밍을 중단했다.


0

그렇지 않다.평행본질적으로 분산 모델은 없지만 Clojure를 사용하여 JVM에 고도의 동시 코드를 작성할 수 있습니다. 이후에 많은 Java 라이브러리를 사용할 수 있습니다. clojure 위에 자신 만의 병렬 알고리즘을 구현해야하지만 비교적 쉽습니다. 나는 그것을 반복하지 않는다.아직분산 모델을 가지고있다.


0

glibc 라이브러리의 gthreadshttp://library.gnome.org/devel/glib/stable/glib-Threads.htmlpthreads까지 컴파일하면 성능이 떨어지지 않습니다. 또한 매우 강력한 스레드 풀과 스레드 간의 메시지 큐를 제공합니다. 나는 그들을 여러 번 성공적으로 사용했으며 사용 가능한 기능에 매우 만족해했습니다.


0

오픈 클럭을 사용합니다. mpi와 비교하여 사용하기가 훨씬 쉽습니다. 이전에 mpi를 병렬 및 분산 컴퓨팅 과정의 요구 사항으로 사용해 왔지만 너무 많은 수작업을해야한다고 생각합니다. 시작할 것입니다. 쿠다 (CUDA)는 오픈 클론과 매우 유사하지만 문제는 엔비디아 제품에만 해당됩니다.

연결된 질문


관련된 질문

최근 질문