This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM62B-P1:AM62x / PowerVR AX-1-16M:clSetKernelArg SIGSEGVS 将一个>4 KB `__Constant`缓冲区绑定到 clCreateProgramWithBinary 加载的内核 (DDK 24.2 和 25.3)

Guru**** 2937240 points

Other Parts Discussed in Thread: SK-AM62B-P1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1650163/sk-am62b-p1-am62x-powervr-axe-1-16m-clsetkernelarg-sigsegvs-binding-a-4-kb-__constant-buffer-to-a-clcreateprogramwithbinary-loaded-kernel-ddk-24-2-and-25-3

器件型号: SK-AM62B-P1

**部件:** SK-AM62B-P1 (AM62B / PowerVR A 系列 AX-1-16M)
** SDK / DDK:*首次在 DDK 24.2.6643903 上观察;**重新确认 DDK 25.3.6908880**(TI 处理器 SDK Linux 12.x) 上仍然存在
*** Tool/IDE:** OpenCL 3.0(内核语言 OpenCL C 1.2)、libPVROCL

这最初是通过 2026年05月16日 上的 TI 电子邮件 (Ghelani / Bhargav / Pothukuchi / Etheridge) 提出的;TI 确认了复制并要求我们在此处发布以进行跟踪。 在 DDK 25.3 上进行了 Re 测试、并显示了错误支架。

##症状

通过`clCreateProgramWithBinary`(使用从同一器件上的`clGetProgramInfo (CL_program_binaries)`捕获的字节)创建程序时、`clSetKernelArg` libPVROCL.so 中的 segfaults` libPVROCL.so `将大于~4KB 的缓冲区绑定到`___constant`参数。 相同的缓冲区在较小时可以干净地绑定、并且可以干净地绑定到同一内核的源代码构建的同级。 以上每个步骤都报告成功:

```μ s
步骤 1:源代码构建正常;捕获的二进制文件
    clCreateProgramWithBinary ERR=0、binary_STATUS=0
    clBuildProgram (link) err=0
步骤 2:绑定 1024 字节__constant buffer
    源代码构建内核 arg 1 err=0
    二进制加载的内核 arg 1 err=0  <-低于阈值、正常
步骤 3:绑定 8192 字节__constant buffer
    源代码构建内核 arg 1 err=0
    二进制加载的内核 arg 1 ... SIGSEGV 内侧 libPVROCL.so
```μ s

##阈值

通过 bisection、触发崩溃的最小`__constant `缓冲区为**4036 字节**(任何≤4035 绑定成功)。 4096−60=一个 4 KB 页减去一个小页脚—与驱动程序具有≤~4 KB 的小恒定内联路径和较大缓冲区的单独路径一致、这些缓冲区查询的是不能通过二进制往返运行的每算法元数据。

## DDK 24.2 与 25.3

相同的碰撞、两者的阈值模式相同。 捕获的二进制大小发生了变化 (24.2→**7109 B 25.3**),即序列化格式在 DDK 之间演变,但缺少的元数据错误没有发生。

##再制作者

单源代码 C++(~120 行、仅限系统 OpenCL 标头)。 六行内核:一个`_全局浮点数*`和一个`__常量浮点数*`参数—无`__本地`m、无屏障、无` ax _ constant_size `re、无` QD_WORK_GROUP_SIZE `。 repro 从源代码构建、捕获二进制文件、重新加载二进制文件、从两个程序创建内核、并在 1KB 和 8KB 下运行并排 arg-bind。

```μ s
g++-std=c++17 repro_binary_constant_arg.cpp -lOpenCL -o repro
./repro
```μ s

(将`repro_binary_constant_arg.cpp`附加到 POST - TI 已通过电子邮件线程提供的同一文件。)

##问题

