如果在 OpenCL™主机代码函数 clSetKernelArg() 中使用签名或未签名的长类型,如下所示
未签名长数据 = 1;
clSet KernelArg(内核,0,大小(未签名长)、(void*)&数据);
然后,使用 OpenCL™ 的英特尔® SDK进行编译主机代码时,可能会出现以下错误™。
上下文回溯:参数大小错误
错误:CL_INVALID_ARG_SIZE
位置:主机/src/main.cpp:91
无法设置内核 arg 0
在 OpenCL™ 英特尔® SDK 18.1 之前的版本中未出现此错误™。现在出现这个错误是因为底层内核编译器中未签名的长型的大小从 8 更改为 16,但是主机调用大小(未签名的长)仍返回 8。
已签名/未签名的长类型在 C99 或 OpenCL™版本 1.X 中没有定义的大小,因此允许主机和设备对该类型使用不同的大小。 因此,绝不应将其用作对内核的参数类型。 不一定能够在编译器、设备甚至编译器版本之间便携。 在 OpenCL™ 2.0 规范中,长类型定义为 128 位,但 C99 环境仍然存在。OpenCL™ 规范不添加cl_* 兼容性类型,因此无法将长类型用作安全的扩展参数。
此问题 的建议 解决方法是使用 OpenCL™定义类型,例如主机/设备代码cl_ulong/未签名。
或者,不要使用调用的大小,并强制将长参数的大小强制为 16 字节,如下所示。
clSet KernelArg(内核,0,16,(void*)&数据);