암시 적 병렬 처리 / 동시성이 더 널리 퍼지지 않는 이유는 무엇입니까? [닫은]


13

암시적인 병렬 처리 ^ 는 많은 프로그래머들로부터 큰 부담을 덜어 컴퓨터에 배치 할 수 있습니다. 그렇다면 ... 왜 현재는 더 널리 퍼져 있지 않습니까?


^ 암시 적 병렬 처리는 스레드 등을 사용하여이 작업을 수행해야하는 프로그래머 대신 컴퓨터가 한 번에 둘 이상의 작업을 수행하는 방법을 스스로 파악할 수 있도록하는 것입니다.


패러 세일 프로그래밍 언어를 확인하십시오. 이들은 암시 적 병렬 처리를 시도하는 유일한 것으로 보입니다. forge.open-do.org/plugins/moinmoin/parasail

답변:


11

몇 가지 예외 (Haskell)를 사용하면 컴파일러가 루프를 풀 수있는 방법이 없습니다. 문제는 루프를 반복 할 때마다 전역 상태를 수정할 수 있다는 것입니다. 따라서 다른 순서로 수행하면 문제가 발생할 수 있습니다. haskell에서는 순수한 함수, 즉 전역 상태를 읽거나 변경하지 않으므로 어떤 순서로든 실행할 수 있다고 말할 수 있습니다.

실제로 문제는 몇 가지 예외가 있지만 동시성을 잘 수행하는 방법은 여전히 ​​공개 된 문제입니다. Erlang과 Haskell 커뮤니티는 꽤 잘하고있는 것처럼 보이지만 큰 N을 위해 N- 코어 시스템을 프로그래밍하는 방법을 이해하기 전에 아직 갈 길이 멀다.


1
구성표에는 순서를 보장하지 않기 위해 명시 적으로 선택하는 루프가 있습니다.
Javier

쿨 나는 계획에 대해 몰랐다
Zachary K

5

현재 사용중인 대부분의 프로그래밍 언어는 단일 스레드 프로그래밍 및 단일 사용자 상호 작용이 많은 응용 프로그램 (예 : 독립형 데스크톱 응용 프로그램)에 가장 많이 사용되는 시점에 사용되었습니다. 웹 애플리케이션, 클라우드 컴퓨팅 및 다중 사용자 애플리케이션이 증가함에 따라 이제 더 많은 멀티 스레드 애플리케이션이 필요합니다.

레거시 프로그래밍 언어는 언어 자체에서 멀티 스레드 기능을 천천히 지원하려고합니다 (java가 java.util.concurrent를 추가 한 것처럼).

앞으로 나올 새로운 언어는 스레딩 및 동시성 지원 기능이 향상 될 것입니다.


4

다른 답변에서 언급 한 점 (작업이 독립적이며 프로그래머가 직렬 적으로 생각한다는 것을 입증하기는 어렵습니다) 외에도 병렬화 비용 이라는 세 번째 요소가 고려되어야 합니다.

진실은 스레드 병렬 처리와 관련된 비용이 매우 크다는 것입니다.

  • 스레드 생성은 매우 비쌉니다. 커널에게 스레드를 시작하는 것은 프로세스를 시작하는 것과 거의 같습니다. 정확한 비용은 확실하지 않지만 10 마이크로 초 정도입니다.

  • 뮤텍스를 통한 스레드 통신은 비용이 많이 듭니다. 일반적으로 각 측면에서 시스템 호출이 필요하므로 스레드를 휴면 상태로 만들고 다시 깨워 대기 시간과 콜드 캐시 및 플러시 된 TLB를 생성 할 수 있습니다. 평균적으로 뮤텍스를 복용하고 해제하는 데 약 1 마이크로 초가 소요됩니다.

여태까지는 그런대로 잘됐다. 이것이 암시적인 병렬 처리에 문제가되는 이유는 무엇입니까? 암시적인 병렬 처리는 소규모로 증명하기가 가장 쉽기 때문입니다. 간단한 루프의 두 반복이 서로 독립적이라는 것을 증명하는 것은 한 가지입니다 stdout. 데이터베이스에 무언가를 인쇄 하고 쿼리를 데이터베이스에 보내는 것은 서로 독립적이며 병렬로 실행될 수 있음 을 증명하는 것은 완전히 다른 것입니다 ( 데이터베이스 프로세스는 파이프의 다른쪽에있을 수 있습니다!).

