OpenCL双精度无法正常工作

时间:2016-10-22 14:33:19

标签: opencl gpu precision build-error

所以我有一个项目是我在Mac Pro上使用双数据类型创建的,它完美无缺。现在我将我的项目移动到MacBook Air,它开始给我

Exception
ERROR: clBuildProgram(-11)

错误。现在的原因是我的MacBook Air不支持OpenCL的双精度类型。但恰恰相反,我发现了这一点:Mac OSx上的OpenCL内核错误。我在答案中应用了这个方法:

cl_device_fp_config cfg;
clGetDeviceInfo(devicesIds[0], CL_DEVICE_DOUBLE_FP_CONFIG, sizeof(cfg), &cfg, NULL); // 0 is for the device number I guess?
printf("Double FP config = %llu\n", cfg);

他解释说,如果结果为0,则表示不支持双精度。但我得到了这个结果:

Double FP config = 63

我也尝试过这种方法:

if (!cfg) {
    printf("Double precision not supported \n\n");
} else {
  printf("Following double precision features supported:\n");

  if(cfg & CL_FP_INF_NAN)
      printf("  INF and NaN values\n");

  if(cfg & CL_FP_DENORM)
      printf("  Denormalized numbers\n");

  if(cfg & CL_FP_ROUND_TO_NEAREST)
      printf("  Round To Nearest Even mode\n");

  if(cfg & CL_FP_ROUND_TO_INF)
      printf("  Round To Infinity mode\n");

  if(cfg & CL_FP_ROUND_TO_ZERO)
      printf("  Round To Zero mode\n");

  if(cfg & CL_FP_FMA)
      printf("  Floating-point multiply-and-add operation\n\n");
}

我得到了以下结果:

Double FP config = 63
Following double precision features supported:
  INF and NaN values
  Denormalized numbers
  Round To Nearest Even mode
  Round To Infinity mode
  Round To Zero mode
  Floating-point multiply-and-add operation

这里发生了什么?我的系统是否支持OpenCL的双精度?如果是,我如何启用和使用它?如果没有,我的替代方案是什么? 现在我很困惑。首先,我不知道我的MacBook Air是否支持双精度?显然它没有。但是有了输出,它似乎就是这样。

如果它不支持双精度,那我该怎么办?我应该将项目中的所有内容更改为浮动值吗?或者如果是,那我该如何启用呢?因为我遵循了很多教程和示例,但没有一个能够工作。例如https://streamcomputing.eu/blog/2013-10-17/writing-opencl-code-single-double-precision/但它们似乎都没有效果。

编辑:

1 个答案:

答案 0 :(得分:1)

不幸的是override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() view1.center = self.view.center view2.center = self.view1.center view3.center = self.view2.center } 支持在double中是“可选的”,有些设备支持,有些则不支持... 如果设备支持OpenCL,则设备扩展程序(double)将包含CL_DEVICE_EXTENSIONScl_khr_fp64

当双精度不可用时,有一些示例内核代码here可以使用浮点数。