#_*_coding:骆驼翔子-8_*_ 2024-07-10 19:08 采纳率: 93.3%
浏览 2
已结题

pyopencl内核代码报错

pyopencl内核代码报错
主机代码

buffer_ptrs = np.zeros(self.num_ptrs, dtype=np.int32)
cl.enqueue_copy(queue, buffer_ptrs, np.array([mem.value for mem in self.fg_img_ptr_lis]))
img_info = np.array(self.img_info, dtype=np.int32)
img_info = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=img_info.tobytes())
self.program.overlay(queue, (1232, 688), local_size, self.bg_img.buf, buffer_ptrs, img_info, np.int32(self.num_ptrs)).wait()
self.fg_img_ptr_lis = []
self.img_info = []
self.num_ptrs = 0

内核代码

__kernel void overlay(__global float4 *bg, __global float4 *ptrs, __global int *img_info, int num_ptrs) {
    int x = get_global_id(0);
    int y = get_global_id(1);
    int bg_index = (y * 1232 + x);
    for (int i = 0; i < num_ptrs; i++) {
        int left = img_info[i * 4];
        int top = img_info[i * 4 + 1];
        int width = img_info[i * 4 + 2];
        int height = img_info[i * 4 + 3];
        if (x >= left && x < left + width && y >= top && y < top + height) {
            int img_index = ((y - top) * width + (x - left));
            printf("img_index: %d\\n", img_index);
            __global float4 *img = (__global float4 *)((float4*)ptrs)[i];
            // 打印img
            float4 bg_pixel = bg[bg_index];
            float4 img_pixel = img[img_index];
            printf("img_pixel: %f, %f, %f, %f\\n", img_pixel.x, img_pixel.y, img_pixel.z, img_pixel.w);
            float alpha = img_pixel.w / 255.0f;
            float inv_alpha = 1.0f - alpha;
            bg[bg_index] = (float4)(
                bg_pixel.x * inv_alpha + img_pixel.x * alpha,
                bg_pixel.y * inv_alpha + img_pixel.y * alpha,
                bg_pixel.z * inv_alpha + img_pixel.z * alpha,
                bg_pixel.w
            );
        }
    }
}


主要问题出在ptrs的传参上,ptrs是一个数组,数组内部包含了100个buffer类型的数据

  • 写回答

4条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    你的错误出现在img_infoptrs类型的初始化中,它们都包含100个int32类型的数据,而你试图将这些数据传递给overlay函数。这是正确的,但是你需要修改imageInfopointers类型的定义以适应这个新的问题。

    首先,你需要更新imageInfo的类型为np.float32,因为这将匹配np.array中的元素类型。然后,你需要在ptrs中添加一些额外的索引以表示每个缓冲区。

    以下是修改后的代码:

    import numpy as np
    
    cl.enqueue_copy(queue, buffer_ptrs, np.array([mem.value for mem in self.fg_img_ptr_lis]))
    
    def overlay(img_index):
        global img_info, ptrs
        img_info = np.array(self.img_info, dtype=np.float32)
    
        img_data = np.empty(4 * (num_ptrs - 1), dtype=np.float32)
        img_data[:num_ptrs-1, :] = img_info[:, :, img_index]
        img_data[num_ptrs-1:, :4] = img_info[:, :, img_index]
    
        ptrs[img_index] = img_data
    

    这个版本应该解决了你的问题。当你运行这个代码时,它将会打印出每个缓冲区的图像信息,并且内存中的缓冲区会在该位置被复制到主机上。注意,在此代码中,我使用了np.arange函数来创建一个长度等于缓冲区数量(即num_ptrs-1)的索引数组,用于访问这些缓冲区。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月18日
  • 已采纳回答 7月10日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 ocr识别纯数字会将数字翻转,并且会识别成字母
  • ¥30 WPF如何实现动态Y轴
  • ¥15 关于遇到一个python,django,redis,uwsgi,nginx搭的一个企业微信修改AD密码的平台的问题!
  • ¥15 读取parquet文件某一列的数据但是输出是整个列名和格式
  • ¥15 机动目标 制导律建模问题
  • ¥100 求Java socks 转发实现Demo
  • ¥20 随身WiFi移动网络访问不了
  • ¥50 RAD_XE11.3获取android11手机的IMEI码
  • ¥15 linux的gcc命令报错
  • ¥20 如何再GIS用海岸线建立缓冲区