0

我开始为 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。

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

4

1 回答 1

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

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

于 2016-08-24T16:57:33.940 回答