즉, 병렬 처리 비용이 병렬 처리의 이점보다 높기 때문에 컴퓨터 프로그램이 입증 할 수있는 암시 적 병렬 처리는 불가능할 수 있습니다. 반면에 실제로 응용 프로그램을 가속화 할 수있는 대규모 병렬 처리는 컴파일러에 적합하지 않습니다. CPU가 마이크로 초 내에 얼마나 많은 작업을 수행 할 수 있는지 생각해보십시오. 이제 병렬화가 직렬 프로그램보다 빠르면 병렬 프로그램은 두 뮤텍스 호출 사이에서 몇 마이크로 초 동안 모든 CPU를 사용 중 상태로 유지할 수 있어야합니다. 이를 위해서는 실제로 거친 병렬 처리가 필요하며 자동으로 거의 증명할 수 없습니다.

마지막으로 예외가없는 규칙은 없습니다. 암시 적 병렬 처리는 코드가 벡터화되는 경우 (AVX, Altivec 등의 SIMD 명령어 세트 사용)와 관련하여 스레드가없는 경우에 작동합니다. 실제로 증명하기 쉬운 소규모 병렬 처리에 가장 효과적입니다.


0

프로그래머는 순차적으로 생각하며 현재 언어는 해당 모델을 지원하도록 만들어졌습니다. Haskell Erlang 등과 같은 프린지 언어를 제외하고, 언어 (형용사 "현대"를 사용하지 말 것)는 컴퓨터가 무엇을해야하는지, 언제 어떻게해야하는지, 어떻게해야 하는지를 말해주는 기본적으로 높은 수준의 어셈블리입니다. 컴퓨터에 원하는 결과를 제공 할 수있는 에코 시스템이있을 때까지 프로그래머는 멀티 스레딩 기능을 최대한 활용할 수있는 정신적 능력이 없습니다.

즉 자연스럽지 않습니다 ......


프로그래머는 프로그래밍 언어가 프로그램을 장려하는 방식으로 프로그래밍하는 것처럼 자신의 생각을 어떻게 배웠는지 생각합니다. 프로그래머가 소위 프린지 언어에 노출되지 않으면 문제에 대한 다른 추론 방법이 있다는 것을 배우지 못할 것입니다. 많은 사람들이 추천하는 목록 에서 7 주 동안 7 개 언어 가 높은 이유라고 생각 합니다.
Mark Booth

아마도 fringe는 잘못된 단어 일 것입니다. 상용 응용 프로그램에서 널리 사용되지 않는 언어를 의미했습니다 (예 : C ++ 또는 Java가 아님).
mattnz

1
그러나 나는 사람들로서 프로그래머가 멀티 스레딩과 거대한 parrallisum을 실제로 "얻을"수있는 금속의 양을 가지고 있지 않다는 내 주장에 동의한다. 동시에 하나 이상의 작업을 수행하는 것은 인간의 본성이 아닙니다. 시간 관리에 관한 모든 책은 무언가를 시작하는 개념을 장려하고 마치고 다음에 할 일을합니다. 이러한 패러다임을 효율적이고 효과적으로 사용하려면 현재 사용할 수없는 대규모 도구 지원이 필요합니다. 소수는 그것을 "얻고"이러한 도구를 개발해야합니다.
mattnz

1
그래도 don't have the patience더 정확한 평가 라고 생각 don't have the mental capacity합니다. 내 경력을 통해, 나는 어리석은 사람들 보다 많은 게으른 프로그래머를 보았습니다 . 나는 운이 좋았고, 첫해에 대학에서 첫 번째로 절차 적 절차와 OO를 따라 기능 프로그래밍과 세분화 된 병렬 프로그래밍을 배웠습니다. 나는 많은 프로그래머들이 그렇게 운이 좋지 않았고 그들의 사고 과정이 곧바로 진행되었다고 생각합니다.
Mark Booth

0

트랜잭션은 ACID 여야하므로 프로그래머는 주로 하나의 스레드에 대해 생각하는 경향이 있습니다.

언어와 플랫폼은 프로그래머가 가능한 한 동시성으로부터 프로그래머를 보호해야합니다.

그리고 동시성은 기능 자체만큼 테스트하기 쉽지 않으므로 프로그래머는 이러한 문제 외에도 떠나는 경향이 있으며 커밋 동시성 처리에 대해 생각하지 않고 실수는 무엇입니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.