Imagination IMG GPU下OpenCL缓冲区清除崩溃及跨平台方案咨询
跨平台通用OpenCL缓冲区清除方法问题
我在Intel、NVIDIA和AMD GPU上可通过clEnqueueFillBuffer()成功清除OpenCL缓冲区对象,但在Imagination IMG GPU执行相同操作时程序出现段错误。这可能是驱动漏洞,或是我未满足缓冲区填充的全部条件。
缓冲区分配代码
mem_p32 = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY, p32maxsz, NULL, &err);
缓冲区清除代码
static void clear_p32( int streamnr, int textotal ) { static uint32_t val=0; const size_t sz = textotal * 3 * sizeof(uint32_t); cl_int err; err = clEnqueueFillBuffer(queues[streamnr], mem_p32, &val, 1, 0, sz, 0,0,0); CHECK_CL }
已验证内容
- OpenCL API无专门的清除操作,Fill操作应为正确的清除方式;
- 清除未超出缓冲区大小,即使仅清除1字节也会触发段错误;
- libPVROCL.so无调试符号,gdb无法提供更多信息,gdb会话信息如下:
Thread 2 "testgib" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x3ff427e160 (LWP 15507)] __GI_memset (dstpp=0x3fe8e7e000, c=0, len=<optimized out>) at ./string/memset.c:56 56 ./string/memset.c: No such file or directory. (gdb) where #0 __GI_memset (dstpp=0x3fe8e7e000, c=0, len=<optimized out>) at ./string/memset.c:56 #1 0x0000003ff7aef292 in ?? () from /lib/libPVROCL.so
环境信息
- OpenCL设备:PowerVR B-Series BXM-4-64 Imagination Technologies(1单元,本地内存4KiB,全局内存5015MiB,维度3(512x512x512),最大工作组大小512,支持fp16,对齐1024)
- 操作系统:Debian GNU/Linux 12
- 硬件:Sipeed Pi4A
- 架构:RISCV
- SOC:TH1520
现咨询如何实现可在所有平台通用的OpenCL缓冲区清除方法?
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

