访问矢量类型OpenCL

时间:2012-03-20 14:33:15

标签: vector opencl

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

int16 element;

我想知道是否有办法在

元素中添加第三个int

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

那我该怎么办呢:

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

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

我的方式是:

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]);

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

6 个答案:

答案 0 :(得分:13)

那么还有更脏的方法:),我希望OpenCL提供更好的遍历矢量元素的方法。

这是我的方式。

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

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

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

答案 1 :(得分:9)

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

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

cl_uint const_masks[4][4] =
{
    {0xffffffff, 0, 0, 0},
    {0, 0xffffffff, 0, 0},
    {0, 0, 0xffffffff, 0},
    {0, 0, 0, 0xffffffff},
}

在内核中写下这样的东西:

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);
}

答案 2 :(得分: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];

答案 3 :(得分:4)

是可能的,但它不如直接数组访问那么有效。

float index(float4 v, int i) {
    if (i==0) return v.x;
    if (i==1) return v.y;
    if (i==2) return v.z;
    if (i==3) return v.w;
}

但是,当然,如果您需要以这种方式进行分量访问,那么您最好不要使用向量。

答案 4 :(得分:4)

我使用这种解决方法,希望编译器足够智能,看看我的意思(我认为元素访问是标准的一个严重遗漏):

int16 vec;
// access i-th element:
((int*)vec)[i]=...;

答案 5 :(得分:2)

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

float4 v;
v.s0 == v.x; // is true
v.s01 == v.xy // also true

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