访问矢量类型OpenCL

Cas*_*slu 9 vector opencl

我在内核中有一个变量,如:

int16 element;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法在元素中添加第三个int

element[2] 这样我就像写element.s2一样

那我怎么能这样做:

int16 element;
int vector[100] = rand() % 16;

for ( int i=0; i<100; i++ )
   element[ vector[i] ]++;
Run Code Online (Sandbox Code Playgroud)

我的方式是:

int temp[16] = {0};
int16 element;
int vector[100] = rand() % 16;

for ( int i=0; i<100; i++ )
  temp[ vector[i] ]++;


element = (int16)(temp[0],temp[1],temp[2],temp[3],temp[4],temp[5],temp[6],temp[7],temp[8],temp[9],temp[10],temp[11],temp[12],temp[13],temp[14],temp[15]);
Run Code Online (Sandbox Code Playgroud)

我知道这很糟糕,但它有效,;-)

小智 13

好吧还有更脏的方式:),我希望OpenCL提供更好的遍历矢量元素的方法.

这是我的方式.

union
    {
      int  elarray[16];
      int16 elvector;
     } element;

//traverse the elements
for ( i = 0; i < 16; i++)
 element.elarray[i] = temp[vector[i]]++;
Run Code Online (Sandbox Code Playgroud)

Btw rand()函数在OpenCL内核中不可用,你是如何使它工作的?


apl*_*vin 9

AMD 建议以这种方式获取矢量组件:

将掩码数组放入OpenCl常量缓冲区:

cl_uint const_masks[4][4] =
{
    {0xffffffff, 0, 0, 0},
    {0, 0xffffffff, 0, 0},
    {0, 0, 0xffffffff, 0},
    {0, 0, 0, 0xffffffff},
}
Run Code Online (Sandbox Code Playgroud)

在内核里面写这样的东西:

uint getComponent(uint4 a, int index, __constant uint4 * const_masks)
{
    uint b;
    uint4 masked_a = a & const_masks[index];
    b = masked_a.s0 + masked_a.s1 + masked_a.s2 + masked_a.s3;
    return (b);
}

__kernel void foo(…, __constant uint4 * const_masks, …)
{
    uint4 a = ….;
    int index = …;
    uint b = getComponent(a, index, const_masks);
}
Run Code Online (Sandbox Code Playgroud)


小智 8

使用指针是一个非常简单的解决方案

float4 f4 = (float4)(1.0f, 2.0f, 3.0f, 4.0f);

int gid = get_global_id(0);


float *p = &f4;

result[gid]=p[3];
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 2

不,那是不可能的。至少在运行时不是动态的。但是您可以使用“编译时”索引来访问组件:

float4 v;
v.s0 == v.x; // is true
v.s01 == v.xy // also true
Run Code Online (Sandbox Code Playgroud)

请参阅http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf第 6.1.7 节