私はMATLABで畳み込みネットワークを実装しています.GPUのサポートを追加しました(gpuArraysを使用しています)。フィードフォワード部分を実装しました。私は標準の配列(私は既に自分のワークスペースの準備ができている配列を持っている)でそれを実行すると、0.15秒かかります。しかし、私が同じことを実行しても、フィードフォワードスクリプトを実行する前にすべてのワークスペースにある配列gpuArraysを実行すると、〜1.39秒かかります。誰かがここで何が起こっているのか説明できますか?私は時間を実行しているテストし、主なボトルネックが私の畳み込み一部であることすべてが示唆ので、私がダウンして、ここでのコードの一部を貼り付けます:おかげで標準アレイは、convネットフィードフォワードのgpuArrayよりも高速です。
UPDATE
は pad = (size(layers_W{layerNum}, 1)-1)/2;
for imageNum = 1:options.minibatchSize
for filterNum = 1:size(layers_W{layerNum}, 4)
for filterD = 1:size(layers_W{layerNum}, 3)
c = conv2(convInput(:, :, filterD, imageNum), ...
rot90(layers_W{layerNum}(:, :, filterD, filterNum), 2), 'valid');
layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ...
layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ...
c;
end
layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) = ...
layers_activations{layerNum}(pad+1:end-pad, pad+1:end-pad, filterNum, imageNum) + ...
layers_b{layerNum}(filterNum);
end
end
if strcmp(options.activation, 'relu') == 1
layers_activations{layerNum} = max(0, layers_activations{layerNum});
elseif strcmp(options.activation, 'sigmoid') == 1
layers_activations{layerNum} = 1 ./ (1 + exp(-layers_activations{layerNum}));
end
このコードの正確な作品は、ですCPUよりもGPUで約52倍遅い何か案は?
UPDATE2: 2dコンボリューション(GPUでは約10倍遅くなります)とその下に2つの行列を追加する行(GPUでは約100倍遅い)を別々にテストしました。なぜこれが起こっているのか、私は完全に混乱しています。
データがGPUに移動するのに時間がかかります。 GPUで計算するのに十分な計算量がない場合(そうでないように見えます)、CPUは実際より高速になります。 –
それはGPUメモリ内にあるべきではありませんか?他のスクリプトはこれらのベクトルとすべてを作成し、フィードフォワードを実行する前にワークスペースに座っています。私は自分のGPUがメモリ内にこれを保持するのに十分なメモリを持っていることを絶対に確信しています(6GB、小規模なネットワーク上のテストのみ)。 –
GPUのすべてが高速です。最も遅い部分が何であるかを見るためにコードをプロファイルします。また、コード全体を表示しない限り、私たちはあなたを助けることが難しい –