2011-03-12 4 views
3

OpenMP를 사용하여 일부 긴 계산을 병렬로 수행하는 C++ 프로그램이 있습니다. 이제이 프로그램은 사용자 입력에 응답하고 그래픽을 업데이트해야합니다. 지금까지 메인/GUI 스레드에서 계산을 시작하여 작업 부하를 조심스럽게 밸런싱하여 OpenMP 스레딩 오버 헤드를 줄이거 나 길게 GUI가 응답하지 않게하지 않았습니다.OpenMP를 사용하는 프로그램에서 GUI 스레드 처리

분명히 모든 것을 동시에 실행하여 수정하고 싶습니다. 내가 알 수있는 한, OpenMP 2.5는이를 수행하는 좋은 메커니즘을 제공하지 않습니다. 나는 그것이 이런 종류의 문제를 의도하지 않았다고 가정한다. 또한 전체 코어를 GUI 스레드 전용으로 사용하고 싶지는 않으며, 단지 작업을 수행 할 때 10 %의 <이 필요합니다.

아마도 계산을 병렬 구문을 시작하는 별도의 pthread로 분리하는 것이이 문제를 해결하는 좋은 방법이 될 것이라고 생각했습니다. 이 코드를 컴파일했지만이 버그와 비슷한 pthread에서 호출 할 때 OpenMP 충돌이 발생했습니다 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36242. 한 번에 두 개 이상의 스레드에서 병렬 구조를 시작하려고 시도하지 않았 음에 유의하십시오. OpenMP는 프로그램 전체에서 하나의 pthread에서만 사용되었습니다.

OpenMP를 사용하여 동시에 GUI 작업을 예약하거나 pthread를 사용하여 병렬 구성을 동시에 실행할 수없는 것 같습니다. 나는 별도의 스레드에서 GUI 작업을 처리하는 것을 생각하고 있었지만 실제로는 내 경우에보기 흉하고 실제로 사용하는 다양한 라이브러리로 인해 작동하지 않을 수도 있습니다.

여기 텍스트 북 솔루션은 무엇입니까? 다른 사람들이 GUI/네트워킹 등을 동시에 처리해야하는 프로그램에서 OpenMP를 사용했지만 Google이나 OpenMP 포럼을 사용하여 정보를 찾을 수 없었습니다.

감사합니다.

+0

OpenMP를 사용해야합니까? 당신은 모든 것을 위해 pthread를 사용해 볼 수 있으며, "디스플레이"쓰레드와 "계산"쓰레드를 갖는 것은 쉽습니다. –

+1

물론 OpenMP를 사용하는 사람은 아무도 없습니다.하지만이 문제를 해결하고 OpenMP를 그냥 버리고 좀 더 자세한 수동 관리 스레드 풀로 대체하는 방법을 배웁니다. – ASD1

답변

0

교과서 솔루션이 없습니다. OpenMP 용 텍스트 북 응용 프로그램은 입력 파일을 읽고, 무거운 계산을 수행하고, 출력 파일을 쓰는 비대화 형 프로그램입니다. 모두 슈퍼 컴퓨터의 #CPU와 동일한 스레드 풀을 사용합니다. 그것은 대화 형 및 계산 코드의 동시 실행을 위해 설계되지 않았으며 어떤 스레드 라이브러리와도 interop이 사양에 의해 보장되는 것은 아니라고 생각합니다.

이론을 떠나서, OpenMP의 GCC 구현에 버그가 발생했습니다. GCC 관리자에게 버그 리포트를 보내주십시오. 다른 컴파일러를 찾거나 별도의 프로세스에서 GUI 코드를 실행하고 OpenMP 프로그램과 일부 IPC 메커니즘을 통해 통신하십시오. (예 : 소켓을 통한 비동기 I/O)

+0

이것은 OpenMP에서 기대했던 것입니다. 그러나 귀하의 예에서, 실제로 GUI 프로그램과의 통신을 구현하는 방법은 무엇입니까? 난 여전히 내 IPC 메커니즘을 비동기 적으로 실행하기위한 별도의 스레드가 필요하며, 데이터를 꺼내기 위해 OpenMP 스레드와 동기화해야합니다. 그리고 이것은 제가 이미 들어있는 것과 똑같은 위치에 놓여있는 것으로 보입니다. 연결된 'INVOLID'로 폐쇄되었으므로 정확한 문제를 다시 제기하는 데 많은 도움이되지 않을 것이라고 생각합니다. – ASD1

+0

@ ASD1 : 비동기 I/O를 위해 반드시 스레드가 필요하지는 않습니다. 당신은'poll' /'select'를 시도 할 수도 있고, 주 프로그램을 모니터/죽이기/재시작하기위한 신호, 여러 인스턴스 실행 등을 시도 할 수 있습니다. 얼마나 많은 상호 작용이 필요한지에 달려 있습니다. (내가 말했듯이, 다른 컴파일러를 시도해 볼 수도 있습니다. 인텔 C++은 선택 사항 일 수 있지만 제 경험상 AMD 코어에서 성능이 크게 떨어집니다.) –

+0

예, 통신을 위해 폴링 또는 aysnc 방법을 사용할 수 있지만 OpenMP의 엄청난 한계는 저의 현재 프로그램에 대한 확실한 포기와 앞으로의 모든 작업에 대한 포기가 될 것입니다.나는 단지 GUI/네트워킹/등의 스레드를 추가하기 위해 완전히 작동하는 프로그램이 있고 스레드 코드를 다시 작성해야하는 상황에 놓이기를 원하지 않습니다. 나는 수치 스럽다. 왜냐하면 OpenMP가 아주 깔끔하다고 생각했기 때문이다. – ASD1

관련 문제