병렬 프로그래밍 예제

4장에서는 데이터 흐름 그래프로 결정적 병렬처리 프로그래밍을 위한 간단한 API인 Par monad를 접했습니다. Pario라는 Par monad의 또 다른 버전이 있습니다, 파에서 두 가지 중요한 차이점을 Control.Monad.Par.IO 모듈에 의해 제공:[48] 우리는 병렬 알고리즘의 네 가지 예를 제시하여이 장을 마무리합니다. 우리는 이러한 알고리즘이 파생되는 프로세스 또는 효율성에 대해 여기에 자신을 염려하지 않습니다. 이러한 문제는 각각 2장과 3장에서 논의됩니다. 목표는 단순히 병렬 알고리즘과 작업 및 채널 의 관점에서 설명을 소개하는 것입니다. 주류 병렬 프로그래밍 언어는 명시적으로 병렬 또는 (기껏해야) 부분적으로 암시적으로 유지되며 프로그래머는 병렬화를 위해 컴파일러 지시문을 제공합니다. SISAL, 병렬 하스켈, 시퀀스L, 시스템 C(FPGA용), Mitrion-C, VHDL 및 Verilog와 같은 몇 가지 완전히 암시적인 병렬 프로그래밍 언어가 존재합니다. 이 자습서의 컨텍스트에서 MPI의 복잡성, 범위 및 제어 측면에서 Pthread를 사용한 프로그래밍 사이에 앉아 있고 OpenMP와 같은 고급 API를 사용하는 것으로 생각할 수 있습니다. 명령 1B가 1A와 3A 사이에 실행되는 경우 또는 명령 1A가 1B와 3B 사이에서 실행되는 경우 프로그램은 잘못된 데이터를 생성합니다. 이를 레이스 조건으로 알려져 있습니다.

프로그래머는 상호 제외를 제공하기 위해 잠금을 사용해야 합니다. 잠금은 한 스레드가 변수를 제어하고 해당 변수가 잠금 해제될 때까지 다른 스레드가 변수를 읽거나 쓰지 못하도록 하는 프로그래밍 언어 구문입니다. 잠금을 보유한 스레드는 임계 섹션(일부 변수에 대한 단독 액세스가 필요한 프로그램의 섹션)을 자유롭게 실행하고 작업이 완료되면 데이터의 잠금을 해제할 수 있습니다. 따라서 올바른 프로그램 실행을 보장하기 위해 위의 프로그램을 다시 작성하여 잠금을 사용할 수 있습니다. 기본적으로 for 루프의 OpenMP 루프 구문(이 경우 i 변수)의 루프 반복 카운터는 전용 변수로 설정됩니다. 세분성에 대한 한 가지 해결책은 청크이며, 여기서 더 큰 작업 덩어리를 만들어 그레인 크기를 늘립니다(K-Means 병렬화에서 K-Means 예제와 함께 이 기술을 사용했습니다). 그러나 여기서 계산은 나무 모양이므로 쉽게 청크할 수 없습니다. 깊이 임계값은 예제: 회의 시간표에서 보았듯이 분할 및 정복 알고리즘에 더 적합하지만 여기서 문제는 트리 모양이 파일 시스템 구조에 종속되므로 자연스럽게 균형을 이루지 못한다는 것입니다.

트리는 매우 불균형할 수 있으며 대부분의 작업은 하나의 깊은 하위 디렉터리에 집중될 수 있습니다. (독자는 프로그램에 깊이 임계값을 추가하고 얼마나 잘 작동하는지 확인하기 위해 실험을 시도하도록 초대됩니다.) 병렬 컴퓨터를 프로그래밍하기 위해 동시 프로그래밍 언어, 라이브러리, API 및 병렬 프로그래밍 모델(예: 알고리즘 스켈레톤)이 만들어졌습니다.

This entry was posted in Uncategorized. Bookmark the permalink.

Comments are closed.