【问题标题】:Aparapi add sampleAparapi 添加示例
【发布时间】:2013-04-18 11:54:11
【问题描述】:

我正在研究 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)。

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

提前致谢

【问题讨论】:

    标签: macos opencl java-6 aparapi


    【解决方案1】:

    Aparapi 继承了 OpenCL 的“网格样式”实现。当您指定执行范围(例如 1024)时,OpenCL 会将这个“范围”分成大小相等的组。可能是4组256,或者8组128。

    组大小必须是范围的一个因素(因此 assert(range%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 作为第二个参数。

    加里

    【讨论】:

    • 感谢您的回答。我在 Range.create() 中删除了 128,使用 128 的倍数作为“大小”变量,一切正常。您说 Aparapi 在内部选择组大小,这必须是范围的一个因素。那么为什么代码选择 size=999 有效? 999%128=103,但是在 GPU 上执行没有错误。我是否必须始终使用本地大小的倍数?如何发现 localsize 值?非常感谢
    • 只需使用 Range.range(size) 的单 arg 版本。 Aparapi 将为您选择最大的公因数。对于 999,这应该类似于 9*111。您选择控制并强制 Aparapi 将 localsize 128 与 Range.range(X, 128) 工厂方法一起使用。 Aparapi 在这里“尊重”您的请求,但 OpenCL(正确地)在运行时拒绝该请求并且无法执行。请注意,在 MacOSX 上,有各种关于设备 (GPU) 报告不正确组大小的问题的报告。我不确定你是否击中了这个。我有 Mac OSX,你的代码对我来说很好。
    猜你喜欢
    • 2021-04-25
    • 2021-11-20
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多