2016-06-20 7 views
1

Ich habe eine Funktion wie,Wie Matlab-Code für gpu

function ObjVal=fun(Chrom,a) 

    [Nind,Nvar] = size(Chrom); 
    [m n]=size(a); 

    for i=1:Nind 
    c=Chrom(i,:); 
    Cmat=repmat(c',1,n); 
    ax=abs(sum(Cmat.*a)).^2; 
    ObjVal(i)= 10*log10(max(ax)./(mean(ax))); 
    end; 

Chrom = 16 * 16 und a = 16 * 1024 Array zu optimieren. Ich versuche den schnellsten Weg auf GPU zu finden. Nur gpuarray ist langsamer. Wenn ich arrayfun oder bsxfun benutze, bekomme ich einige Fehler.

function valmult=mult(Cmat,a) 

    valmult=abs(sum(Cmat.*a)).^2; 

ax = arrayfun (@ mult, Cmat, a); Ich bekomme Funktion übergeben als erstes Eingabeargument enthält nicht unterstützte oder unbekannte Funktion 'Summe'.)

Ich bin neu in MATLAB mit GPU. Irgendwelche Vorschläge, welcher Weg der Beste ist und wie kann ich die Code-Leistung mit gpuarray maximieren?

Antwort

0

Die Dinge werden besser, wenn Sie die For-Schleife beseitigen können. Dies kann mit dem folgenden Code geschehen.

ax_mat = (Chrom * a).^2; 
ObjVal = 10 * log10(max(ax_mat, [], 2) ./ mean(ax_mat, 2)); 

Auf der anderen Seite ist die schwerste Operation im Code, ist die Matrixmultiplikation von Chrom * a, zu klein (16x16x1024), um die GPU voll zu nutzen. Sie werden feststellen, dass die GPU selbst mit dem verbesserten Code immer noch langsamer ist.

+0

danke für Ihren Rat –