我可以在 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
}
如何以适用于所有平台的方式清除缓冲区?
我已验证的事情:
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 系列 BXM-4-64 Imagination Technologies,带 [1 单位] localmem=4KiB globalmem=5015MiB dims=3(512x512x512) max workgrp sz 512 fp16=yalign=1024
操作系统:Debian GNU/Linux 12
硬件:Sipeed Pi4A。
架构:RISCV
SOC:TH1520
只是猜测,您正在使用 CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY,这意味着设备可以读取和写入,但主机是只读的,所以当你尝试从主机填充这个缓冲区时,我不知道AMD或Nvidia做了什么,但PowerVR似乎会让你崩溃〜