Aparapi添加样品

时间:2013-04-18 11:54:11

标签: macos opencl java-6 aparapi

我正在研究Aparapi(https://code.google.com/p/aparapi/),其中包含一个样本的奇怪行为。 样本是第一个“添加”。建立和执行它,没关系。如果真的使用了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);

正如Google小组中所建议的那样,但没有任何改变。

我目前正在使用Java 1.6.0_43在Mac OS X 10.8上运行。 Aparapi版本是最新版本(2012-01-23)。

我错过了什么吗?有什么想法吗?

提前致谢

1 个答案:

答案 0 :(得分:4)

Aparapi从OpenCL继承了'Grid Style'的实现。当您指定执行范围(例如1024)时,OpenCL会将此“范围”分成相同大小的组。可能是4组256个,或8组128个。

组大小必须是范围的因子(因此断言(范围%groupSize == 0))。

默认情况下,Aparapi会在内部选择组大小。

但您选择使用

完全指定范围和组大小

范围r = Range.range(n,128)

您有责任确保n%128 == 0。

从错误中,您看起来选择了Range.range(1000,128)。

可悲的是1000%128!= 0所以这个范围会失败。

如果你指定

范围r = Range.range(n)

Aparapi将通过找到n的最高公因子来选择有效的组大小。

尝试删除128作为第二个arg。

加里