2014-11-19 4 views
0

커널 분리 성을 사용하여 컨볼 루션에 소요되는 시간을 개선하는 방법을 알고 있습니다.이론적 인 속도 향상이 이루어지지 않음 - 커널 분리 성

test = randn(3000); 
kx = [1 2 3 4 5 6 7 8 9]; 
ky = kx'; 
kernel = ky*kx; 

tic; b = conv2(test,kernel,'same'); toc; 

tic; bx=conv2(test,kx, 'same'); by=conv2(bx,ky, 'same'); toc; 

위의 코드를 실행 결과는 수율 : 다음은이를 보여주는 코드 조각입니다

경과 시간이 0.564579 초입니다. 경과 시간은 0.333260 초입니다.

위에서 볼 수 있듯이, 이것은 내가 기대하고있는 이론적 인 속도 향상이 아니라 81/18 = 4.5라고 가정합니다.

이유를 설명 할 수 있습니까?

+1

다양한 것들이있을 수 있습니다. 또한 함수를 두 번 호출하는 경우 함수 오버 헤드가 원인 일 수 있습니다. ** 이론적 인 속도 향상 **입니다. 실질적으로 또 다른 이야기입니다. 또한 해당 코드가 함수 또는 명령 프롬프트에서 실행되고 있습니까? 명령 프롬프트에서 실행하면 추가 시간 오버 헤드가 발생합니다. – rayryeng

+2

작은 처리량에서는 시간이 매우 길기 때문에 회선 자체가 아닌 다른 작업에 의해 시간이 빨라질 수 있습니다. 알맞은 크기의 2D 데이터 세트에 커널을 적용 해보십시오. 1024x1024. –

+1

두 줄의 코드를 모두 실행했을 때, 나는'0.072947'과'0.067429' 초를 각각 얻었다. 시험을 아마 10 번이나 달리 봤는데 내 시간이 그 주위를 맴돌고 있습니다. 이것을 함수 스크립트에 넣었고 실행했습니다 .... 그래서 나는 별다른 차이가 보이지 않습니다. 아마도'conv2'는 2D 커널을 제공 할 때 분리 가능성을 고려하여 가능한 경우 2 개의 1D 커널로 분리합니다. – rayryeng

답변

1

커널이 실제로 이득을 볼 정도로 크지 않습니다. 나는이 100 × 100 커널 크기를 실행하면

test = randn(3000); 
kx = 1:100; 
ky = kx'; 
kernel = ky*kx; 

tic; b = conv2(test,kernel,'same'); toc; 
tic; bx=conv2(test,kx, 'same'); by=conv2(bx,ky, 'same'); toc; 

, 나는 다음을 참조하십시오 : 200x200 크기의 커널

Elapsed time is 6.961222 seconds. 
Elapsed time is 0.252186 seconds. 

내가 얻을 :

커널 더 크게 만들 같이 개선은 더욱 명백해질한다
Elapsed time is 28.894932 seconds. 
Elapsed time is 0.639125 seconds. 

커널 크기를 두 배로 늘리면 2D 커널 시간이 ~ 4.15 배 증가하고 1D 시간이 ~ 2.5 배 증가합니다. 이론적으로 각각 4 배와 2 배 증가하지 않았습니다.

1

이 질문에 답할 수 없습니다 (kmac의 답변에 나와 있습니다).하지만 성능 개선을 원할 경우 conv 기능을 사용하지 않는 것이 좋습니다. 동일한 결과를 얻기 위해 FFT/IFFT를 수행하는 것이 Matlab에서 훨씬 빠릅니다. 전통적인 컨볼 루션에서 푸리에 (Fourier) 접근법으로가는 과정에서 몇 가지 단점이 있지만 응용 프로그램에 도움이 될 수 있습니다. 여기에 주제에 대한 좋은 생각이 있습니다.
http://blogs.mathworks.com/steve/2009/11/03/the-conv-function-and-implementation-tradeoffs/