2012-01-16 3 views
2

이상한 문제가 있습니다. 나는 OpenMP 지시문/함수를 사용한 Matlab mexfunction을 가지고있다.만든 스레드 수는 12이지만 여전히 12 코어 CPU 중 하나의 코어에서만 실행됩니다.


nP = omp_get_num_procs(); 
omp_set_num_threads(nP); 
mexPrintf("\n Num of threads= %d\n",nP); 
. 
. 
. 
#pragma omp parallel for shared(...) 

문제는 그것이 출력에서이다 : 병렬 섹션 (병렬 ...)의 시작하기 전에, 내가 만든 스레드의 수를 설정하고 인쇄 명령을 사용하여 '스레드 수 = 12'를 인쇄하지만, 다음 병렬 섹션은 내 컴퓨터의 12 개 코어 모두에서 실행되지 않습니다 (단 1 코어 만). 내 프로그램은 오래 전에 작성되었으며 이전에는 그런 문제가 없었습니다 (12 개 코어 모두에서 실행되었습니다). 최근에 시스템이 손상되어 OS (Win 7 Pro)가 Matlab 2011b의 업데이트 된 버전으로 다시 설치되었습니다 (2010b 이전). Visual Studio 2010 Pro도 설치했습니다.

내가 놓치거나 간과하는 것이 있습니까?

+0

하나의 코어 만 사용하도록 Windows를 구성 했습니까? http://www.sevenforums.com/tutorials/66504-processors-limit-number-used-windows-7-a.html. Windows Server 2008에는 사용 된 코어 수를 구매 한 에디션에 따라 제한이 있습니다 (http://www.directionsonmicrosoft.com/sample/DOMIS/update/2008/02feb/0208ws2plp_ch.htm). –

+0

@AloisKraus : Windows 7 Pro는 두 개의 실제 프로세서 소켓 (및 많은 코어/소켓)을 지원합니다. –

답변

0

omp parallel for 블록 안에 mex 함수를 호출하고 있습니까?

필자는 포인터를 먼저 순차적으로 추출한 다음 병렬로 처리하고 그 결과를 마지막에 순차적으로 matlab 변수에로드했습니다. 그런 식으로 병렬 코드는 순수한 C++이고 mex 함수는 호출되지 않습니다 (공유 잠금을 기다릴 수는 없습니다).

물론 OpenMP를 사용하여 실제로 컴파일해야합니다. 그렇지 않으면 지시문이 무시되고 순차적 코드로 끝납니다.