문제

CPU 건축 풍경은,변경된 여러 개의 코어가 트렌드가 변경됩니다 어떻게 우리가 개발하는 소프트웨어입니다.나는 멀티-스레드 개발에서는 C,C++,Java,나는 멀티 프로세스 개발을 사용하여 다양한 IPC 메커니즘이 있습니다.전통적인 접근 방식의 스레드를 사용하지 않는 것을 쉽게 확인,개발자,을 활용하는 하드웨어를 지원하는 고도의 동시성.

어떤 언어,라이브러리와 기술을 개발은 당신이 알고 있는 것을 완화하는 데 도움이 될 전통적인 도전을 만드 동시 응용 프로그램은 무엇입니까?나는 분명히 생각의 문제는 다음과 같은 교착 상태 및 경쟁 조건.디자인 기술,라이브러리 도구,등등.또한 재미있는 데 도움이 실제로 활용하고 사용할 수 있는 리소스 등이 사용되고 있습니다-그냥 쓰기 안전하고 견고한 스레드 응용 프로그램지 않도록 사용하여 사용 가능한 모든 코어 있습니다.

What I've seen so far is:

  • 얼랑:프로세스를 기반으로,메시지 전달 IPC 는'배우의 모델 concurrency
  • 우리의 문학과 예술:배우의 모델 라이브러리 루비 및 Python
  • Scala:프로그래밍 언어 JVM 에 대한 몇 가지 추가 concurrency 지원
  • Clojure:기능에 대한 프로그래밍 언어 JVM 으로 배우 라이브러리
  • 흰개미:포트의 얼랑의 프로세스 접근 방식과 메시지 전달하는 방식

다른 무엇이 당신에 대해 알고,무슨 일을 당신을 위해 그리고 당신은 무엇을 생각하는 것은 볼 수있는 흥미로운?

도움이 되었습니까?

해결책

두 가지 패러다임 교대를 제안합니다.

소프트웨어 트랜잭션 메모리

당신은 개념을보고 싶을 수도 있습니다. 소프트웨어 트랜잭션 메모리 (STM). 아이디어는 사용하는 것입니다 낙관적 동시성: 다른 사람과 병렬로 실행되는 모든 작업은 고립 된 거래에서 작업을 완료하려고합니다. 어느 시점 에서이 트랜잭션이 작동하는 데이터를 무효화하는 또 다른 거래가 커지면 거래의 작업이 버리고 거래가 다시 실행됩니다.

아이디어의 첫 번째 널리 알려진 구현 (개념 증명과 첫 번째 구현이 아닌 경우)은 Haskell의 것입니다. Haskell의 거래 메모리에 관한 논문 및 프레젠테이션. 다른 많은 구현이 나열되어 있습니다 Wikipedia의 STM 기사.

이벤트 고리와 약속

동시성을 다루는 또 다른 매우 다른 방법은 [e 프로그래밍 언어]에서 구현됩니다.http://en.wikipedia.org/wiki/e_(programming_language%29).

언어 설계의 다른 부분뿐만 아니라 동시성을 다루는 방법은 배우 모델을 기반으로합니다.

다른 팁

당신은 Java를 언급했지만 스레드 만 언급합니다. Java의 동시 도서관을 보셨습니까? Java 5 이상으로 번들로 제공됩니다.

Threadpools가 포함 된 아주 멋진 라이브러리, 복사상 작성자는 거의 없습니다. 문서를 확인하십시오 자바 튜토리얼. 또는 원하는 경우 자바 문서.

나는 사용했다 처리 파이썬의 경우. 그것은 API를 모방합니다 스레딩 모듈은 사용하기 쉽습니다.

당신이 사용하는 경우 map/imap 또는 생성기/목록 이해력, 코드를 사용하도록 변환 processing 간단합니다 :

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

병렬화 될 수 있습니다

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

그러나 결과를 계산 해야하는 많은 프로세서를 사용합니다. 게으른다 (Pool.imap) 및 비동기 변이체 (Pool.map_async).

구현하는 대기열 클래스가 있습니다 Queue.Queue, 및 실과 비슷한 작업자.

Gotchas

processing 기반입니다 fork(), 창문에 모방되어야합니다. 객체는 통해 전송됩니다 pickle/unpickle, 따라서 이것이 작동하는지 확인해야합니다. 리소스를 획득 한 프로세스는 이미 원하는 것이 아닐 수도 있지만 (데이터베이스 연결을 생각하십시오) 일반적으로 작동합니다. 그것은 너무 잘 작동하여 패스트 트랙에서 Python 2.6에 추가되었습니다 (참조. PEP-317).

인텔 스레딩 빌딩 블록 C ++는 나에게 매우 흥미로워 보입니다. 원시 스레드보다 훨씬 높은 수준의 추상화를 제공합니다. O'Reilly는 매우 있습니다 좋은 책 죽은 나무 문서를 좋아한다면. 또한보십시오, 인텔의 스레딩 빌딩 블록에 대한 경험이 있습니까?.

내가 말할 것:

