WebCL에서 생활 게임을 해요.

13350 단어 OpenCLWebCL
CUDA & OpenCL Advent Calendar 2014의 6일째입니다.
스킬 세트에 HTML5를 넣으면 당연히 Web Audio나 Web CL 같은 걸 사용할 수 있지???-자연계(@mizchi)December 3, 2014
이런 선동을 봤기 때문에 웹씨엘을 만져봤어요
http://webcl.nokiaresearch.com/

따라서 Firefox35가 위에 설치되어 있습니다.Firefox37 Nightly 안돼.

이런 게 있어요.

차리다
어쨌든 먼저 WebCL Tutorial 이 강좌의 코드를 베껴서 분위기를 잡아라.
전날릭스 씨가 WebCL 프로그래밍 시작라고 쓰여 있어서 해설이 생략되었습니다.
OpenCLC 언어OpenCL 1.1 Reference Pages에 대해서 보면서 썼어요.
또한 OpenCL과 GPU는 처음이기 때문에 로컬 작업 사이즈와 글로벌 작업 사이즈에 대해 작업 시스템·작업팀·차원수에 관하여 보도를 봤습니다.
이렇게 하는 게 이거예요.
'WebCL 생명 게임'http://t.co/Ik2lypzlHV#altjsdoit-초기치 민감성(@duxca)pic.twitter.com/Nge5t7zXMT
이 실현 중에
globalWS = [width, height]
cmdQueue.enqueueNDRangeKernel(kernel, globalWS.length, null, globalWS)
위에서 말한 바와 같이 전 세계 업무 항목만 사용하고 현지 업무 항목을 사용하지 않는 차원 2를 실현했다.
그러나 이렇게 해서 2000×2000의 생명 게임이 100보를 이동하려 하였는데, 결과적으로 CPU를 사용하는 것이 GPU보다 빠르다
WebCL의 2000×2000 라이프 게임에서 HD Graphics 4000은 16722ms, Intel(R) Core(TM) i5-3427U [email protected]는 3778msDecember 4, 2014-초기치 민감성(@duxca)http://t.co/XKRyAvrMVA
원인은 내부 핵에서 전 세계 메모리로의 접근인 것 같다.
#altjsdoit 어젯밤에 알츠도트에 넣은 소스인가요?각 작업 항목마다 8차례에 걸쳐 글로벌 메모리를 읽습니다.로컬 메모리는 작업 그룹이 공유하기 때문에 로컬 메모리를 읽고 동기화하며 자신의 위치를 계산하고 쓰는 것이 좋습니다.Yosuke ONOUE (@_likr) December 4, 2014
kernel void cell(global char* vectorIn1,
                 global char* vectorOut,
                 uint   vectorWidth){
  int x = get_global_id(0);
  int y = get_global_id(1);
  int width  = get_global_size(0);
  int height = get_global_size(1);
  int index = width * y + x;
  int xplus  = (x+1 <= width-1  ? x+1 : 0);
  int yplus  = (y+1 <= height-1 ? y+1 : 0);
  int xminus = (0   <= x-1      ? x-1 : width-1);
  int yminus = (0   <= y-1      ? y-1 : height-1);
  int mylife = vectorIn1[width * y + x] > 0;
  //グローバルメモリに9回アクセスしている
  int nears[8] = {
    vectorIn1[width * yplus  + xminus],
    vectorIn1[width * yplus  + x     ],
    vectorIn1[width * yplus  + xplus ],
    vectorIn1[width * y      + xminus],
 // vectorIn1[width * y      + x     ],
    vectorIn1[width * y      + xplus ],
    vectorIn1[width * yminus + xminus],
    vectorIn1[width * yminus + x     ],
    vectorIn1[width * yminus + xplus ]
  };
  int lives = 0;
  for(int i=0; i<8; i++){
    if(nears[i]) lives++;
  }
  if(mylife){
    if(lives == 0 || lives == 1){
      vectorOut[index] = 0;
    }else if(lives == 2 || lives == 3){
      vectorOut[index] = 1;
    }else{
      vectorOut[index] = 0;
    }
  }else{
    if(lives == 3){
      vectorOut[index] = 1;
    }else{
      vectorOut[index] = 0;
    }
  }
}
OpenCL의 메모리 등급화는 방문의 빠른 순서에 따라 다음과 같다.
  • 개인 메모리
  • 로컬 스토리지
  • 연속 스토리지
  • 글로벌 스토리지
  • 호스트 스토리지
  • 전 세계 메모리는 핵이 직접 접근할 수 있는 메모리 중 가장 느리다
    나는 거기에 로컬 메모리를 이용한 프로그램을 쓰고 싶다
    로컬 메모리에서 읽기, 동기화, 계산하고 자신의 위치를 쓰기 위해barrier를 사용하면 됩니다......몰 근처에서 가져왔기 때문에 로컬 메모리의 크기는 작업 그룹 내 항목의 수량과 같지 않습니다. 초기값 민감성(@duxca)@duxca
    GPU 기기에 부착된 코드가 되려는 시도-초기값 민감성(@duxca)December 4, 2014
    21세기 프로그래머가 쓴 프로그램이 아닙니다. 초기값 민감성 (@duxca) December 5, 2014
    이처럼 평소 브라우저에서 부자 프로그래밍을 하는 저로서는 힘든 분야이기 때문에 이번엔 여기까지입니다.
    다음에 로컬 메모리를 사용하여 실현하는 것에 도전합니다
    Advent Calendar의 다음 책임자는 December 5, 2014입니다.

    좋은 웹페이지 즐겨찾기