2016-08-24 12 views
0

Mozilla Firefox 용 Nokia WebCL 구현을 사용하기 시작했습니다.WebCL이 글로벌 테이블을 채우지 않습니다

Firefox 버전 32.0 (Nokia 바인딩이 구현 된 버전)에서 내 애플리케이션을 테스트하고 있습니다.

내 코드입니다 (단순 및 내 문제는 내가 최소 커널 코드를 단순화했습니다 무엇인지를 보여주는) :

커널 코드 :

<script id="julia_set" type="text/x-opencl"> 
__kernel void julia_set(__global int* pix) 
{ 
pix[0]=5; 
} 

</script> 

내 자바 스크립트 코드 :

function loadKernel(id){ 
    var kernelElement = document.getElementById(id); 
    var kernelSource = kernelElement.text; 
    if (kernelElement.src != "") { 
     var mHttpReq = new XMLHttpRequest(); 
     mHttpReq.open("GET", kernelElement.src, false); 
     mHttpReq.send(null); 
     kernelSource = mHttpReq.responseText; 
    } 
    return kernelSource; 
} 
var platforms = webcl.getPlatforms(); 
var width = 2; 
var height = 2; 
var ctx = webcl.createContext(platforms[2],WebCL.DEVICE_TYPE_GPU); 
var length = 4*width*height; 
var bufSize = 4*length; 
var bufferC = ctx.createBuffer (WebCL.MEM_WRITE_ONLY, bufSize); 
var kernelSrc = loadKernel("julia_set"); 
var program = ctx.createProgram(kernelSrc); 
var device = ctx.getInfo(WebCL.CONTEXT_DEVICES)[0]; 
try { 

    program.build ([device], ""); 
} catch(e) { 
    alert ("Failed to build WebCL program. Error " 
     + program.getBuildInfo (device, 
      WebCL.PROGRAM_BUILD_STATUS) 
     + ": " 
     + program.getBuildInfo (device, 
      WebCL.PROGRAM_BUILD_LOG)); 
    throw e; 
} 
var kernel = program.createKernel ("julia_set"); 
kernel.setArg (0, bufferC); 
var cmdQueue = ctx.createCommandQueue (device); 
var local = [16,16]; 
var global = [32,32]; 
cmdQueue.enqueueNDRangeKernel(kernel, 2, null,global, local); 
var outBuffer = new Uint32Array(length); 

cmdQueue.enqueueReadBuffer (bufferC, false, 0, bufSize, outBuffer); 
cmdQueue.finish(); 
console.log(outBuffer); 

내가 상상할 수있는 가장 간단한 OpenCL 응용 프로그램입니다. 내 outBuffer가 0으로 채워지고 첫 번째 요소가 5가 될 것으로 기대하지만 모든 요소는 0입니다. 커널에서 무엇을하려고하든 배열은 변경되지 않은 것처럼 보입니다.

내가 사용하는 장치는 NVidia GeForce GT 750M입니다.

내 코드에서 잘못되었을 수있는 것은 무엇입니까?

+0

모든 요소가 동일한 메모리 주소에 액세스하므로 정의되지 않은 동작이 발생합니다. 첫 번째 스레드에서만 수행하십시오. –

답변

0
if(get_global_id(0)==0 && get_global_id(1)==0) 
    pix[0]=5; 

은 경쟁 조건없이 문제를 해결해야합니다.

+0

슬프게도 도움이되지 않았습니다. 나는 또한 로컬 및 글로벌 작업 그룹을 1의 크기와 동일한 배열로 변경하고 cmdQueue.enqueueNDRangeKernel (kernel, 1, null, global, local)을 변경하려고 시도했습니다. – VisstPL