2016-08-24 136 views
0

我开始使用Mozilla Firefox的Nokia WebCL实现。WebCL未填充全局表

我测试我的应用程序在Firefox版本32.0(这是诺基亚绑定实施的版本)。

这是我的代码(为简单起见,并给你看我的问题是我已经简化内核代码到最低):

内核代码:

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

</script> 

我的Javascript代码:

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