1

次の単純なクラスから3〜6倍のスピードアップを得ることができますか?

インライン関数のふりをするクラスを作成しようとしていますが、括弧/subsref演算子のオーバーロードが十分に速くなりません。

subsrefにベクトルを取得させ、それをクラスプロパティに対して乗算することによりCTestOp、インライン関数を置き換える クラスを作成しました。f = @(x) A*xA

Aベンチマークは、サイズが小さくx(たとえば、m = 5)、インライン関数を使用するのに単に書き込むA*xのに4〜7倍の時間がかかり、クラスを使用するのにインライン関数を使用するのに4〜7倍の時間がかかることを示しています。

Elapsed time is 0.327328 seconds for the class
Elapsed time is 0.053322 seconds for the inline function.
Elapsed time is 0.011704 seconds for just writing A*x.

ここに到達するために一連の改善を行いましたが、問題があります。たとえば、求めないことでかなりの利益を得ることができますthis.Aが、それは目的全体を打ち負かします。さまざまな関数を記述できる抽象クラスを使用したかったのですがoperation、クラスを抽象化してもそれほど時間はかかりませんでしたが、実際の関数呼び出しを行うと効果的でした。

何か案は?

クラスは次のとおりです。

classdef CTestOp < handle

    properties     
        A = [];
    end

    methods
        function this = CTestOp(A)
            this.A = A;
        end

        function result = operation(this, x)
            result = this.A*x;
        end

        function result = subsref(this, S)

%             switch S.type
%                 case '()'
                    %   result = this.operation(S.subs{1});  % Killed because this was really slow
                    %   result = operation(this, S.subs{1}); % I wanted this, but it was too slow
                    result = this.A*S.subs{1};
%                 otherwise
%                     result = builtin('subsref', this, S);
%             end

        end
    end

end

テストコードは次のとおりです。

m = 5;
A = randn(m,m);
x = randn(m,1);

f = @(x) A*x;

myOp = CTestOp(A);

nc = 10000;

% Try with the class:
tic
for ind  = 1:nc
r_abs = myOp(x);
end
toc


% Try with the inline function:
tic
for ind = 1:nc
r_fp = f(x);
end
toc

% Try just inline. so fast!
tic
for ind = 1:nc
r_inline = A*x;
end
toc
4

1 に答える 1

1

Matlab で高速なコードを書きたい場合、常にコードをベクトル化するのがコツでした。Matlab OO を使用する場合も同様です。現時点ではテストできませんが、多くの小さな操作ではなく、1 つの大きな操作を実行することでオーバーヘッドを削減できると確信しています。

特定の例では、ベンチマークを再度実行し、次の 2 行を変更して、私のステートメントが実際に保持されるかどうかを確認できます。

m = 500; % Work with one big matrix rather than many tiny ones

nc = 99; % Just some number that should give you reasonable run times
于 2013-02-05T14:43:03.050 に答える