具有用户功能的数据库上的 Matlab parfor

标签 matlab parallel-processing parfor

我有一组图像 (~10^7),它们包含在一个巨大的二进制文件中。我想使用我已有的功能有效地阅读和分析它们。代码中该用户函数 foo 的每次迭代大约需要 0.1 秒,因此代码使用读取数据库的简单 for 循环处理整个数据库需要几天时间:

... 
for image_number=1:N
     offset_in_bytes = npoints_per_image*element_size*(image_number-1);
     fseek(fid, offset_in_bytes, 'bof'); 
     s=fread(fid, npoints_to_load,'ushort');
     image=reshape(s,nrows,[]);
     [outputs]=foo(image)
end

我已经尽可能地优化函数 foo(尽可能对代码进行矢量化,使用正确的数据类等)。我唯一还没有做的是创建一个 mex 版本。我想为此使用 parfor,但我无法让它工作。虽然每个图像都是独立的,但上面的代码串行读取数据,所以我不能真正并行化它。如何使 parfor 选项可以访问此代码和数据库? 谢谢

最佳答案

要有效地并行运行此循环,您需要能够并行运行 FREAD 部分和 foo 部分。您可以通过将 FREAD 替换为对 MATLAB 的 RAND 之类的虚拟调用来检查 foo 部分是否并行运行。

请注意,matlabpool worker 在单线程模式下运行。如果您在一台机器上运行所有 worker,这一点尤其重要。如果 foo 能够很好地利用 MATLAB 的内在多线程,那么使用 PARFOR 循环可能会使速度变慢。

我怀疑如果您只有一个大图像文件,那么您的文件系统可能会或可能不会让您完全并行访问它。我不确定如何最好地解决这个问题 - 它几乎肯定取决于您的特定文件系统。

关于具有用户功能的数据库上的 Matlab parfor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15084023/

相关文章:

matlab - 从序列中过滤短长度的变化 (MATLAB)

python - 将 MATLAB 转换为 Python : too many indices return error

Matlab 使用私钥文件验证 FTP

matlab - 创建基于另一个向量的重复值上升的向量 (MATLAB)

python - 并行运行一个又一个 exe

parallel-processing - FPGA 中的 Altera OpenCL 并行执行

linux - 在并行处理中使用 awk 获取语法错误

matlab - Matlab中并行循环中的不同(伪)随机数

Matlab:从 parfor 循环打印进度

Matlab R2015b 与 R2015a - parfor 循环中的表 - 违反透明度