在项目中,有一个下面这样的数据结构,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,还是确实不能这样使用。