2013-06-20 1 views
1

이 이미지 축소 알고리즘의 행 단위 버전을 구현하려고합니다 : http://intel.ly/1avllXm, RGBA 8 비트 이미지에 적용했습니다.ARM NEON을 사용하여 이미지 크기 조정

단순화하기 위해 단일 행 w_src -> w_dst의 크기를 조정하는 것을 고려하십시오. 그런 다음 각 픽셀은 가중치 1.0의 단일 출력 누적기에 값을 제공하거나 가중치 알파 및 (1.0f - 알파)가있는 두 개의 연속 출력 픽셀에 기여할 수 있습니다. C/의사 코드 :

float acc[w_dst] = malloc(w_dst * 4); 
x_dst = 0 
for x = 0 .. w_src: 
    if x is a pivot column: 
    acc[x_dst] += (w_src[x] * alpha); 
    x_dst++; 
    acc[x_dst] += (w_src[x] * (1.0f - alpha); 
    else 
    acc[x_dst] += w_src[x]; 

는 마지막으로 기여 소스의 화소 수 (플로트 브로)에 의해 각 축 전체 채널 분할 :

uint8_t dst = malloc(w_dst); 
for x_dst = 0 .. w_dst 
    dst[x_dst] = (uint8_t)round(acc[x_dst]/area); 

내 기준 순수한 C 구현 올바르게 작동한다. 그러나 NEON 연산을 사용하여 작업 속도를 높이는 방법이 있는지 궁금해했습니다. 각 픽셀은 8 비트 RGBA입니다. 감사!

답변

0

불행히도 NEON은 이러한 종류의 작업에는 적합하지 않습니다. 고정 된 소스 및 대상 해상도로 이미지 크기를 조정하는 경우 동적 벡터를 사용하여 NEONize 할 수는 있지만 인접 픽셀의 가변 개수를 더하는 것은 단순히 SIMDable이 아닙니다.

부동 소수점 연산을 고정 소수점 1로 바꾸는 것이 좋습니다. 그것만으로도 많은 도움이 될 것입니다.

게다가, 부서는 대단히 오래 걸립니다. 특히 루프 내부에서 수행 될 때 성능에 심각한 해를 입힌다. 사용자는 추천 승산로 교체해야

내 두번째 생각
uint8_t dst = malloc(w_dst); 
float area_ret = 1.0f/area; 
for x_dst = 0 .. w_dst 
    dst[x_dst] = (uint8_t)round(acc[x_dst] * area_ret); 
+0

예, 명확성을 위해 의사 코드를 단순화했습니다. 모든 분명한 최적화 (분할 대신 곱셈, 부동 계산 캐싱)를 수행했지만 여전히 SIMDable 접근 방식이 있는지 알고 싶었습니다. 계산의 정확도가이 알고리즘의 결과에 큰 영향을 미치지 만, 고정 소수점 산술을 살펴볼 것입니다. – avish

+0

많은 사람들의 일반적인 오해 중 하나는 fp가 float보다 덜 정확하다는 것입니다. Float은 24 비트 정밀도를 제공하지만 충분할 수도 있지만 값이 커질수록 최하위 비트가 잘립니다.반면에 fp의 정밀도는 동일하게 유지되고 마지막에서 int로 변환 될 때까지 잘리지 않습니다. 귀하의 경우 q14 fp 산술조차도 현재 구현보다 정확합니다. –

+0

... 아아아, 물론 당신 말이 맞아요. 소스 행이 충분할 때 정밀도가 손실되어 정확한 누적 정밀도에 비해 누적 기 값이 너무 큰 현재 float 구현의 버그를 발견했습니다. – avish

1

동일 종별은 수평 인접 화소에인가 될 수 있기 때문에, 수직 소형화 잘 SIMDable이다.

  • 는 Q15 부호 FP 연산을 사용하여 NEON 수직 크기 조정 : 그래서 여기

    내가 제안 것입니다. 임시 결과는 32 비트/요소에 저장됩니다.

  • q15 부호없는 fp 산술, 을 영역/타입 변환/팩으로 나누어 ARM으로 수평 크기를 조정하고 최종 결과를 RGBA에 저장합니다.

면적 의한 나눗셈 Q17 (1/면적)와 LONG 승산을 수행한다 있습니다.

왜 q17입니까? q15 * q17을 수행하면 결과는 두 개의 32 비트 레지스터에 데이터가 들어있는 q32에 있습니다. 그리고 상위 레지스터가 이미 목표 된 8 비트 int 값을 가지고 있기 때문에 '비트 연산에 의한 타입 캐스팅'을 할 필요가 없습니다. 그것은 fp 산술의 아름다움입니다.

아마 가까운 미래에 완벽하게 최적화 된 버전을 작성할 것입니다.