2010-06-05 3 views
14

저는 멀티 코어 프로그래밍에 관한 책을 .NET 4를 사용하여 작성하고 있으며 멀티 코어 프로그래밍의 사람들이 grok하기가 어렵거나 어려울 것으로 예상되는 부분을 알고 싶습니다.멀티 코어 프로그래밍 : 어려운 부분

+0

게시물을 편집 할 때 오른쪽 하단에 "커뮤니티 위키"확인란이 있습니다. – kennytm

+3

원하지 않으면 게시를 위키 할 필요가 없습니다. Wiki는 "누구나 편집 할 수 있음"을 의미하며 커뮤니티가 게시물의 소유권을 갖기를 원한다는 것을 의미합니다. 우리는 이미 그 이유 때문에 태그가 있기 때문에 "주관적"또는 "토론"질문을 분류하는 데 사용되지 않습니다. – Juliet

+2

정답이없는 질문은 사람들이 답변을 편집 할 수있게하기 때문에 커뮤니티 위키에 대한 좋은 후보라고 생각합니다. – Gabe

답변

3

이해하기 : 메모리의 획득 및 릴리스 의미의 차이와 같은 저수준 메모리 세부 정보.

나머지 개념과 아이디어 (무엇이든 삽입 할 수 있고 경쟁 조건을 ...)는 거의 사용하지 않으면 그리 어렵지 않습니다.

연습이 진행되는 동안 특히 무슨 일이 일어나고있는 경우, 여러 가지 추상화 수준에서 작업해야하는 상황에서 매우 어려워서 디자인을 간단하고 가능한 한 멀리 설계하십시오. (예 : 불변의 데이터와 더 높은 레벨의 추상화 사용).

2

이론적 세부 사항은 많지 않지만 사람들을 방문하는 실제 구현 세부 사항이 많습니다.

변경 불가능한 데이터 구조는 무엇입니까?

모든 시간, 사람들은 여러 스레드에서 데이터 구조를 업데이트 너무 열심히 그것을 찾기 위해 노력하고, 누군가에 차임 등 우리의 지속적인 코더는이 글을 "불변의 데이터 구조를 사용!"

ImmutableSet set; 

ThreadLoop1() 
    foreach(Customer c in dataStore1) 
     set = set.Add(ProcessCustomer(c)); 

ThreadLoop2() 
    foreach(Customer c in dataStore2) 
     set = set.Add(ProcessCustomer(c)); 

코더 (Coder)는 불변의 데이터 구조가 잠금없이 업데이트 될 수 있다고 들었지만 새로운 코드는 분명한 이유로 작동하지 않습니다.

목표로 삼는 학계 및 숙련 된 개발자라도 불변 프로그래밍 이디엄의 기초에 대한 약간의 입문서는 해를 끼칠 수 없습니다.

스레드간에 대략 동일한 양의 작업을 분할하는 방법은 무엇입니까?

이 단계를 올바르게 수행하는 것은 하드입니다. 때로는 단일 프로세스를 병렬로 실행할 수있는 10,000 개의 단계로 나눌 수 있지만 모든 단계가 동일한 시간을 차지하는 것은 아닙니다. 작업을 4 개의 스레드로 분할하고 처음 3 개의 스레드가 1 초 만에 끝나고 마지막 스레드가 60 초 걸리면 다중 스레드 프로그램은 단일 스레드 버전보다 훨씬 좋지 않습니까?

그러면 모든 스레드간에 대략 동일한 양의 작업으로 문제를 어떻게 분할합니까? 빈 포장 문제를 푸는 데있어 훌륭한 경험적 방법이 많이 있습니다.

몇 개의 스레드가 있습니까?

문제가 잘 병렬화되면 더 많은 스레드를 추가하면 속도가 빨라지 죠? 여기에 고려해야 할 사항이 많이 있습니다.

더 많은 스레드를 추가하면 더 많은 스레드가 OS에 스레드를 예약 할 기회가 많아 지므로 프로그램을 더 빠르게 만들 수 있으므로 실행 시간이 늘어납니다. 단일 스레드 프로그램 그러나 리턴 감소의 법칙에 따라 컨텍스트 전환을 증가시키는 스레드가 추가되므로 특정 시점에 프로그램 실행 시간이 가장 길더라도 성능은 단일 스레드 버전보다 여전히 나쁠 수 있습니다.

그렇다면 실행 시간을 최소화하기 위해 충분한 스레드를 어떻게 분할합니까?

다른 많은 응용 프로그램이 스레드를 회전시키고 리소스를 놓고 경쟁하는 경우 어떻게 성능 변화를 감지하고 자동으로 프로그램을 조정합니까?

+0

존 (Jon)은 기능적 프로그래밍의 큰 지지자로, 어떤 작업이 어려운지를 실제로 바꾼다. 나는 당신이 질문에 "f #"태그를 놓친 것 같아요, 그는 그의 기능적 접근 방식을 지적해야합니다. Bin 패킹은 파티셔닝에 대한 하나의 접근 방식 일 수 있지만 파티셔닝이 선험적으로 결정되지 않은 작업 도용 및 작업 대기열은 현실 세계에서 훨씬 인기가있는 것처럼 보입니다. –

+0

@Ben : F #과 같은 불순한 기능 언어를 옹호하고 돌연변이 및 가변 데이터 구조를 전혀 피하지 마십시오. 실제로, 나는 돌연변이가 평행주의의 맥락에서 종종 필수적이라고 믿는다. –

5

.Net에서 멀티 코어 프로그래밍을위한 전체 서적을 작성 했으므로.

너는 멀티 코어을 약간 넘어갈 수 있다고 생각합니다.

