2012-04-20 1 views
0

현재 MATLAB 2012a의 parfor 함수를 사용하여 병렬로 실험을 실행하기 위해 MATLAB에서 MEX 파일을 코딩하고 있습니다. MEX 파일은 매우 간단한 수치 작업을 수행하지만 IBM의 CPLEX 12.4 API를 사용합니다.thread-safe API가 아닌 함수로 인해 병렬로 발생하는 분할 오류 해결

내 MEX 파일은 순차적으로 작동하지만 I will inevitably receive "random" segmentation fault when I run in in parallel. 세그먼테이션 결함의 스택 추적을 MATLAB에 보낸 후 그들은 C 라이브러리의 "putenv()"함수에서 오류가 발생했음을 제안했습니다. 이는 명백하게 스레드로부터 안전하지 않습니다.

필자는 MEX 코드에서 putenv() 함수를 사용하지 않지만 CPLEX 12.4에서 절대적으로 호출해야하는 함수 중 하나는이를 사용합니다. 이 함수의 결과로 발생하는 분할 오류를 피하기 위해 할 수있는 일이 있는지 궁금합니다. 누군가는 이전에 "내 비트 잠그기"와 "세마포어 사용하기"를 제안했지만 이러한 개념에 관해서는 정말 머리가 아프다.

모든 조언이나 지침은 매우 감사하겠습니다.

+1

IBM 지원 센터에 전화하여 2000 년 이후 시스템에서 효율적으로 사용할 수 있도록 lib를 수정하도록 알려주십시오. 라이브러리가 불투명하다고 생각합니다. 소스 코드가없고 다시 작성할 수 없습니까? –

답변

0

내 MATLAB 코드에서 CPLEX MATLAB API를 사용하고 동시에 MEX 코드에서 CPLEX C API를 사용하기 때문에 위반이 발생합니다. 두 API 모두 스레드로부터 안전하지 않은 putenv() 함수를 사용합니다. 특히 두 스레드가 putenv() 함수를 동시에 사용하려고 할 때마다 (MEX 파일 또는 MATLAB 코드에서) 충돌이 발생합니다.

수정 사항은 패키지를 사용하고 C 및 MATLAB에서 putenv()를 사용하는 함수 (즉, MATLAB의 C/Cplex()에서 CPXopenCPLEX)를 사용하여 mutex_lock/mutex_unlock을 추가하는 것입니다. mutex_lock/mutex_unlock을 생성하는 데 필요한 자세한 정보와 코드는 following post on the CPLEX forums

관련 문제