2013-07-29 10 views
2

Intel MKL 라이브러리를 사용하여 복수의 오른쪽 (rhs) 벡터가있는 선형 방정식 시스템 (A*x = b)을 풀고 있습니다. rhs 벡터는 비동기 적으로 생성되며 별도의 루틴을 통해 생성되므로 한꺼번에 해결할 수 없습니다.mkl_dss_solve의 여러 인스턴스에서 하나의 LU 인수 분해 사용

프로그램을 신속하게 처리하기 위해 각 스레드가 단일 rhs 벡터를 해결할 책임이있는 다중 스레드 프로그램이 사용됩니다. 행렬 A은 항 s 상수이기 때.에, LU 인수 분해가 한 번 수행되어야하며 인수는 모든 스레드에서 후속 적으로 사용됩니다. 그래서, 다음 명령

dss_factor_real(handle, opt, data); 

를 사용하여 A을 고려하고 다음 명령을 사용하여 문제를 해결하기 위해 스레드에 핸들을 전달 그러나

dss_solve_real(handle, opt, rhs, nRhs, sol); 

을 나는 발견 그것은에 - 스레드로부터 안전하지 않습니다 것을 동일한 handledss_solve_real의 여러 경우에 사용하십시오. 분명히, 어떤 이유로 MKL 라이브러리 변경은 경쟁 조건을 만드는 각 인스턴스에서 처리합니다. 나는 MKL 매뉴얼을 읽었지만 관련있는 것을 찾을 수 없었다. 각 스레드에 대해 A을 인수 분해하는 것은 논리적이지 않으므로이 문제를 극복하고 모든 곳에서 동일한 handle을 사용하는 방법이 있는지 궁금합니다. 당신의 도움에 미리

감사

답변

1

지금까지 내가 DSS 인터페이스를 이해, handle하지가 dss_solve_real에 사용되는 수정만을 LU 인수 분해뿐만 아니라 다른 데이터 구조를 포함하지; 이것은 설계 상으로는 잠금 메커니즘을 사용하여 을 동시에 handle에 호출하는 다중 스레드를 방지해야합니다.

또한 dss_solve_real이 직렬 인 경우 (그렇지 않은 경우 왜 여러 인스턴스를 동시에 호출해야하는지 이해할 수 없다) 아마 잘못된 것입니다. DSS는 PARDISO 솔버에 대한 인터페이스입니다.이 솔루션은 인수 분해가 아닌 모든 단계에서 병렬이어야합니다.

편집

DSS에 인터페이스를 포기하고 직접 PARDISO 호출

, 직렬 하나 우 각 해결 많은 스레드를 가질 수 있어야한다. (쉽지는 않지만 신중한 프로그래밍으로 가능해야합니다 ...)

그러나 최대 처리량 (단위 시간당 rhs)과 최소 대기 시간 (단일 rhs 시작됨) 최선의 접근법은 병렬 솔버에 대한 단일 호출로 대기열에서 대기중인 모든 rhs를 해결하는 단일 작업 스레드를 갖는 것입니다. 물론 대기열은 rhs 벡터가 연속적인 메모리 영역에 저장되도록 구성되어야합니다.

+0

감사합니다. 나는 어떤 가정도하지 않는다 (직렬 또는 병렬). 실제로 RHS 벡터는 대기열에서 비동기 적으로 전달됩니다. RHS 벡터가 준비 될 때마다 자유 근로자 (스레드)가 특정 RHS 벡터에 대한 문제를 해결하기 위해 사용됩니다. 이제 dss_solve_real이 핸들을 변경한다고 확신합니다. 핸들을 잠그고 싶다면 쓰레드를 사용하는 것이 정당화되지 않습니다. – Pouya

+0

편집을 참조하십시오. 저는 여전히 여러 스레드가 rhs를 해결하는 것이 효율적이지 않다고 생각합니다. 직렬 해결 단계를 수행 할 수 있다고해도 말입니다. –