macOS プラットフォームで生成された MEX がメモリに読み込まれたままの状態になる
問題
macOS プラットフォームで MEX コードを生成するときに、次のいずれかのメッセージを受け取ります。
警告メッセージ:
生成コード内の OpenMP スレッドがプライベート変数を使用しています。 これにより、MEX がメモリに読み込まれたままになる可能性があります。
エラー メッセージ:
MEX ファイル 'foo_mex' はまだメモリに読み込まれています。 MEX ファイルをメモリからクリアするには、MATLAB セッションを閉じてください。
原因
MATLAB® コードに parfor
ループの本体から到達可能なグローバル変数または永続変数が含まれています。こうしたコード パターンが含まれている MATLAB 関数の例を次に示します。
function y = foo(x) y = coder.nullcopy(x); parfor i = 1:numel(x) y(i) = x(i) + sub; end function y = sub persistent t; if isempty(t) t = 2; end y = t;
foo
の MEX 関数をはじめて生成する際に、警告メッセージを受信する可能性があります。
foo
のコードを再度生成することで生成した MEX を上書きしようとすると、エラー メッセージを受信する可能性があります。
解決法
警告メッセージを受信しても、生成された MEX 関数を使用できます。
エラー メッセージを受信した場合、現在の MATLAB セッションを閉じることで MEX 関数 foo_mex
をメモリからクリアします。以前に生成した MEX 関数を上書きするには、新しい MATLAB セッションを開いて、foo
の MEX コードを生成します。