2016-12-24 7 views
1

Ich versuche, die Leistung eines LDPC-Codes auf einem BPSK-AWGN-Kanal zu simulieren, wenn die Summenprodukt-Decodierung verwendet wird.Warum dauert die Ausführung dieses MATLAB-Skripts so lange?

Dafür habe ich eine Funktion in MATLAB geschrieben, die dem beschriebenen Algorithmus in the 34th page of this paper folgt. Wenn ich jedoch die Funktion verwende, die ich mit Parity-Check-Matrizen großer Dimension geschrieben habe (ich brauche eine Matrix von 1012 x 1518), nimmt das Programm FOREVER, um eine einzige Iteration zu machen (ich versuche die Performance zu simulieren) des Codes in diesem Kanal durch mindestens 100k Iterationen, um eine gute Schätzung zu haben). Die Matrix H, die ich verwende, ist sehr niedrige Dichte (es hat nur zwei 1 pro Spalte), so würde ich erwarten, dass das Skript viel schneller laufen.

Ich dachte, dass möglicherweise float verwenden, um Matrizen mit nur Nullen und Einsen darzustellen, kann das Problem sein, aber ich bin mir nicht sicher, ob dies eine große Veränderung bedeuten würde. Außerdem würde ich nicht wissen, wie einige der Operationen, die ich in meiner Funktion verwende, ausgeführt werden, wenn diese Matrizen boolesch sind.

Hat also jemand eine Idee? Ich werde die Funktion schreiben, die ich unten geschrieben habe.

function y = sum_product(r, H, I_max) 

[m , n] = size(H); 

I = 0; 

for i = 1:n 
    for j = 1:m 
     if H(j,i) == 1 
      M(j,i) = r(i); 
     else 
      M(j,i) = 0; 
     end 
    end 
end 

M = sparse(M); 

E = M; 

while 1 

for j = 1:m 
    for i = 1:n 
     aux = 1; 
     if H(j,i) == 1 
      for l = 1:n 
       if l~=i & H(j,l) == 1 
        aux = tanh(M(j,l)/2)*aux; 
       end 
      end 
      E(j,i) = log(1+aux)-log(1-aux); 
     end 
    end 
end 

for i = 1:n 
    aux = 0; 
    for j = 1:m 
     if H(j,i) == 1 
      aux = aux + E(j,i); 
     end 
    end 

    L(i) = aux + r(i); 

    z(i) = L(i)<=0; 
end 

if I == I_max | mod((H*transpose(z)) , 2) == 0 
    break; 
else 
    for i = 1:n 
     for j = 1:m 
      aux = 0; 
      if H(j,i) == 1 
       for l = 1:m 
        if l~=j & H(l,i) == 1 
         aux = aux + E(l,i); 
        end 
       end 
      M(j,i) = aux + r(i); 
      end 
     end 
    end 
I = I + 1; 
end 
end 

y = z; 

end 
+2

Welche Version von MATLAB? Was sind die Werte von "r", "H" und "I_max", die das Leistungsproblem reproduzieren? Haben Sie [Ihren Code profiliert] (https://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html), um festzustellen, wo die meiste Rechenzeit verbracht wird? – excaza

Antwort

2

Wie in anderen Antworten angegeben, beschleunigt Vektorisierung oft Ihre Berechnung. Das bedeutet, dass Sie die Funktion nicht nur mehrmals für jedes Element einer Matrix ausführen können, sondern nur einmal für die gesamte Matrix. Wenn Sie mit Schleifen und if else Anweisungen vertrauter sind, können Sie Sprachen wie C++ verwenden, um die gewünschte Geschwindigkeit zu erreichen. Also hier ist eine vektorisierte Form;

function z = sum_product(r, H, It_max) 
    m = size(H,1); 
    n = size(H,2); 
    M = repmat(r,m,1); 
    L = zeros(m,n); 
    E = zeros(m,n); 
    x = reshape(1:numel(H),m,n).'; 
    idx1= reshape(x(logical(H')),[],m).'; 
    idx2= reshape(find(H),[],n); 
    for It = 0:It_max 
     tn = tanh(M(idx1)/2); 
     pr = bsxfun(@rdivide,prod(tn,2),tn); 
     E(idx1) = log((1+ pr)./(1-pr)); 
     sumE = sum(E(idx2)); 
     L = sumE + r; 
     z = L <= 0; 
     if all(mod(H * z.',2) == 0) 
      break; 
     end 
     M(idx2) = bsxfun(@plus,bsxfun(@minus,sumE , E(idx2)),r); 
    end 
end 
1

Das Problem ist, dass Sie probbaly nicht for -loops, verschachtelte Schleifen noch weniger verwendet werden sollte, da Matlab eine interpretierte Sprache ist. Um die Geschwindigkeit zu erhöhen, versuchen Sie, Ihre Operationen zu vektorisieren, um die Geschwindigkeit der eingebauten Funktionen von MATLAB zu nutzen.

+0

Interpretiert vs. kompiliert ist hier nicht relevant. Es gibt viele interpretierte Sprachen, die schnelle Schleifen haben. Die Leistungslücke von Schleifen im Vergleich zu vektorisierten Einbauten in MATLAB schrumpft ebenfalls, wenn die Sprache reift, so dass dies keine gültige absolute Aussage mehr ist und die Frage sicherlich nicht beantwortet. Das OP sollte [den Code profilieren] (https://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html) um zu identifizieren, wo die Berechnungszeit verbracht wird. – excaza

Verwandte Themen