Matlab中的Parfor不会在不同的场合终止,但是For

时间:2011-10-27 21:44:49

标签: matlab parallel-processing

我在Matlab中遇到了'parfor'的奇怪问题。大多数情况下代码运行正常。但在其他一些情况下,当输入改变时,Parfor似乎“死了”。即使我等了整整一天也没有终止 - 将它改为For只需1小时(通常如果Parfor工作则需要大约20分钟)。

没有错误代码。我无法进入parfor调试。可能会发生什么?

我没有任何嵌套For For Parfor。没有切片的指数。虽然我确实调用了一些从C编译的简单mex函数。

1 个答案:

答案 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