모질라는 JavaScript를 GPU의 리소스를 이용하여 과속화 시도를 하고 있습니다.  Firefox의 Jetpack 프로젝트 일원인 Aza Raskin 은 “Elevating JavaScript Performance Through GPU Power” 글을 통해 GPU를 이용한 가속화에 대한 가능성과 방법을 제시하고 있습니다.

1. 고품질의 디지털 동영상이나 음악
2. 복잡한 이미지나 음성인식
3. 자연이나 우주와 관련된 큰 사진 처리
4. 브라우저에서 대용량 로컬 데이터 처리
5. DirectX 또는 OpenGL 을 이용한 DOM 엘리먼트의 복잡한 에니메이션
6. SecondLifeOpenSim Grid와 같은 3차원 탐험
7. 실시간 오디오 및 비디오 편집
8. 브라우저에서 실행되는 통합 개발 환경

또한 이 기술을 통해 JavaScript는 웹 시장에서 더 큰 기대치를 가질 수 있을지 모르겠습니다.

이러한 웹 브라우저의 고급 처리 요구에 부응하기 위해 NVIDIA가 추진하는 GPU를 이용한 병렬 처리 아키텍쳐의 CUDA runtime 환경을 JavaScript에서 사용하는 방법을 검토하고 있다는 것입니다.


GPU 화된 JavaScript

JavaScript확장하는 방법으로 API를 확장하는 방법과 JavaScript 구문을 확장하는 방법 2가지를 제시하고 있습니다. 다음의 소스들은 CPU에서 동일한 계산 sqrFun의 복잡도 및 컬렉션의 크기에 따라 많은 시간이 걸릴 수 있는 가능성을 통해 알아 봅니다.

일반화된 코드이긴 하나 실무에서는 이러한 처리에 추가적으로 CPU의 자바스크립트 해석, 페이지 렌더링, 응용 프로그램에서 운영체제 루틴 등등 기타 잡다한 처리를 동반합니다. 

During all of these CPU cycles, what is the GPU doing?


API 확장
var numbers = new Array(), size = 1000;
for (var i  = 0; i < size; ++i)
numbers[i] = i;

var sqrFun = function(v) { return  v * v; }
for (var i  = 0; i < size; ++i)
numbers[i] = sqrFun(numbers[i]);


Jetpack.toGPU() 를 사용하여 GPU 프로세스를 명시
var resNumbers = Jetpack.toGPU( function(nums, numsSize) {
  var sqrFun = function(v) { return  v * v; }
  for (var i  = 0; i < size; ++i)
    numbers[i] = sqrFun(numbers[i]);
  }, numbers,  size);

// some job here

document.write(resNumbers);

var sqrFun = function(v) { return v * v; }
map(sqrFun, numbers);

Functional
var sqrFun = function(v) { return  v * v; }
map(sqrFun, numbers);

var resNumbers = Jetpack.toGPU(function(nums,  numsSize) {
return  map(sqrFun, numbers);  }, numbers, size);

Microsoft LINQ
var resNumbers = Jetpack.Linq.toGPU().from(numbers).map(sqrFun);

jQuery
$("div.test"). add("p.quote").addClass("blue").slideDown("slow").toGPU();


멀티코어 CPU가 일반화되어 가고 GPU도 iPhone과 같은 모바일을 포함하여 대부분의 장치에 탑재되며 클라우드의 등장으로 분산 처리가 일반적으로 되어 왔으나 현재 JavaScript뿐만 아니라 모든 프로그래밍 언어에서는 병렬처리를 효과적으로 작성하고 실행하는 방법을 모색하고 있습니다.

현재로서는 위의 예시 코드와 달리 일반적으로 프로그래밍을 하면 컴파일러와 인터프리터가 그것 자동으로 최적의 병렬처리 방식으로 처리할 수 있는 이상적인 시스템은 없기 때문에 개발할 때에 어떤 부분을 병렬 처리할지에 대한 선택권은 전적으로 개발자에게 있다는 것입니다.


요약
Jetpack 는 모질라 연구소에서 브라우저와 운영체제 Native API 연결을 통하여 브라우저의 효율과웹의 경험을 극대화 하기 위한 많은 실험과 성과를 내놓고 있습니다.  하지만 우려되는 것은 역시 표준과 동떨어진 기술이 특정 브러우저 밴더의 기술로만 활용된다면 과거의 IE의 히스토리를 그대로 반영하게 되지 않을까 하는 것이다.

하지만 현 시점에서 달리 생각해볼 문제는 HTML5를 포함한 웹 표준 기술들의 진화이다.  웹을 이루는 다양한 요소요소마다 발전된 웹 표준을 위해서 엄청난 실험과 시도들이 표준화에 참여하는 벤더들에 의해서 진행되어오고 있다.

그중 SVG, Canvas, Video, Audio 의 부분은 순수한 웹 기술만으로는 표현은 어떻게든 하겠지만 발전을 보장하지 않을 뿐더러 효율적이지도 못하다는 것이다.  점차적으로 웹에서 처리하는 정보는 하드웨어의 발전과 같이 엄청난 속도로 발전해 오고 있고 고도화 되어오고 있기 때문에 Jetpack과 같은 실험은 분명 빠른 미래에 필요한 기술이 되리라 예측해본다.



함께 읽어보세요.
JavaScript 필수 프로그래밍 언어로 !! - http://rhio.tistory.com/346
JavaScript in 2009 and 2010 - http://rhio.tistory.com/341

참고자료 : http://mozillalabs.com/jetpack/2010/01/25/elevating-javascript-performance-through-gpu-power/


신고
Posted by Rhio.kim