1

스레드 나 스레드 풀을 사용하는 구현이 아니라 명시 적 스레드 객체없이 동시성을 표현할 수 있는지 궁금하지만 언어 설계 관련 문제가 있습니다.스레드없이 동시성을 표현하는 방법

1 질문 : 스레드 개체가없는 경우 무엇이 손실 될지 궁금합니다. 그런 언어로 수행 할 수없는 작업은 무엇입니까?

질문 2 :이 표현 방법, 스레드 대체 또는 보완으로 어떤 방법으로 제안되거나 구현 되었습니까?

+0

작업, 액터, 병렬 루프 등을 포함하여 동시성을 표현하는 데는 여러 가지 방법이 있습니다. 다양한 병렬 식 enumerables 등 (그리고 그것들은 C#에서 내가 아는 것들이다.) 나는 그것들을 모두 나열하는 질문이 너무 광범위하다고 생각한다. – svick

+0

@svick 어쩌면, 그러나 나는 그것이 전부는 아니라고 생각합니다. 병렬 열거 형은 병렬 루프의 특수화가 아닌가? 루프 병렬화에서 각주를 열거 할 수 없을까요? – Martin

답변

0

일 가능성이

당신이 "정상"스레드 기반의 방법은 분리 될

for(int i=0; i < 100; i++) { 
    work(i); 
} 

다음과 같은 코드가 있다고 가정 할 수있는 MPI-을 programm 모델 (뿐만 아니라 GPU)입니다 반복 - 범위를 여러 하위 집합으로. 그래서 같은이

스레드 1 :

for(int i=0; i < 50; i++) { 
    work(i); 
} 

스레드 2 :

for(int i=50; i < 100; i++) { 
    work(i); 
} 

그러나 MPI/GPU에 당신이 뭔가 다른 일을. 아이디어는 모든 코어가 동일한 (GPU) 또는 적어도 유사한 (MPI) 프로그램을 실행한다는 것입니다. 차이점은 각 코어가 코드의 동작을 변경하는 다른 ID 인 을 사용한다는 것입니다.

MPI-스타일 : (아니 정확히 MPI-구문) 다음 큰 것은 통신

int rank = get_core_id(); 
int size = get_num_core(); 
int subset = 100/size; 
for (int i = rank * subset;i < (rand+1)*subset; i+) { 
    //each core will use a different range for i 
    work(i); 
} 

입니다. 일반적으로 모든 동기화 항목을 수동으로 사용해야합니다. MPI는 메시지 기반이므로 고전적인 공유 메모리 모델 (모든 코어가 동일한 메모리에 액세스 할 수 있음)에 완벽하게 적합하지는 않지만 클러스터 시스템 (많은 코어가 네트워크와 결합 됨)에서는 우수한 성능을 발휘합니다. 이것은 슈퍼 컴퓨터에만 국한되지 않고 (근본적으로는 mpi 스타일의 것들만 사용합니다.) 근년에 새로운 유형의 코어 아키텍처 (manycores)가 개발되었습니다. 그들은 로컬 - 소위 말하는 네트워크 - 온 - 칩 (Network-On-Chip)을 가지고있어서 각 코어는 동기화 문제없이 메시지를 송수신 할 수 있습니다.

MPI는 단순한 메시지뿐만 아니라 모든 코어에 데이터를 자동으로 분산시키고 수집하는 더 높은 구조를 포함합니다. 예 (다시하지 MPI-구문)

int rank = get_core_id(); 
int size = get_num_core(); 
int data[100]; 
int result; 
int results[size]; 
if (rank == 0) { //master-core only 
    fill_with_stuff(data); 
} 
scatter(0, data); //core-0 will send the data-content to all other cores 
result = work(rank, data); // every core works on the same data 
gather(0,result,results); //get all local results and store them in 
          //the results-array of core-0 

타 솔루션 여기 OpenMP를 libary - 병렬 블록을 선언한다. 그것의 빠른 작성하는 것으로,

//this will split the for-loop automatically in 4 threads 
#pragma omp parallel for num_threads(4) 
for(int i=0; i < 100; i++) { 
    work(i); 
} 

큰 장점은 : 전체 스레드 부분은 libary 자체

예에 의해 수행된다. thats it 스레드를 직접 쓰면 성능이 향상 될 수 있지만 동기화에 더 많은 시간과 지식이 필요합니다.