登录论坛

查看完整版本 : 在大量矩阵上对所有操作进行并行化或矢量化?


poster
2019-12-10, 20:41
我有大约5,000个矩阵,它们具有相同的行数和不同的列数(20 x〜200)。这些矩阵中的每一个都必须在动态编程算法中相互比较。

在这个 (https://stackoverflow.com/questions/2863751/vectorizing-sums-of-different-diagonals-in-a-matrix)问题中,我询问了如何快速进行比较,并获得了涉及2D卷积的出色答案。依次地,迭代地应用该方法,就像这样

list = who('data_matrix_prefix*') H = cell(numel(list),numel(list)); for i=1:numel(list) for j=1:numel(list) if i ~= j eval([ 'H{i,j} = compare(' char(list(i)) ',' char(list(j)) ');']); end end end 对于较小的数据子集来说速度很快(例如,对于9个矩阵,9 * 9-9 =在1秒钟内进行72次调用,在2.5秒钟内进行870次调用)。
但是,对所有数据进行操作需要近2500万次呼叫。
我还尝试使用Deal()来制作一个完全由数据中下一个元素组成的单元格数组,因此我可以在单个循环中使用cellfun():

# who(), load() and struct2cell() calls place k data matrices in a 1D cell array called data. nextData = cell(k,1); for i=1:k [nextData{:}] = deal(data{i}); H{:,i} = cellfun(@compare,data,nextData,'UniformOutput',false); end 不幸的是,这实际上并没有更快,因为所有的时间都在compare()中。这两个代码示例似乎都不适合并行化。我在弄清楚如何对变量进行切片时遇到麻烦。
compare()是完全向量化的;它专门使用矩阵乘法和conv2()(我印象中所有这些操作,包括cellfun(),都应该在MATLAB中是多线程的吗?)。

有人看到这个问题的(明确的)并行化解决方案或更好的矢量化解决方案吗?

注意
我意识到我的两个示例都是效率低下的-第一个示例计算三角形单元阵列的速度将是它的两倍,第二个示例还在计算自我比较。但是,良好的并行化所节省的时间更像是16倍(如果我在每个人的计算机上都安装了MATLAB,则节省了72倍)。

在旁边
还有一个内存问题。我使用了两次评估将H的每一列附加到文件中,并命名为H1,H2等,然后清除H i 。不幸的是,保存速度非常慢...



回答:

可以很容易地将第二个示例切成薄片,以与Parallel Processing Toolbox一起使用。该工具箱可在多达8个不同的本地处理器之间分配代码迭代。如果要在群集上运行代码,则还需要“分布式计算工具箱”。

%# who(), load() and struct2cell() calls place k data matrices in a 1D cell array called data. parfor i=1:k-1 %# this will run the loop in parallel with the parallel processing toolbox %# only make the necessary comparisons H{i+1:k,i} = cellfun(@compare,data(i+1:k),repmat(data(i),ki,1),'UniformOutput',false); %# if the above doesn't work, try this hSlice = cell(k,1); hSlice{i+1:k} = cellfun(@compare,data(i+1:k),repmat(data(i),ki,1),'UniformOutput',false); H{:,i} = hSlice; end

更多&回答... (https://stackoverflow.com/questions/2872249)