모델 : 스레드 + 공유 상태, 행위자 + 메시지 전달, 트랜잭션 메모리,지도/감소? 언어 : Erlang, IO, Scala, Clojure, Reia 라이브러리 : Retlang, Jetlang, Kilim, Cilk ++, Fork/Join, MPI, Kamaelia, Terracotta

나는 이와 같은 것들 (Erlang, Scala, Java Threading, Actor Model 등)에 대한 동시성 링크 블로그를 유지하고 하루에 몇 가지 링크를 올렸습니다.

http://concurrency.tumblr.com

나는 거의 20 년 동안 ADA에서 동시 프로그래밍을 해왔습니다.

언어 자체 (라이브러리에서 일부 다루지 않은)는 스레딩 ( "작업"), 다중 스케줄링 모델 및 다중 동기화 패러다임을 지원합니다. 내장 프리미티브를 사용하여 자신의 동기화 체계를 구축 할 수도 있습니다.

당신은 Ada를 생각할 수 있습니다 랑데부 일종의 절차 지향 동기화 시설로 보호 된 물체 더 객체 지향적입니다. Rendezvous는 오래된 CS- 개념과 유사합니다 모니터, 그러나 훨씬 더 강력합니다. 보호 된 객체는 동기화 프리미티브가있는 특수 유형으로 OS 잠금 장치, 세마포어, 이벤트 등과 같은 물건을 구축 할 수 있습니다. .

질문 내일의 많은 코어 프로세서를 활용하기 위해 오늘 어떤 병렬 프로그래밍 모델을 추천하십니까? 이미 질문을 받았습니다. 나는 거기에 다음 답변을 주었다.

카마 엘리아 a 파이썬 프레임 워크 많은 의사 소통 프로세스가있는 응용 프로그램을 구축합니다.

Kamaelia- 동시성은 유용하고 재미있었습니다

Kamaelia에서는 시스템을 구축합니다 서로 대화하는 간단한 구성 요소. 이것은 개발 속도를 가속화하고 대규모 유지 보수를 지원하며 또한 귀하를 의미합니다. 자연스럽게 동시 소프트웨어를 구축하십시오. 접근 할 수 있도록 의도 된 것입니다 어느 초보자를 포함한 개발자. 그것은 또한 그것을 재미있게 만듭니다 :)

어떤 종류의 시스템? 네트워크 서버, 클라이언트, 데스크톱 응용 프로그램, 피그 게임 기반 게임, 트랜스 코드 시스템 및 파이프 라인, 디지털 TV 시스템, 스팸 근거기, 교육 도구 등 :)

다음은 PYCON 2009의 비디오입니다. Kamaelia와 Twisted and Parally Python을 비교 한 다음 Kamaelia의 데모에 손을 대는 것으로 시작합니다.

Kamaelia와의 쉬운 동시성 - 1 부 (59:08)
Kamaelia와의 쉬운 동시성 - 2 부 (18:15)

나는주의를 계속 지켜보고있다 .NET의 병렬 확장 그리고 평행 LINQ.

나는 알고있다 reia - Erlang을 기반으로하지만 Python/Ruby처럼 보이는 언어.

Java에는 배우 도서관도 있습니다. 그리고 당신은 그 j를 알고 있습니까?Ava는 기능적 언어입니까? ;)

OpenMP.

그것은 당신을 위해 스레드를 처리하므로 병렬로 실행하려는 C ++ 응용 프로그램의 어떤 부분에 대해서만 걱정합니다.

예를 들어.

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

위의 코드는 OpenMP 런타임에 사용하라고 말한 것처럼 많은 스레드에서 For Loop을 실행하므로 크기가 100이고 쿼드 코어 상자가 있으면 루프가 각 코어에서 25 개 항목을 실행합니다.

다양한 언어에 대한 몇 가지 다른 병렬 확장 기능이 있지만 내가 가장 관심이있는 언어는 그래픽 카드에서 실행되는 언어입니다. 그것은 진짜 병렬 처리입니다 :) (예 : 예 : GPU ++ 그리고 libsh)

C++0x 를 제공할 것입 std::lock 기능에 대한 잠그는 하나 이상의 mutex 함께.을 완화하는 데 도움이됩니다 교착 상태로 인해하기 위해 잠그고 있습니다.또한 C++0x 스레드 라이브러리에는 약속,선물 및 포장의 작업을 허용하는 스레드를 기다리는 작업의 결과에서 수행되는 또 다른 스레드없이 사용자 수준을 잠급니다.

multiprocessing 다른 답변에서 언급 한 것처럼 멀티 코어 프로그래밍을 단순화하는 파이썬 라이브러리입니다.

Python 's로 작성된 프로그램 multiprocessing 로컬 코어 대신 클라우드에서 작업을 배송하도록 쉽게 수정할 수 있습니다. Picloud 클라우드에 큰 주문형 처리 전력을 제공하기 위해이를 활용합니다. 코드의 2 줄을 수정하면됩니다.

따라서 테이크 아웃은 다음과 같습니다. 멀티 코어를위한 라이브러리를 선택할 때 클라우드 접근 방식이 의미가 있는지 물어볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top