2017-12-19 28 views
2

내 랩톱에서 정상적으로 작동하지만이 문제가 대규모로 발생하는지 궁금합니다. 매우 큰 배열을 채우고 싶다고 가정합니다. 그러나 각 항목은 대형 분산 된 행렬에 강렬한 행렬 연산이 필요합니다. 다음과 같은 디자인을 고수해야할까요?채플에서 forall을 사용하여 배열 채우기

var x: [1..N] real; 

forall i in [1..N] { 
    x[i] = reallyHeavyMatrixComputation(i); 
} 

정상적인 유지를위한 요령이 있습니까? x 또는 그 외 도메인에 dmapped을 사용해야합니까?

+0

모든 점을 고려하여 질문하려고하는 문제점은 무엇입니까? '[PSPACE]'-motivated 분산 매트릭스 스토리지와 ** 고의적으로 불리한''{{P | EXP} TIME]'스케일 페널티 **가 알려진 불리한 [** {P | EXP} TIME] } TIME]'-scaled penalty ** (다시 [PSPACE]'-motivated) 행렬에 대해 재구성 된 희소 표현 형식을 사용합니까? 그러나이 두 가지 모두가 규모면에서 그 방향으로 나아간다면 비용을 지불하는 것이 좋습니다. 나는 다른 점을 놓쳤는가? – user3666197

+4

빠른 참고 : 아마도 foralli in 1.N이나'forall in in x.domain'의 관용적 패턴을 사용하고 싶을 것입니다. '[1 ..N]'은 하나의 원소를 가진 배열이다. 범위는'1..N'이다. – benharsh

답변

3

Chapel의 forall 루프는 여러 로케일로 확장 할 수 있지만 루프의 본문뿐만 아니라 반복되는 항목에 따라 달라집니다.

보다 자세히는 "몇 개의 작업을 사용해야합니까?"와 같은 주요 병렬 루프 정책이 있습니다. 그리고 "그 작업은 어디에서 실행되어야합니까?" 루프의 iterand에 의해 제어됩니다. 예를 들어, 다음 루프 :

var x: [1..N] real;      // declare a local array 

forall i in 1..N do      // iterate over its indices in parallel 
    x[i] = reallyHeavyMatrixComputation(i); 

루프의 iterand의 범위 1..N입니다. 기본적으로 범위의 반복자는 현재 로케일의 프로세서 단위/코어 수와 동일한 수의 로컬 태스크를 작성합니다. 결과적으로, 위의 루프는 reallyHeavyMatrixComputation() 자체가 지능적인 방식으로 로케일 전체에 계산을 분산하는 on-clause를 포함하지 않는 한 더 많은 로케일이 사용되면 더 빠르지 않을 것입니다. on-clause를 전혀 포함하지 않았다면 계산은 로케일 # 0을 떠나지 않고 공유 메모리 만 될 것입니다.

대조적으로 forall 루프를 사용하여 분산 도메인이나 배열을 반복하는 경우 기본 정책은 일반적으로 각 대상 로캘에서 해당 소유자의 해당 로캘에있는 프로세서 코어 수와 동일한 수의 작업을 실행합니다 - 컴퓨터 "패션. 즉, 각 로켈은 자신이 소유 한 반복의 하위 집합을 배포에 따라 결정합니다. 병렬 루프 로케일 인덱스를 실행할 것이다 나눌 각 지역에 태스크를 생성 할 수 있도록

use CyclicDist;       // make use of the cyclic distribution module 

var D = {1..N} dmapped Cyclic(startIdx=1); // declare a cyclically distributed domain 
var x: [D] real;       // declare an array over that domain 

forall i in D do       // iterate over the domain in parallel 
    x[i] = reallyHeavyMatrixComputation(); 

D'의 인덱스

는 로케일에 걸쳐 순환 적으로 분배한다 : 예를 들어, 루프가 주어. 결과적으로이 루프는 reallyHeavyMatrixComputation()이 완전히 로컬 계산 인 경우에도 여러 로캘로 확장되어야합니다.

Chapel에서 확장 가능한 병렬 루프를 작성하는 또 다른 방법은 로캘 자체에서 작업을 배포하는 명시 적 병렬 반복기를 호출하는 것입니다. 예를 들어 Chapel 버전 1.16에는 작업을 배포 할 반복자를 제공하는 distributed iterators 패키지 모듈이 추가되었습니다.

use DistributedIters;     // make use of the distributed iterator module                   

var x: [1..N] real;     // declare a local array 

forall i in distributedDynamic(1..N) do // distribute iterations across locales 
    x[i] = reallyHeavyMatrixComputation(i); 

는 다음 distributedDynamic 반복자의 호출이 루프의 iterand 대신의 범위 1..N 및 제어 작업 생성 될 것입니다 : 그것은으로 재 작성된 경우, 제 1 실시 예에 반환. 이 반복자는 지정된 청크 크기 (기본적으로 1)를 사용하여 반복적으로 로케일을 동적으로 처리하므로 여러 로케일을 확장 가능한 방식으로 사용하는 데 사용할 수 있습니다. 자세한 내용은 its documentation을 참조하십시오.

+0

'distributedDynamic'과'dmapped' 버전의 장단점에 대해 설명해 주시겠습니까? –

+1

(i) 색인 세트에서 로케일로의 자연 분해가 있고 (ii) 분해가 적정하게로드 균형 조정 된 경우 (즉, 각 로케일의 색인 수와 'reallyHeavyMatrixComputation()'이 합리적으로 일관성이 있다면),'dmapped '버전은 오버 헤드가 낮기 때문에 아마도 최상일 것입니다. 'distributedDynamic' iterator는 잡다한 "더 많은 작업을하고 배포하는 방법이 없다"는 의미로, 리소스가 사용 가능 해짐에 따라 순진하게 작업을 수행합니다. – Brad