首页 > 代码库 > 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和结构体