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

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

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数组中写入输出数据的部分代码:

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,还是确实不能这样使用。

你可能感兴趣的:(opencl:一个关于向量赋值的异常)