为什么这个LUT卷积实现比非LUT卷慢

时间:2015-01-27 11:29:31

标签: performance matlab lookup convolution

我已经在我的计算机视觉课程中实现了带有查找表的卷积算法和没有查找表的卷积算法 我用 tic;命令; toc; 来衡量算法的性能 我期望LUT实现比非LUT实现更快,但这不是我的情况,我无法理解为什么。
有时我通过避免隐式转换来解决这类问题(在计算开始之前将所有内容转换为double)。我也试过使用较小的类型,比如单一,但它似乎会减慢这个过程 我做错了什么?
非LUT实现总是慢0.2秒,这种差异随着内核尺寸的增加而增加 我使用灰度图像作为输入,使用fspecial()创建内核。 我发布了两个实现的代码。

LUT:

function out = convolutionLUT(img, k)
[h, w] = size(img);
[kh, kw] = size(k);
floorkh = floor(kh/2);
floorkw = floor(kw/2);
img = double(img);
out = zeros(h, w);
lut = zeros(kh, kw, 256);
for i=1:256
    lut(:,:,i) = k * (i-1);
end
for x=1:w-kw+1
    for y=1:h-kh+1
        prd = 0;
        for i=1:kw
            for j=1:kh
                prd = prd + lut(j, i, img(y+j-1, x+i-1)+1);
            end
        end
        out(y+floorkh, x+floorkw) = prd;
    end
end
out = uint8(255 * out/max(out(:)));
end

非LUT:

function out = convolution(img, k)
[h, w] = size(img);
[kh, kw] = size(k);
floorkh = floor(kh/2);
floorkw = floor(kw/2);
img = double(img);
out = zeros(h, w);
for x=1:w-kw+1
    for y=1:h-kh+1
        prd = 0;
        for i=1:kw
            for j=1:kh
                prd = prd + k(j,i) * img(y+j-1, x+i-1);
            end
        end
        out(y+floorkh, x+floorkw) = prd;
    end
end
out = uint8(255 * out/(max(out(:))));
end

1 个答案:

答案 0 :(得分:2)

使用非LUT代码,可以轻松预测代码访问的数据。可能Matlab JIT-Compiler找到了一种利用这些知识来提高性能的方法。

除了这个LUT /非LUT差异外,你似乎在浪费性能。看看这段代码:

prd = 0;
for i=1:kw
    for j=1:kh
       prd = prd + k(j,i) * img(y+j-1, x+i-1);
    end
end

您可以使用单个矢量化乘法替换它:

prd=sum(sum(k(1:kh,1:kw).*img(y:y+kh-1, x:x+kw-1)))