암시적인 병렬 처리 ^ 는 많은 프로그래머들로부터 큰 부담을 덜어 컴퓨터에 배치 할 수 있습니다. 그렇다면 ... 왜 현재는 더 널리 퍼져 있지 않습니까?
^ 암시 적 병렬 처리는 스레드 등을 사용하여이 작업을 수행해야하는 프로그래머 대신 컴퓨터가 한 번에 둘 이상의 작업을 수행하는 방법을 스스로 파악할 수 있도록하는 것입니다.
암시적인 병렬 처리 ^ 는 많은 프로그래머들로부터 큰 부담을 덜어 컴퓨터에 배치 할 수 있습니다. 그렇다면 ... 왜 현재는 더 널리 퍼져 있지 않습니까?
답변:
몇 가지 예외 (Haskell)를 사용하면 컴파일러가 루프를 풀 수있는 방법이 없습니다. 문제는 루프를 반복 할 때마다 전역 상태를 수정할 수 있다는 것입니다. 따라서 다른 순서로 수행하면 문제가 발생할 수 있습니다. haskell에서는 순수한 함수, 즉 전역 상태를 읽거나 변경하지 않으므로 어떤 순서로든 실행할 수 있다고 말할 수 있습니다.
실제로 문제는 몇 가지 예외가 있지만 동시성을 잘 수행하는 방법은 여전히 공개 된 문제입니다. Erlang과 Haskell 커뮤니티는 꽤 잘하고있는 것처럼 보이지만 큰 N을 위해 N- 코어 시스템을 프로그래밍하는 방법을 이해하기 전에 아직 갈 길이 멀다.
현재 사용중인 대부분의 프로그래밍 언어는 단일 스레드 프로그래밍 및 단일 사용자 상호 작용이 많은 응용 프로그램 (예 : 독립형 데스크톱 응용 프로그램)에 가장 많이 사용되는 시점에 사용되었습니다. 웹 애플리케이션, 클라우드 컴퓨팅 및 다중 사용자 애플리케이션이 증가함에 따라 이제 더 많은 멀티 스레드 애플리케이션이 필요합니다.
레거시 프로그래밍 언어는 언어 자체에서 멀티 스레드 기능을 천천히 지원하려고합니다 (java가 java.util.concurrent를 추가 한 것처럼).
앞으로 나올 새로운 언어는 스레딩 및 동시성 지원 기능이 향상 될 것입니다.
다른 답변에서 언급 한 점 (작업이 독립적이며 프로그래머가 직렬 적으로 생각한다는 것을 입증하기는 어렵습니다) 외에도 병렬화 비용 이라는 세 번째 요소가 고려되어야 합니다.
진실은 스레드 병렬 처리와 관련된 비용이 매우 크다는 것입니다.
스레드 생성은 매우 비쌉니다. 커널에게 스레드를 시작하는 것은 프로세스를 시작하는 것과 거의 같습니다. 정확한 비용은 확실하지 않지만 10 마이크로 초 정도입니다.
뮤텍스를 통한 스레드 통신은 비용이 많이 듭니다. 일반적으로 각 측면에서 시스템 호출이 필요하므로 스레드를 휴면 상태로 만들고 다시 깨워 대기 시간과 콜드 캐시 및 플러시 된 TLB를 생성 할 수 있습니다. 평균적으로 뮤텍스를 복용하고 해제하는 데 약 1 마이크로 초가 소요됩니다.
여태까지는 그런대로 잘됐다. 이것이 암시적인 병렬 처리에 문제가되는 이유는 무엇입니까? 암시적인 병렬 처리는 소규모로 증명하기가 가장 쉽기 때문입니다. 간단한 루프의 두 반복이 서로 독립적이라는 것을 증명하는 것은 한 가지입니다 stdout
. 데이터베이스에 무언가를 인쇄 하고 쿼리를 데이터베이스에 보내는 것은 서로 독립적이며 병렬로 실행될 수 있음 을 증명하는 것은 완전히 다른 것입니다 ( 데이터베이스 프로세스는 파이프의 다른쪽에있을 수 있습니다!).
즉, 병렬 처리 비용이 병렬 처리의 이점보다 높기 때문에 컴퓨터 프로그램이 입증 할 수있는 암시 적 병렬 처리는 불가능할 수 있습니다. 반면에 실제로 응용 프로그램을 가속화 할 수있는 대규모 병렬 처리는 컴파일러에 적합하지 않습니다. CPU가 마이크로 초 내에 얼마나 많은 작업을 수행 할 수 있는지 생각해보십시오. 이제 병렬화가 직렬 프로그램보다 빠르면 병렬 프로그램은 두 뮤텍스 호출 사이에서 몇 마이크로 초 동안 모든 CPU를 사용 중 상태로 유지할 수 있어야합니다. 이를 위해서는 실제로 거친 병렬 처리가 필요하며 자동으로 거의 증명할 수 없습니다.
마지막으로 예외가없는 규칙은 없습니다. 암시 적 병렬 처리는 코드가 벡터화되는 경우 (AVX, Altivec 등의 SIMD 명령어 세트 사용)와 관련하여 스레드가없는 경우에 작동합니다. 실제로 증명하기 쉬운 소규모 병렬 처리에 가장 효과적입니다.
프로그래머는 순차적으로 생각하며 현재 언어는 해당 모델을 지원하도록 만들어졌습니다. Haskell Erlang 등과 같은 프린지 언어를 제외하고, 언어 (형용사 "현대"를 사용하지 말 것)는 컴퓨터가 무엇을해야하는지, 언제 어떻게해야하는지, 어떻게해야 하는지를 말해주는 기본적으로 높은 수준의 어셈블리입니다. 컴퓨터에 원하는 결과를 제공 할 수있는 에코 시스템이있을 때까지 프로그래머는 멀티 스레딩 기능을 최대한 활용할 수있는 정신적 능력이 없습니다.
즉 자연스럽지 않습니다 ......
don't have the patience
더 정확한 평가 라고 생각 don't have the mental capacity
합니다. 내 경력을 통해, 나는 어리석은 사람들 보다 많은 게으른 프로그래머를 보았습니다 . 나는 운이 좋았고, 첫해에 대학에서 첫 번째로 절차 적 절차와 OO를 따라 기능 프로그래밍과 세분화 된 병렬 프로그래밍을 배웠습니다. 나는 많은 프로그래머들이 그렇게 운이 좋지 않았고 그들의 사고 과정이 곧바로 진행되었다고 생각합니다.