WebCL不填充全局表

时间:2016-08-24 16:07:50

标签: javascript kernel opencl nokia webcl

我开始在Mozilla Firefox上使用诺基亚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。

我的代码可能有什么问题?

1 个答案:

答案 0 :(得分:0)

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

应该解决问题,没有竞争条件。