在使用 parfor 时,每个工作进程都有自己的工作空间,因此无法直接访问主线程中定义的变量。如果需要在 parfor 循环中使用临时变量,可以使用以下方法:

  1. 将临时变量作为 parfor 循环的输入参数传递给工作进程。
parfor i = 1:n
    temp = i * 2; % 定义临时变量
    result(i) = myFunction(temp); % 将临时变量作为输入参数传递给工作进程
end
  1. 在 parfor 循环内部使用 spmd 语句,将临时变量作为共享变量传递给工作进程。
parfor i = 1:n
    spmd
        temp = i * 2; % 定义共享变量
    end
    result(i) = myFunction(temp); % 在 parfor 循环中使用共享变量
end
  1. 在 parfor 循环外部定义临时变量,并在循环内部使用索引变量来访问它们。
temp = zeros(1, n); % 在 parfor 循环外部定义临时变量
parfor i = 1:n
    temp(i) = i * 2; % 在循环内部使用索引变量访问临时变量
    result(i) = myFunction(temp(i));
end
  1. 使用 parfor 循环的 reduction 选项来计算临时变量的总和、平均值等聚合结果。
parfor i = 1:n
    temp(i) = i * 2; % 计算临时变量
end
total = sum(temp, 'double'); % 使用 reduction 选项计算总和

需要注意的是,parfor 循环中的临时变量必须是可重复使用的,即在每个迭代中都需要进行初始化。否则,由于并行计算的不确定性,可能会导致意外的结果。

  1. 可以使用 MATLAB 中的 repmat 函数或者 bsxfun 函数将变量扩展成和 parfor 循环中的索引变量相同的大小,然后通过索引访问临时变量。
temp = repmat(temp, [n 1]); % 将变量扩展成和 parfor 循环中的索引变量相同的大小
parfor i = 1:n
    result(i) = myFunction(temp(i));
end
  1. 可以使用 MATLAB 中的 spmd 语句将需要共享的临时变量传递给工作进程。在 spmd 语句内部,变量会被自动转换为分布式数组,可以通过索引和其他基本操作来访问。
spmd
    temp = zeros(1, n); % 定义共享变量
end
parfor i = 1:n
    spmd
        temp(i) = i * 2; % 在 spmd 语句内部使用共享变量
    end
    result(i) = myFunction(temp(i)); % 在 parfor 循环中使用共享变量
end
  1. 可以将临时变量存储到 MATLAB 的共享内存中,在 parfor 循环内部使用 mex 函数来读写这些变量。这种方法需要自己编写 mex 函数,并且需要特别小心共享内存竞争问题。
mexFunction(temp); % 将临时变量存储到共享内存中
parfor i = 1:n
    result(i) = mexFunction(i); % 在 parfor 循环内部使用 mex 函数读取临时变量
end

需要注意的是,在使用以上方法时,要确保临时变量的存储空间足够大,否则可能会因为内存不足而导致程序崩溃。同时也要注意线程间的竞争问题,避免出现数据混乱或者无法预期的结果。

Parfor 循环中的临时变量问题及解决方法

原文地址: https://www.cveoy.top/t/topic/jGDF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录