我在Matlab中遇到了'parfor'的奇怪问题。大多数情况下代码运行正常。但在其他一些情况下,当输入改变时,Parfor似乎“死了”。即使我等了整整一天也没有终止 - 将它改为For只需1小时(通常如果Parfor工作则需要大约20分钟)。
没有错误代码。我无法进入parfor调试。可能会发生什么?
我没有任何嵌套For For Parfor。没有切片的指数。虽然我确实调用了一些从C编译的简单mex函数。
答案 0 :(得分:1)
实际上,我认为我对此有一个粗略的答案。
答案在于从C编译的mex函数,这些函数在Parfor中调用。这些函数编写得不是很好,有许多全局指针。我认为Parfor有8名工人,不得不划分内存,有些东西搞砸了mex文件。它不会像For一样经常发生,但我发现它有时会发生。
代码全部挂断的原因是因为有一行说:如果某些东西是NaN,那么暂停。暂停不应该是因为多个工人不知道如何处理它。因此我认为parfor循环就像一个无限循环。
请注意以下内容:demand_full是一个mex文件,当我将'pause'更改为'print circ'时,错误发生时都是NaN。
for j = 1:NDRAWS
pmat_temp = 1:mkt;
parfor i = 1:mkt
tauvec = [zeros(1, numD(i)) ones(1, numR(i))];
[circ] = demand_full(prices{i}, tauvec, rhoarray(i, j), theta);
y = log(mean_mat2D_c(circ(tauvec==1))) - log(mean_mat2D_c(circ(tauvec==0)));
pR = exp(rho_param1 + rho_param2 * rhoarray(i, j))...
/ (1 + exp(rho_param1 + rho_param2 * rhoarray(i, j)));
lambda = exp(n_param1 + n_param2 * log(hhld(i)) + n_param3 * rhoarray(i, j) + n_param4 * rhoarray(i, j)^2);
pN = lambda^(length(tauvec)) / exp(lambda) / factorial_c(length(tauvec));
p_market_config_temp = nchoosek_c(length(tauvec), numR(i)) * pR^numR(i) * (1 - pR)^numD(i);
p_market_config = pN * (p_market_config_temp / (1 - pR^length(tauvec) - (1 - pR)^length(tauvec)));
pmat_temp(i) = p_market_config * 1/sigma_q / sqrt(1/numR(i) + 1/numD(i)) * ...
exp(-((yhat(i) - y) / sqrt(1/numR(i) + 1/numD(i)))^2 / 2 / sigma_q^2);
if isnan(pmat_temp(i))
pause
end
end
pmat(:, j) = pmat_temp;
end