A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在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)








0 个回复

您需要登录后才可以回帖 登录 | 加入黑马