首页 > 代码库 > OpenCL内核函数支持double和结构体
OpenCL内核函数支持double和结构体
在opencl开发中,有时需要保证精度,需要支持double类型,但是double类型在opencl标准里面不是要求强制实现的,有些设备支持,有些不支持,如果你的设备支持的话,就需要在所有出现在double的最前面声明如下:
#pragma OPENCL EXTENSION cl_khr_fp64: enable
但是这也有一个问题,就是不能保证程序的可移植性,之前在编写地形因子提取算法时,在某些AMD的显卡就不支持。
另外有时候需要支持结构体的话,就只需要定义和主机端一模一样的结构体,然后在CPU传进来就可以了,比如,我上一篇博客中的RPC结构体的信息如下:
typedef struct { //偏移量 double dfLINE_OFF; double dfSAMP_OFF; double dfLAT_OFF; double dfLONG_OFF; double dfHEIGHT_OFF; //缩放比例 double dfLINE_SCALE; double dfSAMP_SCALE; double dfLAT_SCALE; double dfLONG_SCALE; double dfHEIGHT_SCALE; //系数 double adfLINE_NUM_COEFF[20]; double adfLINE_DEN_COEFF[20]; double adfSAMP_NUM_COEFF[20]; double adfSAMP_DEN_COEFF[20]; //最大最小经纬度范围 double dfMIN_LONG; double dfMIN_LAT; double dfMAX_LONG; double dfMAX_LAT; } stRPCInfo;
那么需要再主机端传输结构体参数,具体就是调用clSetKernelArg函数
status = clSetKernelArg(ckKernel,0,sizeof(stRPCInfo),&stInfo);
这样,内核函数中就可以使用double类型和结构体了
__kernel void RPCWarpKernel( struct stRPCInfo RpcInfo, __global double *dbGeoTrans, __global unsigned short* poDataIn, int nWidthIn, int nHeightIn, int nMinRowIn, int nSrcHeight, __global unsigned short* poDataOut, int nWidthOut, int nHeightOut, int nMinRowOut, int nBandCount)
OpenCL内核函数支持double和结构体
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。