前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencl:一个关于向量赋值的异常

opencl:一个关于向量赋值的异常

作者头像
10km
发布2019-05-25 22:37:52
7900
发布2019-05-25 22:37:52
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433758

在项目中,有一个下面这样的数据结构,storage保存是个float4类型的数组。

代码语言:javascript
复制
typedef struct _detected_objects_buffer {
    cl_float4 storage[MAX_DETECTED_OBJECT_NUM];
    cl_int  detected_num;
    kernel_error status;
}detected_objects_buffer;

这个结构对象的指针,在执行kernel函数的时候,会做为__global指针参数传递给kernel.

kernel中会向storage数组中写入输出数据。kernel执行结束后,主机端读取这个结构体的数据。

下面是kernel中向storage数组中写入输出数据的部分代码:

代码语言:javascript
复制
inline void copy_detected_obj_to_host(const __local int4* detected_obj
    , __global detected_objects_buffer* out
    , int object_num    
    , const int win_size
    , const int dist_size
    , const int2 img_size){ 
    ...//其他代码
    float4 obj;
    for(int i=0; i < object_num  ; ++i){
        ...//其他代码
        //向__global指针写入向量数据之方法一:直接赋值    
        out->storage[out->detected_num+i]=obj;
        //向__global指针写入向量数据之方法二:调用vstore函数  
        vstore4( obj ,out->detected_num+i,(__global float*)out->storage);// 
        ...//其他代码
    }   
}

当为detected_objects_buffer创建cl::Buffer时,如果cl_mem_flags设置为CL_MEM_USE_HOST_PTR(即kernel直接使用主机内存地址的数据),则上述kernel代码中方法一会抛出异常。

当为detected_objects_buffer创建cl::Buffer时,如果cl_mem_flags设置为CL_MEM_COPY_HOST_PTR(即将主机数据复制到opencl设备内存),则上述kernel代码中方法一和方法二都能正常执行。

看过opencl的官方原文档,没有找到关于方法一这种直接赋值方式的使用限制说明。

我目前用的opencl驱动是AMD APP SDK,现在不清楚,这是amd驱动的bug,还是确实不能这样使用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档