我正在研究Aparapi (https://code.google.com/p/aparapi/),其中一个样本有一个奇怪的行为。示例是第一个"add“。构建并执行它,这是可以的。我还放了下面的代码来测试GPU是否真的被使用了
if(!kernel.getExecutionMode().equals(Kernel.EXECUTION_MODE.GPU)){
System.out.println("Kernel did not execute on the GPU!");
}它工作得很好。但是,如果我尝试将数组的大小从512更改为大于999的数字(例如1000),则会得到以下输出:
!!!!!!! clEnqueueNDRangeKernel() failed invalid work group size
after clEnqueueNDRangeKernel, globalSize[0] = 1000, localSize[0] = 128
Apr 18, 2013 1:31:01 PM com.amd.aparapi.KernelRunner executeOpenCL
WARNING: ### CL exec seems to have failed. Trying to revert to Java ###
JTP
Kernel did not execute on the GPU!下面是我的代码:
final int size = 1000;
final float[] a = new float[size];
final float[] b = new float[size];
for (int i = 0; i < size; i++) {
a[i] = (float)(Math.random()*100);
b[i] = (float)(Math.random()*100);
}
final float[] sum = new float[size];
Kernel kernel = new Kernel(){
@Override public void run() {
int gid = getGlobalId();
sum[gid] = a[gid] + b[gid];
}
};
Range range = Range.create(size);
kernel.execute(range);
System.out.println(kernel.getExecutionMode());
if (!kernel.getExecutionMode().equals(Kernel.EXECUTION_MODE.GPU)){
System.out.println("Kernel did not execute on the GPU!");
}
kernel.dispose();}
我尝试使用以下命令指定大小
Range range = Range.create(size, 128);就像谷歌小组建议的那样,但什么都没有改变。
我目前运行的是MacOSX10.8和Java 1.6.0_43。Aparapi版本是最新版本(2012-01-23)。
我是不是遗漏了什么?有什么想法吗?
提前感谢
发布于 2013-04-20 21:23:32
Aparapi从OpenCL继承了“网格风格”的实现。当你指定一个执行范围(比如1024)时,OpenCL会将这个“范围”分成大小相等的组。可能是4组256或8组128。
组大小必须是范围的因子(因此assert(range%groupSize==0))。
默认情况下,Aparapi在内部选择组大小。
但您选择完全指定要使用的范围和组大小
Range r= Range.range(n,128)
您有责任确保n%128==0。
从错误中,看起来您选择了Range.range(1000,128)。
遗憾的是,1000%128 != 0,因此此范围将失败。
如果您指定
范围r= Range.range(n)
Aparapi将通过找到n的最大公因子来选择有效的组大小。
试着把128作为第二个参数。
加里
https://stackoverflow.com/questions/16082235
复制相似问题