OpenCL内核函数支持double和结构体

在opencl开发中,有时需要保证精度,需要支持double类型,但是double类型在opencl标准里面不是要求强制实现的,有些设备支持,有些不支持,如果你的设备支持的话,就需要在所有出现在double的最前面声明如下:

#pragma OPENCL EXTENSION cl_khr_fp64: enable

但是这也有一个问题,就是不能保证程序的可移植性,之前在编写地形因子提取算法时,在某些AMD的显卡就不支持。

    另外有时候需要支持结构体的话,就只需要定义和主机端一模一样的结构体,然后在CPU传进来就可以了,比如,我上一篇博客中的RPC结构体的信息如下:

[cpp]  view plain copy
  1. typedef struct  
  2. {   
  3.     //偏移量  
  4.     double      dfLINE_OFF;  
  5.     double      dfSAMP_OFF;  
  6.     double      dfLAT_OFF;  
  7.     double      dfLONG_OFF;  
  8.     double      dfHEIGHT_OFF;  
  9.   
  10.     //缩放比例  
  11.     double      dfLINE_SCALE;  
  12.     double      dfSAMP_SCALE;  
  13.     double      dfLAT_SCALE;  
  14.     double      dfLONG_SCALE;  
  15.     double      dfHEIGHT_SCALE;  
  16.   
  17.     //系数  
  18.     double      adfLINE_NUM_COEFF[20];  
  19.     double      adfLINE_DEN_COEFF[20];  
  20.     double      adfSAMP_NUM_COEFF[20];  
  21.     double      adfSAMP_DEN_COEFF[20];  
  22.   
  23.     //最大最小经纬度范围  
  24.     double      dfMIN_LONG;  
  25.     double      dfMIN_LAT;  
  26.     double      dfMAX_LONG;  
  27.     double      dfMAX_LAT;  
  28.   
  29. } stRPCInfo;  

那么需要再主机端传输结构体参数,具体就是调用clSetKernelArg函数

[cpp]  view plain copy
  1. status = clSetKernelArg(ckKernel,0,sizeof(stRPCInfo),&stInfo);  

这样,内核函数中就可以使用double类型和结构体了

[cpp]  view plain copy
  1. __kernel void RPCWarpKernel(  
  2.                               struct stRPCInfo RpcInfo,  
  3.                               __global double *dbGeoTrans,  
  4.                               __global unsigned short* poDataIn,  
  5.                               int nWidthIn,  
  6.                               int nHeightIn,  
  7.                               int nMinRowIn,  
  8.                               int nSrcHeight,  
  9.                               __global unsigned short* poDataOut,  
  10.                               int nWidthOut,  
  11.                               int nHeightOut,  
  12.                               int nMinRowOut,  
  13.                               int nBandCount)  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值