커널 분리 성을 사용하여 컨볼 루션에 소요되는 시간을 개선하는 방법을 알고 있습니다.이론적 인 속도 향상이 이루어지지 않음 - 커널 분리 성
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라고 가정합니다.
이유를 설명 할 수 있습니까?
다양한 것들이있을 수 있습니다. 또한 함수를 두 번 호출하는 경우 함수 오버 헤드가 원인 일 수 있습니다. ** 이론적 인 속도 향상 **입니다. 실질적으로 또 다른 이야기입니다. 또한 해당 코드가 함수 또는 명령 프롬프트에서 실행되고 있습니까? 명령 프롬프트에서 실행하면 추가 시간 오버 헤드가 발생합니다. – rayryeng
작은 처리량에서는 시간이 매우 길기 때문에 회선 자체가 아닌 다른 작업에 의해 시간이 빨라질 수 있습니다. 알맞은 크기의 2D 데이터 세트에 커널을 적용 해보십시오. 1024x1024. –
두 줄의 코드를 모두 실행했을 때, 나는'0.072947'과'0.067429' 초를 각각 얻었다. 시험을 아마 10 번이나 달리 봤는데 내 시간이 그 주위를 맴돌고 있습니다. 이것을 함수 스크립트에 넣었고 실행했습니다 .... 그래서 나는 별다른 차이가 보이지 않습니다. 아마도'conv2'는 2D 커널을 제공 할 때 분리 가능성을 고려하여 가능한 경우 2 개의 1D 커널로 분리합니다. – rayryeng