저는 현재 내가 관리하는 시뮬레이션 도구를 위해 C++ 스파 스 매트릭스/수학/반복 솔버 라이브러리에서 작업하고 있습니다. 그러나 기존의 패키지를 사용하기를 원했을 것입니다. 그러나 광범위하게 조사한 후에 우리 시뮬레이터에 적합한 어떤 것도 발견되지 않았습니다 (우리는 플렉스, PetSC, 고유 및 기타 여러 가지를 보았습니다). 좋은 소식은 내 솔버와 스파 스 매트릭스 구조가 매우 효율적이고 견고하다는 것입니다. 나쁜 소식은, OpenMP를 사용하여 병렬 처리를 연구하고 학습 곡선이 약간 가파른 점입니다.OpenMP를 사용한 여러 수준의 병렬 처리 - 가능합니까? 똑똑한? 실용적인?
우리가 해결 한 도메인은 블록 대각선 형식으로 모여있는 하위 도메인으로 나눌 수 있습니다. 그래서 우리의 저장 방법은 서브 도메인 (예 : 압축 된 행 저장소 : CRS, 압축 대각선 저장소 : CDS, 밀도 등)에 적합한 형식으로 각각의 작은 사각형 행렬 (블록 []) 및 하위 도메인 간의 연결성을 설명하는 배경 매트릭스 (현재 CRS 사용).
대부분의 (모든?) 반복 솔버에서 "핫스팟"은 매트릭스 벡터 곱셈 연산이며 이는 내 라이브러리에도 해당됩니다. 따라서 저는 MxV 루틴을 최적화하는 데 주력했습니다. 블록 대각 구조로 될 M * X = B에 대한 의사 코드는 다음과
가b=background_matrix*x
start_index = 1;
end_index = 0;
for(i=1:number of blocks) {
end_index=start_index+blocks[i].numRows();
b.range(start_index, end_index) += blocks[i] * x.range(start_index, end_index);
start_index = end_index+1;
}
background_matrix 백그라운드 인
은 (CRS) 행렬 블록은 서브 도메인 매트릭스 어레이 및 .range이고 시작 인덱스에서 종료 인덱스까지 벡터 부분을 반환합니다.
분명히 루프는 병렬 처리가 가능하며 루프의 다른 반복과는 독립적입니다 (범위는 겹치지 않습니다). 일반적인 시스템에 10-15 개의 블록이 있기 때문에 실제로 4+ 스레드가 큰 차이를 만듭니다.
병렬 처리가 좋은 옵션으로 여겨지는 다른 장소는 각 하위 도메인 저장소 체계 (위의 코드에서 1 번과 6 번에서 호출)에 대한 MxV 작업입니다. 병렬화 CRS, CDS 및 조밀 한 행렬 MxV 조작에는 많은 것들이 있습니다. 일반적으로 스레드 2 개를 추가하면 더 많은 스레드가 추가되므로 성능이 크게 향상됩니다.
나는 위의 코드에 대해 블록 루프에서 4 개의 스레드가 사용되고, 각 스레드는 하위 도메인 해결을 위해 2 개의 스레드를 사용한다는 계획을 세우고 있습니다. 그러나 OpenMP를 사용하여 스레드 풀을 관리하는 방법을 알 수는 없습니다. openmp for 루프에서 스레드 수를 제한 할 수 있습니까? 이 다중 레벨 병렬 처리가 실제로 의미가있는 것입니까? (마지막에 모든 방법을 읽어 주셔서 감사!) 다른 주시면 감사하겠습니다 제가 여기에 제안했습니다에 대한 생각
어떤 솔버를 사용 했습니까? – Jacob
@ Jacob- 내가 해결하고있는 시스템에는 CRS의 jacobi-preconditoned GMRES, CDS에서의 ICC 사전 조건화 된 CG 해결법 또는 직접 조밀 한 해결 방법을 사용하여 가장 효율적으로 해결되는 여러 가지 유형의 하위 도메인이 있습니다. 각 하위 도메인을 최대한 활용하기 위해 GMRES를 글로벌 시스템에서 해결했습니다. 1 단계 겹치지 않는 Additive Schwarz 선행 조건 연산자를 사용했습니다. 선행 조건에서 로컬 해석이 적절한 해석 알고리즘 인 경우 서브 도메인 형 – MarkD
다소 큰 시스템을 해결하려는 경우 또는 이러한 솔루션을 더 빨리 원할 때 고려해야 할 사항은 무엇입니까?OpenMP는 단일 공유 메모리 노드에 적합하지만 크기를 늘리거나 단순히 계산 시간을 단축하기 위해 지나치게되면 곧 확장 할 수있는 다른 것을 원하게 될 것입니다. 내 연구실에서 개발 한 것들을 제안 하겠지만 (프로필 참조), 이미 OpenMP에 대해 가파른 학습 곡선이 있다고 언급했습니다. 우리의 소프트웨어는 슬프게도 더 가파르지 만 자연스럽게 물건을 표현할 수있는 몇 가지 구조를 가지고 있습니다. – Novelocrat