예를 들어 .Net의 분산 시스템에서 병렬 컴퓨팅에 관한 장을 사용할 수 있습니다. 가능성은 아직 .NET에 성숙한 프레임 워크가 없습니다. DryadLinq가 가장 가깝습니다. (반대편에서 자바 플랫폼의 Hadoop과 친구들은 매우 좋습니다.)

일부 GPU 컴퓨팅 기능을 설명하는 장을 사용할 수도 있습니다.

6

일부는 책/잠재 고객이 얼마나 기본적이고 고급인지에 따라 달라집니다. 싱글 스레드에서 멀티 스레드 프로그래밍으로 처음 갈 때는 대개 절벽에서 떨어져 나갑니다 (많은 경우 복구가 불가능합니다. 예를 들어 Control.Invoke에 관한 모든 혼란스러운 질문 참조).

어쨌든, 소프트웨어 프로세스에서 다른 관련 작업에 대한 프로그래밍 자체에 대한 작은 어떤 생각을 추가, 그리고 더 많은합니다 :

  • 측정 : 당신이 개선을 목표로하는 메트릭 무엇을 결정, 올바른 도구를 사용하고, 신호 대 잡음을 차별화하고, 결과를 해석하고, 왜 그들이있는 그대로 이해 하는지를 정확하게 측정합니다 (우연히 잘못된 것을 측정하기 쉽습니다).

  • 테스트 : 중요하지 않은 비 결정 성/인터리빙을 허용하지만 올바른 프로그램 동작을 계속 고정하는 테스트를 작성하는 방법.

  • 디버깅 : 도구, 전략, 때 등 코드/디자인과 더 나은 파티션 변경 가능한 상태를 개선하기 위해 피드백을 의미한다 "디버깅하기 어렵다"

  • 대 물리적 논리적 스레드 선호도 : 이해 GUI 스레드, 어떻게 이해 F # MailboxProcessor/agent는 변경 가능한 상태를 캡슐화하고 여러 개의 스레드에서 실행될 수 있지만 항상 단일 논리 스레드 (하나의 프로그램 카운터)만으로 실행될 수 있습니다.

  • 패턴 (그들이 적용 할 때), 포크 - 조인 내가 예에 대한 많은 청중이있을 것으로 기대

..., 생산자 - 소비자,지도-감소 "도움, 12 %의 CPU 사용률을 가진 단일 스레드 응용 프로그램이 있습니다. 많은 작업을하지 않고도 4 배 더 빠르게 진행할 수 있도록 배우고 싶습니다." "여기에 논쟁이있는 것 같기 때문에 코어를 추가 할 때 내 앱은 선형 적으로 확장됩니다. 사용할 수있는 더 나은 접근법이 있습니까?"그래서 약간의 도전이 각 잠재 고객에게 제공 될 수 있습니다.

+0

테스트와 관련하여 우리 회사는 Microsoft의 CHESS 도구 (http://research.microsoft.com/en-us/projects/chess/)에서 멀티 스레드 코드의 모든 인터리브를 철저히 테스트했으며, 끝내기 시작하십시오. 아마도 여기서 유용 할 수 있습니다. – Juliet

7

유용한 병렬 작업 단위는 무엇이며 어떻게 찾거나 구성합니까?

이러한 모든 병렬성 프리미티브는 포킹 오버 헤드보다 작은 작업을 포크하는 경우 유용하지 않습니다. 실제로, 그것은 당신에게 당신이 기대하는 것 대신에 좋은 감속을 사게됩니다.

그래서 큰 문제 중 하나는 병렬 처리 프리미티브보다 분명히 많은 작업 단위를 찾는 것입니다. 여기에서 핵심적인 문제는 병렬 처리 프리미티브 자체를 포함하여 실행 비용이 무엇인지 알지 못한다는 것입니다. 이러한 비용을 분명히 보정하는 것이 매우 유용합니다. (병렬 프로그래밍 언어 인 "PARLANSE"을 설계, 구현 및 매일 사용하는 것은 컴파일러가 생성 및 최적화하여 병렬 사전 처리 비용을 최소화하는 것이 었으며 작은 작업을 " 더 병렬 가능 ").

토론 큰 -O 표기법과 그 응용 프로그램을 고려할 수도 있습니다. 우리는 병렬 처리 프리미티브가 비용 O (1)을 가지기를 바랍니다. 그렇다면 비용이 O (x)> O (1) 인 작업을 찾으면 해당 작업이 병렬화를위한 좋은 후보가됩니다. 당신의 제안 된 연구가 또한 O (1)이라면, 그것이 효과적인지 아닌지는 일정한 요소에 달려있다. 그리고 우리는 위와 같이 교정으로 돌아 간다.

조각이 너무 크지 않으면 충분히 큰 단위로 작업을 수집해야하는 문제가 있습니다. 코드 모션, 알고리즘 대체 등은이 효과를 얻으려는 모든 유용한 아이디어입니다.

마지막으로 synchnonization의 문제가 있습니다 : 병렬 유닛이 상호 작용해야 할 때, 어떤 프리미티브를 사용해야합니까? 프리미티브의 비용은 얼마입니까? (기대 이상!).

4

나를 괴롭혔던 한 가지는 특정 유형의 문제를 해결하는 데 사용하는 접근 방식입니다. 에이전트가 있고, 작업, 비동기 계산, 배포 용 MPI가 있습니다. 여러 가지 방법을 사용할 수있는 많은 문제가 있지만, 다른 방법을 사용해야하는 이유를 이해하는 데 어려움이 있습니다.

1

복잡한 패턴의 작업자 노드를 이동하는 동기화 된 데이터의 개념이 시각화하고 프로그래밍하기가 매우 어렵습니다.

일반적으로 나는 곰 인 디버깅을 발견합니다.

관련 문제