WebCL未填充全局表
问题描述:
我开始使用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。
在我的代码中可能有什么错误?
答
if(get_global_id(0)==0 && get_global_id(1)==0)
pix[0]=5;
应该解决问题,没有竞争条件。
+0
可悲的是它没有帮助。我甚至尝试将本地和全局工作组更改为大小等于1的数组,并更改cmdQueue.enqueueNDRangeKernel(kernel,1,null,global,local); – VisstPL
因为所有元素都访问相同的内存地址,从而导致未定义的行为。只通过第一个线程来完成。 –