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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值