【问题标题】:vectorization of matlab for-loopmatlab for-loop的向量化
【发布时间】:2015-10-19 11:29:11
【问题描述】:

我正在寻找以下 matlab 函数的适当矢量化,以消除 for 循环并通过多线程提高速度。

size(A) = N-by-N,其中30 <= N <= 60

1e4 <= numIter <= 1e6

function val=permApproxStochSquare(A,numIter)
%// A       ... input square non-negative matrix
%// numIter ... number of interations

N=size(A,1);

alpha=zeros(numIter,1);
for curIter=1:numIter
    U=randn(N,N);
    B=U.*sqrt(A);
    alpha(curIter)=det(B)^2;
end

val=mean(alpha);
end

【问题讨论】:

  • 对于大 N,使用parfor 可能是一种选择。
  • @Daniel 是的 parfor 是简单而好的解决方案,但我需要没有并行计算工具箱 (parfor) 的解决方案
  • 除了parfor,我只想在循环外预计算sqrt(A)parfor 可以在没有并行计算工具箱的情况下使用,但您没有任何灵活性。
  • 对于这么小的矩阵,parfor 可能无济于事。除非有人想对det 的多次调用进行矢量化处理,否则我认为没有显着改进的机会。
  • 另外,您可以通过U = randn(N,N,numIter) 在循环外预先计算U,然后通过U(:,;,curIter) 在循环中访问它,这可能会节省一些时间。另外,你可以试试det(U.*sqrt(A))^2

标签: matlab matrix vectorization determinants


【解决方案1】:

将评论中的讨论总结为稍微提高性能的两个版本的代码:

使用来自 cmets 的多个想法,代码所需的时间大约减少了 1/3:

N=size(A,1);
%precompute sqrt(A)
sA=sqrt(A);
alpha=zeros(numIter,1);
parfor curIter=1:numIter
    %vectorizing rand did not improve the performance because it increased communitcation when combined with parfor
    U=randn(N,N);
    B=U.*sA;
    alpha(curIter)=det(B);
end
%moved calculation out of the loop to vectorize
val=mean(alpha.^2);

另一种方法,尽可能使用for 循环进行矢量化,但对性能的改进很小:

N=size(A,1);
%precompute sqrt(A)
sA=sqrt(A);
alpha=zeros(numIter,1);
%using a for, a vectorized rand outside the loop is faster.
U=randn(N,N,numIter);
B=bsxfun(@times,U,sA);
for curIter=1:numIter
    alpha(curIter)=det(B(:,:,curIter));
end
val=mean(alpha.^2);

【讨论】:

  • 完全同意...此外,第二种方法会产生很大的内存需求。
  • GPU 呢?是否可以通过 PCT 从 MATLAB 在 NVIDIA CUDA 上有效运行此代码?
  • 我没有经验,需要并行计算工具箱。
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多