文章 ID: 000086479 内容类型: 故障排除 上次审核日期: 2021 年 08 月 27 日

为什么在主机代码中长时间使用 OpenCL™ 内核参数时出现错误"CL_INVALID_ARG_SIZE"?

环境

  • 英特尔® Quartus® Prime 标准版
  • 英特尔® Quartus® Prime Pro Edition
  • 面向 OpenCL™ 专业版的英特尔® FPGA SDK
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    说明

    如果在 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*)&数据);

    相关产品

    本文适用于 1 产品

    英特尔® 可编程设备

    本页面上的内容是原始英文内容的人工翻译与计算机翻译的组合。我们提供此内容是为了您的便利并且仅供参考,未必完整或准确。如果本页面的英文版与翻译版之间存在任何冲突,应以英文版为准。 查看此页面的英语版本。