2015-10-19 1 views
0

Je suis à la recherche d'une vectorisation correcte de la fonction matlab suivante pour éliminer la boucle for et la vitesse de gain par multithreading.vectorisation de matlab for-loop

size(A) = N -by- N, où 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 
+0

Pour un grand N, en utilisant 'parfor' pourrait être une option. – Daniel

+0

@Daniel Oui, parfor est simple et bonne solution, mais j'ai besoin de solution sans Parallel Computing Toolbox (parfor) – michal

+0

A côté d'un parfor, je pense seulement à precomputing 'sqrt (A)' en dehors de la boucle. 'parfor' peut être utilisé sans la Parallel Computing Toolbox mais vous n'avez aucune flexibilité. – Bentoy13

Répondre

3

Pour résumer la discussion dans le commentaire à deux versions du code qui améliore légèrement les performances:

aide plusieurs idées à partir des commentaires, le code a besoin d'environ 1/3 moins de temps:

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); 

Une autre approche, vectoriser, autant que possible en utilisant une boucle for ne fait petit improvemens au perfrmance:

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); 
+1

Tout à fait d'accord ... De plus, la 2ème approche produit de gros besoins en mémoire. – michal

+0

Qu'en est-il du GPU? Sera possible d'exécuter efficacement ce code sur NVIDIA CUDA à partir de MATLAB via PCT? – michal

+0

Je n'ai aucune expérience, en outre, il faudrait la boîte à outils de calcul parallèle. – Daniel