【问题标题】:Is it possible to load data file in parallel to computation in Matlab without Mex是否可以在没有 Mex 的情况下在 Matlab 中与计算并行加载数据文件
【发布时间】:2013-10-24 17:19:06
【问题描述】:

我有一个 Matlab 程序,它从磁盘上的物理文件中读取大量数据并执行如下密集计算:

data = load('myfile.dat');
results = intensiveCompute(data);

计算是在 GPU 上完成的,需要很长时间。我想做的是能够在计算运行时从下一个文件加载数据(因为加载文件也是一个瓶颈)。从我目前收集的信息来看,使用 Mex 是可行的(例如 _beginthread 等......)。但是,如果可能的话,最好留在 Matlab 环境中。也许有一些方法可以在 Matlab 中产生一个线程来读取数据,另一个来执行计算。非常感谢任何帮助。

【问题讨论】:

  • 不会parfor 给你这种行为吗?
  • 也许我遗漏了一些东西,但是您将如何使用 parfor 并行执行 2 个不同的任务?顺便说一句,我已经将 chappjc 的解决方案标记为答案,但如果有一些巧妙的方法可以使用 parfor,那就太好了。

标签: multithreading matlab parallel-processing


【解决方案1】:

this answer 中,我详细介绍了一种使用taskjob 函数进行异步执行的方法,但我认为对于简单的loadparfeval 可能是最简单的。例如,

f = parfeval(@load,1,'myfile.dat'); % asynchronous, move on to intensiveCompute
results = intensiveCompute(data);
data = fetchOutputs(f); % Blocks until complete

注意:确保在 Windows 防火墙中允许 MATLAB.exe、smpd.exe 和 mpiexec.exe 的传入连接。您应该会在启动池的第一时间收到提示(由parfeval 自动启动)。

这里有一个简单的例子来说明它是如何工作的:

>> x = magic(5);
>> save x.mat x
>> f = parfeval(@load,1,'x.mat');
Starting parallel pool (parpool) using the 'local' profile ... connected ...
>> f
f = 
 FevalFuture with properties: 

                   ID: 1
             Function: @load
                State: running
      ErrorIdentifier: 
         ErrorMessage: 

此时,我们看到命令仍在worker上运行。显然,我们可以做一些比简单地检查作业更有用的事情......但是在短暂等待后会发生以下情况:

>> f
f = 
 FevalFuture with properties: 

                   ID: 1
             Function: @load
                State: finished (unread)
      ErrorIdentifier: 
         ErrorMessage: 
>> % all done, load the data
>> data = fetchOutputs(f) % Blocks until complete
data = 
x: [5x5 double]

【讨论】:

    【解决方案2】:

    我知道您提到您希望留在 Matlab 中,并且正如 chappjc 建议您可以使用并行计算工具箱,但我们大多数人没有很多工具箱。

    您的数据是否仅采用 MAT 文件格式,还是以 CSV 或 HDF5 等其他格式提供?如果您了解 Java 或可以访问可以使用它编程的人,我会建议使用 Java 线程,因为 Matlab 在 Java 上运行并且在 Java 和 MATLAB 之间具有高性能的数据编组。那么您就不必担心 MEX 文件了。

    【讨论】:

    • 感谢您的建议。在这种情况下,我确实有 PCT,因此 chappjc 解决方案有效。您的评论提出了另一个问题,这是否意味着 C++ 和 Matlab 之间的编组不如 Java 高效?如果是这样,您知道是否有任何基准进行比较?
    • @user1715925 - 不,MEX 文件可以直接访问 MATLAB 数据并在 MATLAB 工作区中操作变量——MEX API 具有非常高的性能。此外,一个优点是 MATLAB 引擎不是基于 Java,只是基于 GUI。但是,就像 Jason S. 所说,如果 JVM 启动,您可以从命令行完全访问 Java 的所有功能(默认情况下,但并非必须如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多