1

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

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

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

4

2 回答 2

2

这个答案中,我详细介绍了一种使用taskandjob函数进行异步执行的方法,但我认为可能是最简单的load简单parfeval方法。例如,

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]
于 2013-10-25T05:05:58.863 回答
1

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

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

于 2013-10-25T05:17:19.840 回答