使用 Imagination IMG GPU 清除 OpenCL 缓冲区

问题描述 投票:0回答:1

我可以在 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 操作是正确的清除方法。
  • 清除时我没有超过缓冲区的大小。事实上,memset 操作在范围的第一个位置上出现段错误。当我仅清除 1 个字节时,它甚至会崩溃。
  • 使用 gdb 提供的信息很少,因为 libPVROCL.so 中没有调试符号,请参见下文。

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

opencl gpgpu
1个回答
0
投票

只是猜测,您正在使用 CL_MEM_READ_WRITE | CL_MEM_HOST_READ_ONLY,这意味着设备可以读取和写入,但主机是只读的,所以当你尝试从主机填充这个缓冲区时,我不知道AMD或Nvidia做了什么,但PowerVR似乎会让你崩溃〜

© www.soinside.com 2019 - 2024. All rights reserved.