'SIMD'에 해당되는 글 2건

  1. 2024.01.02 libJpeg 에도 버전이 있나?
  2. 2013.06.14 libjpeg-turbo 에 대해서 알아 보자

libJpeg 에도 버전이 있나?

개발 2024. 1. 2. 21:04

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

우리가 흔하게 쓰고 있는 libjpeg 라이브러리가 있습니다. 이미지를 jpeg 형식으로 인코딩하거나 디코딩 해주는 라이브러리 입니다. 

요기의 홈페이지 주소는 http://ijg.org/ 입니다. 

방문해보면 아래처럼 정말 단순한 화면만 표시되는데요.. ( 아직도 요런 페이지가 있다니 ㅋㅋ ) 

Independent JPEG Group

흠.. 여기서 도대체 버전별 정보를 어디서 찾으라는 거냐? ㅋ 

원하는 정보를 쉽게 찾을수 없어서 wikipia를 방문해보면 아래처럼 잘 정리되어 있습니다.  ( https://en.wikipedia.org/wiki/Libjpeg

VersionReleasedNew featuresITU T.81 JPEG CompatibleProprietary non-compatible extensions

1 1991
  • First release
  • Baseline or optimized JPEG
  • GIF or PPM output
2 1991
  • Internal improvements
  • More input/output formats
3 1992 Internal and image quality improvements
4 1992 Internal and speed improvements
4a 1993-02-18  
5 1994-09-24 Internal improvements and revised API
5a 1994-12-07  
5b 1995-03-15  
6 1995-08-02
  • Progressive JPEG
  • jpegtran (convert between baseline and progressive)
6a 1996-02-07  
6b 1998-03-27
  • jpegtran extended to lossless rotate
(used by libjpeg-turbo and mozjpeg)
7 2009-06-27
  • jpegtran extended to lossless crop
  • T.851 Arithmetic Coding[19]
  • Scaled DCT[20]
8 2010-01-10
  • SmartScale extension (ITU rejected)[21][22]
  • jpegtran extended to use SmartScale
  • Internal fixes
8a 2010-02-28 RGBA
8b 2010-05-16 Memory corruption & build fixes
8c 2011-01-16 Option for selecting DCT block size (SmartScale)
8d 2012-01-15 RGB JPEG (no color transform to YCbCr)
9 2013-01-13
  • YCoCg color
  • Lossless compression (1x1 DCT)[23]
9a 2014-01-19
  • "JFIFv2" scRGB Wide color gamut (standard unknown)
  • 8-12 bit color (standardJPEG)
9b 2016-01-17 Computation improvements
9c 2018-01-14 jpegtran -wipe
9d 2020-01-12
  • Code cleanup
  • Huffman optimization
  • x64 support (MSVC)
  • jpegtran -drop
9e 2022-01-16 ARM and ARM64 support (MSVC)

Legend:

Old version, not maintained Older version, still maintained Current stable version

여기서 주의깊게 봐야할 버전이 바로바로 6b ( v.6.2 ) 버전 이다. 

1998년에 나온 버전으로 아주 오래되었지만, 아직도 유지가 되는 버전인데.. 

그 이유는 libjpeg-turbo 라는 프로젝트와 mozjpeg 라는 프로젝트에서 해당 버전의 libjpeg를 기반으로 개발되었기 때문이다. 

그리고 6b 버전이후 거의 10년만에 업데이트된 버던7에서는 무손실 jpegtran 기능과 무슨 arithmetic coding 적용과 scaled DCT 으로 성능개선이 된것이 전부이다. 

이후 버전 8 부터 버그랑 몇가지 기능들이 추가되기는 했지만, 하위버전 호환성을 유지하면서 jpeg에 새롭고 혁신적인 것이 추가되기는 어려운 상황으로 보인다. web 환경에 특화되어 있는 google에서 발표한 webP 형식처럼 새로운 술은 새부대가 아니고서는 혁신을 담아내기는 어려울듯 싶다. 

이후 버전9 에서는 YCoCg 칼라스페이스 추가와 광색역(wide color gamut) 그리고 계산성능향상 ( computation improvements ) 등등의 변화가 추가되었다. 

최신버전인 9e 버전에서는 msvc 빌드환경에서 arm / arm64 빌드가 지원된다고 한다. 

추가로 6b 에서 파생되었다는 2가지 프로젝트에 대해서 간단하게 알고만 넘어가보자. 

libjpeg-turbo

  • libjpeg-turbo는 SIMD 지침을 사용하여 기본 JPEG 인코딩 및 디코딩을 가속화하는 libjpeg의 포크입니다.
  • 일반적으로 libjpeg 보다 2~4배정도 인코딩 속도가 빠릅니다. ( 디코딩 속도는 대략 1.5배정도 ) 
  • 현재 널리 사용되는 Linux 배포판(Fedora, Debian, Mageia, openSUSE 등), Mozilla 및 Chrome을 포함하여 많은 프로젝트에서 libjpeg 대신 libjpeg-turbo를 사용하고 있습니다.
  • libjpeg-turbo는 SmartScale을 지원하지 않기로 결정했습니다. 
  • 왜냐하면 SmartScale은 ITU-T 표준이 아니고 자체 연구에서 이 기능(및 DCT 스케일링)이 비효율적이라고 판단했기 때문libjpeg v7, v8 및 v9는 이전 릴리스와의 ABI 호환성을 중단했습니다.

mozjpeg

  • mozjpeg는 Josh Aas와 Mozilla Research의 다른 사람들이 수행한 libjpeg-turbo의 포크입니다. 
  • 이미지 품질을 유지하면서 코딩 효율성 향상을 통해 파일 크기(약 10%)를 줄여서 저장할수 있게 합니다. 
  • 저장된 파일 크기가 작다는 것은 web 환경에서 전송 시간을 줄일수 있어서  웹페이지 로딩 시간을 단축할 수 있습니다.
  • 이를 위해 JPEG 표준과의 완전한 호환성을 유지하고, 인코딩에 많은 시간이 소요되는 방식입니다. 

 

 

 

 

 



:

libjpeg-turbo 에 대해서 알아 보자

개발 2013. 6. 14. 11:57

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

1. jpeg[1]란 무엇인가?

간단히 누구나 알고 있듯이 이미지 압축 형식중 하나인 것이다. 그런데 약자의 뜻도 모르고 있어서 한번 찾아 봤다.

Jpeg = joint photographic coding experts group

JPEG는 컬러 순간 동작(steal) 이미지를 위한 국제적인 압축표준으로 CCITT(Consultatve Committee International Telegraphand Telehpone) ISO에서 정의하고있다. JPEG는 이미지를 작은 블록으로 나누어 많은 양의 이미지 정보를 줄이는 DCT(Discrete Cosine Transformer) 알고리즘에 기초를 두고 있다. 압축률을 늘이기 위해서는 보다 많은 양의 이미지 정보를 지우고, 이에 따라 세세한 부분의 이미지가 줄어들기 때문에 이미지의 질은 낮아진다. 또한 이미지의 질이 낮아진 것을 느끼지 못할 정도까지만 압축시켰을 때 약 25:1의 압축률을 얻는다. 25MB의 이미지를 1MB로 줄일 수 있는 것이다. 비디오를 압축시키는데 사용되기도 한다. 각각의 프레임을 분리된 이미지로서 인트라프레임코딩(Intraframe Coding)이라 불리는 과정을 통해 각 프레임을 따로따로 압축시킨다. 이것은 다시 말해, 사용자가 비디오가 압축된 채로 독립적인 각 프레임을 랜덤 액세스할 수 있음을 나타낸다.

한글로는 정지영상 압축 포맷정도로 부를수 있다.

 

2. libjpeg-turbo[2]는 무엇인가?

Libjpeg-turbo  SIMD 명령( MMX, SSE2, NEON)을 사용해서 빠르게 인코딩/디코딩하는 JPEG 이미지 코덱이다.  SIMD Single Instruction, Multiple Data 로 하나의 명령으로 여러 개의 데이터를 처리하는 명령어 집합이다. 즉 하나의 명령어를 실행하는 동안 같은 오퍼레이션이 병렬로 데이터를 처리하여 속도가 빠른 것이다. 참고로 SSE2[3]2001년 인텔의 펜티엄 4에 처음 포함되었다. 그리고 NEON[4]ARM 프로세서에서 사용하는 SIMD 명령 지원체라고 보면 된다.

, libjpeg-turbo  intel 프로세서와 arm 프로세서에서 모두 동작가능한 빠른 jpeg 코덱인 것이다. 안드로이드에서 주로 사용하는 프로세서가 arm 아키텍쳐 기반이므로 흥미를 가질만 하다. 또한 최근 intel 에서도 모바일 프로세서를 삼성전자에 납품하여 갤럭시 탭 10인치에 시범적으로 사용된다고 하니, 앞으로 intelarm이 양분하는 모바일 프로세서 환경에서 딱 어울리는 녀석이다.

 

3. “libjpeg-turbo” != “TurboJPEG”

이름이 비슷해서 두개를 햇갈려 할 수 있는데 각각 어떻게 탄생하게 되었는지 알아보자

libjpeg-turbo은 기원은 libjpeg에서 속도를빠르게 하기 위한 libjpeg/SIMD 프로젝트서 시작되었다. ( libjpeg v6b, 2009) 현재는 독립된 프로젝트로 진행되면서 산업 표준으로 인정 받고 있다.

TurboJPEG“VirtualGL and TurboVNC” 그룹이 사용하려고 만든 API 이다.

 

4. 속도는 jpeg에 비해서 얼마나 빠를까?

다른 모든 조건이 같은 환경에서 테스트를 했을때, 평균적으로 2~4배 빠르다고 한다.

아래는 libjpeg-turbo 프로젝트 그룹에서 비교한 성능테스트 결과이다. [5]

 

libjpeg-turbo Speedup Relative to Other Codecs, Non-Grayscale Compression/Decompression (1.0 = equal performance)

 

libjpeg-turbo x86-64

libjpeg-turbo x86

 

Compression

Decompression

Compression

Decompression

libjpeg v6b

3.68 - 5.29

2.12 - 3.32

3.40 - 4.75

2.43 - 4.24

libjpeg v8d

3.66 - 5.79

1.95 - 3.85

3.19 - 5.22

2.29 - 4.96

Intel® IPP v7.1

0.922 - 1.21

0.811 - 1.18

0.710 - 1.10

0.650 - 1.26

 

Libjpeg 최신판인 v8d와 비교결과를 보면 평균적으로 2~5배 빠르게 나왔다 인텔의 IPP 와 비교했을때는 비슷하거나 오히려 조금 느리기도 하다. 돈있으면 인텔의 IPP를 사서 쓰는 것도 나쁘지 않을 것 같다. 다만 IPP는 인텔 프로세서에서만 실행된다는 점 !!

 

 

참고

[1] libjpeg : http://www.ijg.org/

[2] libjpeg-turbo : http://libjpeg-turbo.virtualgl.org/

[3] SSE2 : http://ko.wikipedia.org/wiki/SSE2

[4] Introducing NEON : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/index.html

[5] libjpeg-turbo 성능 : http://www.libjpeg-turbo.org/About/Performance

 

 



: