OpenCL 读取和修改矢量分量

读取和修改矢量分量的第一步就是我们能够准确地访问矢量分量。OpenCL提供了3种方式来访问矢量分量:数值索引、字母索引和hi/lo/even/odd方式。对于大多数程序,数值索引都是有效的;字母索引对于图像应用更适合。hi/lo/even/odd对同时访问矢量一半分量时很方便。对于3种访问方式,都是通过点(.)方式来访问分量的。

数值索引

通过数值索引,我们可以方便地访问矢量分量,这与我们访问数组中的元素类型类似。OpenCL中矢量数据类型的数值索引大小如下表所示。

矢量数据类型的数值索引

所有的数值索引前面必须加上字母s或S。例子如下:

char16 msg = (char16)('H', 'e', 'l', 'l', 'o', 'P', 'r', 'o',
'g', 'r', 'a', 'm', 'm', 'e', 'r', '!');
msg.s0指示char16的第1个分量,值为'H'
msg.s8指示char16的第9个分量,值为'g'
msg.sc指示char16的第13个分量,值为'm'

上述说明的是访问单个矢量分量,我们也可以同时访问多个矢量元素。例子如下:

char8 e=msg.s01234567,值为'HelloPro'
char f=msg.s54321,值为'Polle'
char8 g=(char8)(msg.sABB,msg.sE9,msg.sE9),值为'ammerer'

除了可以用数值索引来访问矢量分量,我们也可以使用数值索引来修改矢量分量,例子如下:

msg.s5='O',把msg中第6个分量修改为'O'
msg.sB986=(char)('c','C','n','p'),把msg中第12、10、9和7个分量分别修改为'c','C','n','p'



字母索引

除了支持数值类型,对于n小于等于4的矢量,OpenCL还支持字母索引,矢量分量可以表示为〈vector〉.xyzw。下表列出了不同矢量类型可访问的分量。

字母索引

例子如下:

int4 cord=(int4)(1,2,3,4)
cord.x指示int4的第1个分量,值为1
cord.y指示int4的第2个分量,值为2
cord.z指示int4的第3个分量,值为3
cord.w指示int4的第4个分量,值为4

访问超出矢量类型声明的分量范围,会得到错误。下面给出了合法和非法访问矢量分量的一些例子:

float2 pos;
pos.x=1.0f;
pos.w=1.0f;               //不合法,超出了矢量声明的分量范围

可以在点号后面追加多个分量名来选择多个分量,下面给出了几个例子来展示如何选择多个分量:

int4 c;
c.xyzw=(int4)(1,2,3,4);          //c=(1,2,3,4)
c.xy=(int2)(3,4) ;               //c=(3,4,3,4)
c.yw=(int2)(6,7) ;               //c=(3,4,6,7)

需要注意的是:对于数值索引和字母索引,两者不能混用。例如:

float4 f;
float4 A=f.xy34
float4 B=f.s01yw

上述两种用法都是错误的,两种不同的索引方式不能混用。

hi/lo/even/odd

最后一种访问矢量分量方式为使用后缀.hi、.lo、.even和.odd。每个都是访问一半的矢量分量,具体访问的分量如下:

  • hi访问一个给定矢量的高半部分(N/2,N/2+1,…,N-1);

  • lo访问一个给定矢量的低半部分(0,1,…,N/2-1);

  • even访问一个给定矢量的偶数部分;

  • odd访问一个给定矢量的奇数部分;

下面给出一个例子来说明展示如果使用:

int8 data = (int8)(1, 2, 3, 4, 5, 6, 7, 8);
int4 a = data.hi ; //a=(5,6,7,8)
int4 b = data.lo;   //b=(1,2,3,4)
int4 c = data.even; //c=(2,4,6,8)
int4 d = data.odd; //d=(1,3,5,7)

上述三种访问方式都是比较直观的。对于n小于等于4的矢量数据,访问矢量分量可以使用数值和字母索引。对于n大于4的矢量数据,访问矢量分量可以使用数值索引访问。对于hi/lo/even/odd方式,只能访问一些特定的分量。

赞(1)
未经允许不得转载:极客笔记 » OpenCL 读取和修改矢量分量
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址