``→`clGetProgramInfo (CL_program_binaries)` clCreateProgramWithBinary ` round-trip 对于具有 Δ___constant`参数的内核是否受 PowerVR A 系列支持?
` per-arg `_constant address-space 元数据是否应该在二进制序列化中生存,或者在这一代的“>4kB 常量缓冲区“情况下,二进制加载路径是否未被产品化?
3.是否为将来的 DDK 计划修复?

##影响/解决方法

不会阻塞—我们通过`clCreateProgramWithIL`(`cl_KHR_il_program`) 将内核作为 SPIR-V 模块发货、该模块可在 DDK 24.2 和 25.3 上正常运行。 但本机二进制路径本来是我们首选的 OEM 船舶目标、因此将其标记为可能的回归、值得修复。

repro_binary_constant_arg.cpp 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Markus、  

    感谢您针对我们之前的讨论创建一个 e2e 帖子。 我将在获得 IMG 的更新后立即联系我们。  

    此致、

    Shriya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Markus、  

    我们能够在最后重现此问题、并开发了一个解决此问题的修补程序。 测试完成后、我会发送二进制文件。  

    此致、

    Shriya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Markus、  

    下面我提供了可解决 25.3 问题的二进制文件。 如果您有任何其他问题、敬请告知。  

     e2e.ti.com/.../binary_5F00_am62_5F00_linux_5F00_lws_2D00_generic_5F00_release.tar.gz

    此致、

    Shriya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Markus、  

    我想阐明设置、以确保我们位于同一页面。 您能否确认是否使用了 Yocto 或 BuildRoot 进行测试和开发、以及运行的是哪个版本? 对于 Yocto、我们目前支持 glibc 2.39 和 2.43。  

    此致、

    Shriya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shriya:

    谢谢。 要确认设置:它是一个自定义的 BuildRoot—Pioneer 的“Kizuna Linux“、基于 BuildRoot 2023.02、GCC 11.4、glibc 2.36、内核 6.6.44-RT。 不是 Yocto、而不是 TI SDK 默认映像。

    有些上下文可能会有所帮助:基本映像根本没有 GPU 堆栈—没有 DDK 内核模块,没有 PowerVR 用户模式库,没有 OpenCL 加载器。 我们将整个 GPU 堆栈本身添加为 BuildRoot 覆盖层(DDK 25.3/6908880 内核驱动程序+ umlibs、Khronos ICD 加载程序和我们的应用程序库),将它们固定在一起,这样它就可以完全构建在 Pioneer 现有内核树的基础上,而不会对它们进行任何更改。 因此、与 glibc 兼容的 umlibs 可以从您的插槽直接插入到我们的叠加层中—我们的 Pioneer 同事不必触摸他们的工具链或自己重建任何东西。

    这也是基线很重要的原因:glibc 2.36 无法满足 glibc_2.38 符号版本补丁 libs 拉入、而您的 Yocto 基线 (2.39/2.43) 仍然都是较新的、因此针对 Yocto 的重建会碰到相同的墙。 库存 25.3 umlibs 加载良好,因为它们是根据 glibc 2.17 构建的—你能根据相同的~2.17 基线(或任何≤2.36 )生成修补版本吗? 与我们的目标上已有的产品和产品相匹配。

    紧急情况:这是当前的演示(AES 展示)、而不是生产部署、因此我们不会着急。 同时、我们的主机端路径可以正常工作;经过修补的二进制文件会取消阻止更长期的构建选项、而不是任何时间关键型选项。 如果能够帮助您重现环境、我们很乐意分享先锋所使用的构建根/工具链修订版。

    此致、
     Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:Markus、

    目前、我们仅支持 glibc 2.39 和 2.43、这是 SDK 随附的标准版本。

    但是、我们可能会将 GPU 堆栈集成到 BuildRoot 中。 如果客户愿意自己移植所需的 glibc 版本、这是一种可能的解决方案。 请记住、BuildRoot 上当前未启用 GPU 支持、因此需要我们这边进行开发工作 我们将在年内为此提供支持。

    此致、

    Shriya