前提:作者所用平台Mac mini Mac OS X version 10.7.5 ,CPU :Intel Core i5-2520, 显卡:ATI Radeon HD 6630M,OpenCL 1.1
处理上述问题的办法就是将0强制转化为float类型:
Mac不会强制的将数据类型转化,只能靠手动将其数据类型强制转化:
例如:如果在options里面包含有潜在的多余空格的话,如下:
当改为:
本文主要是阐述一下在OpenCL开发过程中出现了一些属于Mac平台限制的几个问题:
(1)在赋值时候的强制转化问题
例如:如果在kernel里面含有如下语句
int A = 8;
float f = 0.1;
float ss;
ss = (A>0)? f:0;
此时Mac就会提示:CL_BUILD_PROGRAM_FAILURE处理上述问题的办法就是将0强制转化为float类型:
int A = 8;
float f = 0.1;
float ss;
ss = (A>0)? f : (float)0;
作者遇到的基本上是从int强制转化为char,或者其他非float类型必须强制转化为float类型等。
(2)在运算过程中的强制转化问题
例如:如果在kernel里面含有如下语句
float sum = 0;
int a = 1;
int b = 2;
sum = a * b + sum;
此时Mac同样会提示:CL_BUILD_PROGRAM_FAILUREMac不会强制的将数据类型转化,只能靠手动将其数据类型强制转化:
float sum = 0;
int a = 1;
int b = 2;
sum = (float) a * (float) b + sum;
(3)隐含的空格问题例如:如果在options里面包含有潜在的多余空格的话,如下:
clBuildProgram (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options,
void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data);
如果在clBuildProgram中的options中显示或者有潜在隐含的多余空格的话,就会提示CL_INVAILD_BUILD_OPTIONS,做法是去掉多余空格。
(4)其他
例如:如果在kernel中包含下面代码
#define dst (( dst >> 1 ) & 1)
在开发过程中遇到上述问题,就会提示CL_BUILD_PROGRAM_FAILURE当改为:
#define dst (( dst / 2 ) & 1)
编译通过,具体原因还待进一步考究。